生成器、迭代器

来源:互联网 发布:javascript的continue 编辑:程序博客网 时间:2024/05/20 16:33

一、生成器generator

1、生成器的创建方式
①(x**2 for x in range(10)) ②通过yield关键字创建
举例:

a = (x**2 for x in range(10))print(a)    #<generator object <genexpr> at 0x0000026F6DA1E1A8>
def foo():    print('hello')    yield 1        #yield相当于return的作用print(foo)   #<function foo at 0x000001C8452AE7B8>b = foo()print(b)   #<generator object foo at 0x000002093A79E258>

备注:
如果只是print(foo),还是个函数,但是后面一加括号以后就变成了一个生成器

2、调用方式 ( next() 或者 _next_() 或者 通过for循环 )
这里写图片描述

这里写图片描述

备注:for循环后面跟的是可迭代对象

3、可迭代对象
拥有inter方法的对象称为可迭代对象(列表,字典,元组,集合,字符串,生成器,迭代器等)

a = [1,2,3,4]print(a.__iter__())  #<list_iterator object at 0x000002288CAAD4A8>b = (1,2,3,4)print(b.__iter__())  #<tuple_iterator object at 0x00000229D9AFD7F0>c = {'name':'tom'}print(c.__iter__())  #<dict_keyiterator object at 0x00000229D9B1CEF8>

备注:_iter_() 方法等同于iter()
四、斐波那契序列

def fib(max):    n,before,after = 0,0,1    while n < max:        print(after)        #yeild after   #如果把print改成yeild,就变成了一个生成器        before,after = after ,before + after        n += 1

五、send方法
send可以往函数里面传值,如果第一次没有next,只能传一个send(None),

def f():    print('hello1')    count = yield    print(count)    print('hello2')    yield 1a=f()a.send(None)   #相当于next(a)res = a.send('tom')print(res)   #这个值是1

备注:先返回后传值

六、通过yield实现并发效果

import timedef consumer(name):    print("%s 准备吃包子啦!" %name)    while True:       baozi = yield       print("包子[%s]来了,被[%s]吃了!" %(baozi,name))def producer(name):    c1 = consumer('A')    c2 = consumer('B')    next(c1)    next(c2)    print("%s开始准备做包子啦!" % name)    for i in range(10):        time.sleep(1)        print("做了2个包子!")        c1.send(i)        c2.send(i)producer("tom")

二、迭代器iterator

生成器都是迭代器,但是迭代器不一定都是生成器,判断一个对象是否是迭代器对象,一是要有iter方法,而是由next方法

a = [1,2,3,4]d= iter(a)print(d)print(next(d))print(next(d))print(next(d))print(next(d))

for循环帮忙做的三件事:
①调用可迭代对象的iter方法返回一个迭代器对象
②不断调用迭代器对象的next方法
③处理异常

补充内容:
1、匿名函数
匿名函数命名规格,用lambda关键字标识,冒号(:)左侧表示函数接收的参数(a,b),冒号(:)右侧表示函数的返回值

res = lambda a,b:a+bprint(res(2,3))    #5

2、列表生成式

a = [x**2 for x in range(10)]print(a)  #[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
原创粉丝点击