迭代器 生成器
迭代器的好处:
从容器类型中一个一个的取值,会把所有的值都取到
节省内存空间
yield from
迭代器创建:
1 # 迭代器 2 3 lis = [1, 2, 3] 4 lis_die = lis.__iter__() # 设置迭代器 5 print(lis_die.__next__()) # 用next方法取值 6 print(lis_die.__next__()) 7 print(lis_die.__next__()) 8 9 # 或者写成 print(next(lis_die)) next为内置函数
生成器:
自动实现了迭代器协议。生成器就是可迭代对象。
1 # 生成器函数 2 3 def test(): 4 yield 1 # 这里的yield就相当于return 5 a = test() 6 print(a.__next__()) # 自动实现了迭代器协议,可用next方法 7 8 9 # 生成器表达式 10 egg_list1 = ['鸡蛋%s' %i for i in range(1, 11)] # 列表解析 11 egg_list2 = ['鸡蛋%s' %i for i in range(1, 11) if i > 5] # 列表解析 三元表达式 12 print(egg_list1) 13 print(egg_list2) 14 15 laomuji = ('鸡蛋%s' %i for i in range(1, 11)) # 生成器表达式([]换成()) 16 print(laomuji) 17 print(next(laomuji)) # 同下 18 print(laomuji.__next__()) # 同上 19 print(next(laomuji))
生成器send方法:
1 def content(): 2 print('hello world!') 3 a = yield '执行一' 4 print(a, '结束了', '现在执行第二个函数') 5 yield '执行二' # 最后一个yield不能接收外部的值 6 b = content() 7 print(b.__next__()) # 必须先有这个__next__(),下面的send才生效,不然下面就没法传值. 8 # 最后一个yield不能接收外部的值,因此不再接受send用法。 9 print(b.send('哈哈'))

浙公网安备 33010602011771号