迭代器和生成器补充

迭代器:

可迭代对象:但凡内置有__iter__方法的都是可迭代对象

d1 = d.__iter__()
d1是个迭代器
d1.__next__() 
取下一个值
可以print出来

迭代器对象:内置有__next__方法的,并且内置有__iter__方法的对象
迭代器对象.__next__() 得到下一个值
迭代器对象.__iter__() 得到迭代器本身

文件是迭代器


生成器:
def func():
    yield 1
    yield 2
    yield 5
g = func()
g 是个生成器,generator,是个迭代器,,,

g.__next__()
运行到第一个yield暂停返回

len('www')   __len__()
next(g)    __next__()
iter(可迭代对象)  __iter__()

x = yield 返回值

while True:
    x = yield None
    print('{}'.format(x))

可以一直next
g = func()

g.send('狗吃骨头')
把变量给了x
g.send(None) 相当于next(g)
把程序运行到yield处,必须先有yield才能send

g = dog('a')
g.send(None) # 先把狗叫过来
g.send('骨头') #然后喂东西
g.send('包子')
...

程序挂起,准备好了就运行,等待着值

g.close()
关闭生成器

不能send两个值,可以传一个列表等
将值给了yield,在传给了x,返回的一直 是 111,
传给x,运行,返回值

三元表达式:res = x if 1 > 2 else y
列表生成式:l = [x for x in l if x.startswith('a')]
字典生成式:dic = {key:None for key in keys}
res = {k:v for k,v in items if k != 'gender'}

res = ()
生成生成器,元组不可变

递推
回溯

从回溯最终结果回溯到最初,再从最初的值递推得出最终的结果

原文地址:https://www.cnblogs.com/zhangjinyi97/p/12570679.html