1、生成器和迭代器
迭代器协议:
_iter__()方法返回自身
__next()__返回下一个被迭代值
迭代完毕时抛出StopIteration异常
迭代器对象:实现了迭代器协议的对象,包括被iter函数处理过字符串、列表、元组、字典、集合等
a = range(4)
b = iter(a) # 转成迭代器
print(id(b))
print(id(b.__iter__()))
print(b.__next__()) # 0
print(b.__next__()) # 1
print(b.__next__()) # 2
print(b.__next__()) # 3
print(b.__next__()) # 抛异常
执行结果:
2893130398192
2893130398192
0
1
2
3
Traceback (most recent call last):
File "D:/zl/die.py", line 10, in <module>
print(b.__next__())
StopIteration
#满足协议的类,变为可迭代对象
class A:
i = 0
_i = 0
def __init__(self, i):
self.i = i
def __iter__(self):
return self
def __next__(self):
if self.i == self._i:
raise StopIteration
self._i += 1
return 1
for i in A(4):
print(i)
生成器:在函数中使用yield关键字,则函数的返回值是一个生成器,生成器已经实现了迭代器协议
def kally(i):
_i = 0
yield 1
print(kally) # <function kally at 0x0000015D0A6C61F0>
print(kally(1)) # <generator object kally at 0x0000015D0A818900>
2、上下文管理器
使用with关键字时,自动调用对象的以下方法
__enter__进入时调用
__exit__离开时调用
常见例子:
with open('a.txt') as f :
print(f.read())
优势:因为自动执行,可以省略try/finally语句
实现:
1、在类中重写__enter__和__exit__方法
2、在函数中使用@contextmanager+yield
3、表推导式是什么,有什么用
通过简单的方式创建列表,字典
# 列表推导式
l = []
for i in range(10):
x = i * i
l.append(x)
ll = [i * i for i in range(10)]
print(l)
print(ll)
# 字典推导式
d = {}
for i in range(10):
x = i * i
d[i] = x
dd = {i: i * i for i in range(10)}
print(d)
print(dd)
# 元组没有推导式
cc = (i * i for i in range(10)) # 生成器表达式
4、海象运算符
py3.8的新特性,为变量赋值+返回赋值内容
# 赋值运算没有返回值
print(a := 1)
s = "dfdddf"
if (l := len(s)) > 0:
print(f"{s} s length =={l}")