迭代器 生成器

迭代器的好处:

  从容器类型中一个一个的取值,会把所有的值都取到

  节省内存空间

 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('哈哈'))

 

posted @ 2018-07-05 14:08  宝露  阅读(93)  评论(0)    收藏  举报