python三个必知知识点

  • +、+=、extend()之间的区别与应用场景

首先看测试用例:

复制代码
 1 # 创建一个序列类型的对象
 2 my_list = [1, 2, 3]
 3 # 将现有的序列合并到my_list
 4 extend_my_list = my_list + [4, 5]
 5 
 6 print(extend_my_list) # [1, 2, 3, 4, 5]
 7 # 将一个元组合并到这个序列
 8 extend_my_list = my_list + (6, 7)
 9 # 抛出异常 TypeError: can only concatenate list (not "tuple") to list
10 print(extend_my_list)
11 
12 # 使用另一种方式合并
13 extend_my_list += (6, 7)
14 print(extend_my_list) # [1, 2, 3, 4, 5, 6, 7]
15 
16 # 使用extend()函数进行合并
17 
18 extend_my_list.extend((7, 8))
19 print(extend_my_list) # [1, 2, 3, 4, 5, 6, 7, 7, 8]
复制代码

由源代码片段可知:

复制代码
 1 class MutableSequence(Sequence):
 2 
 3     __slots__ = ()
 4 
 5     """All the operations on a read-write sequence.
 6 
 7     Concrete subclasses must provide __new__ or __init__,
 8     __getitem__, __setitem__, __delitem__, __len__, and insert().
 9 
10     """
11     # extend()方法内部使用for循环来append()元素,它接收一个可迭代序列
12     def extend(self, values):
13         'S.extend(iterable) -- extend sequence by appending elements from the iterable'
14         for v in values:
15             self.append(v)
16     # 调用 += 运算的时候就是调用该函数,这个函数内部调用extend()方法
17     def __iadd__(self, values):
18         self.extend(values)
19         return self​
复制代码
  • python列表推导式

列表生成式要比操作列表效率高很多,但是列表生成式的滥用会导致代码可读性降低,并且列表生成式可以替换map()和reduce()函数。

复制代码
 1 # 构建列表
 2 my_list = [x for x in range(9)]
 3 print(my_list) # [0, 1, 2, 3, 4, 5, 6, 7, 8]
 4 # 构建0-8中为偶数的列表
 5 my_list = [x for x in range(9) if(x%2==0)]
 6 print(my_list) # [0, 2, 4, 6, 8]
 7 # 构建0-8为奇数的列表,并将每个数字做平方运算
 8 def function(number):
 9 return number * number
10 my_list = [function(x) for x in range(9) if x%2!=0]
11 print(my_list) # [1, 9, 25, 49]
复制代码

生成器表达式
生成器表达式就是把列表表达式的中括号变成小括号。

1 # 构造一个生成器
2 gen = (i for i in range(9))
3 # 生成器可以被遍历
4 for i in gen:
5 print(i)

生成器可以使用list()函数转换为列表:

复制代码
 1 # 将生成器转换为列表
 2 li = list(gen)
 3 print(li)
 4 字典推导式
 5 d = {
 6 'tom': 18,
 7 'alice': 16,
 8 'bob': 20,
 9 }
10 dict = {key: value for key, value in d.items()}
11 print(dict) # {'tom': 18, 'alice': 16, 'bob': 20}
12 ```
13 Set集合推导式
14 ```
15 my_set = {i for i in range(9)}
16 print(my_set) # {0, 1, 2, 3, 4, 5, 6, 7, 8}
复制代码
  • python上下文管理器with语句与contextlib简化上下文管理器with语句与contextlib简化
    普通的异常捕获机制:
1 try:
2 pass
3 except Exception as err:
4 pass
5 else:
6 pass
7 finally:
8 pass

with简化了异常捕获写法:

复制代码
 1 class Demo(object):
 2 
 3 def __enter__(self):
 4 print("enter...")
 5 return self
 6 
 7 def __exit__(self, exc_type, exc_val, exc_tb):
 8 print("exit...")
 9 
10 def echo_hello(self):
11 print("Hello, Hello...")
12 
13 with Demo() as d:
14 d.echo_hello()
15 
16 # enter...
17 # Hello, Hello...
18 # exit...
复制代码

 

复制代码
 1 import contextlib
 2 
 3 # 使用装饰器
 4 @contextlib.contextmanager
 5 def file_open(file_name):
 6 # 此处写__enter___函数中定义的代码
 7 print("enter function code...")
 8 yield {}
 9 # 此处写__exit__函数中定义的代码
10 print("exit function code...")
11 
12 with file_open("json.json") as f:
13 pass
14 
15 # enter function code...
16 # exit function code...​
复制代码

 

请使用手机"扫一扫"x

posted @ 2018-12-28 11:02  24小时编程自习室  阅读(305)  评论(0)    收藏  举报
编辑推荐:
· DbContext是如何识别出实体集合的
· 一次 .NET 性能优化之旅:将 GC 压力降低 99%
· MySQL索引完全指南:让你的查询速度飞起来
· 一个字符串替换引发的性能血案:正则回溯与救赎之路
· 为什么说方法的参数最好不要超过4个?
阅读排行:
· 一次 .NET 性能优化之旅:将 GC 压力降低 99%
· 32岁入行STM32迟吗?
· C#.Net筑基-泛型T & 协变逆变
· 花150元,我用 AI 做出了千万播放的爆款视频!保姆级教程+完整提示词
· 【EF Core】DbContext是如何识别出实体集合的
点击右上角即可分享
微信分享提示