python学习之生成器三者关系
1.生成器 generator
python中一边循环一边计算的机制,叫做生成器
1.1生成器表达式
列表推导式
li = [i*5 for i in range(5)] print(li) gen = (i*5 for i in range(5)) #列表推导式的[]改为()就成了生成器表达式 print(gen) print(next(gen)) print(next(gen)) print(next(gen)) print(next(gen)) print(next(gen))
1.2生成器表达式
python中,使用yield关键字的函数就称之为生成器表达式
yield的作用:
1.类似return,将指定值或多个是返回给调用者
2.yield语句一次返回一个结果,在每个结果中间,挂起函数,执行__next__(),再重新从挂起点继续往下执行
使函数中断,并保存状态
li = [] def test():global lili.append('a')print('li:',li) test() test() 生成器函数 def gen():print("开始了")yield 'a' #返回了一个'a',并暂停函数,在此处挂起,下一次再从此处恢复执行yield 'b'yield 'c' gen_01 = gen() print(gen_01) print(next(gen_01)) print(next(gen_01)) print(next(gen_01))
def gen_2(n):li = []# for i in range(n):# li.append(i)a = 0while a <= n:li.append(a)yield aa += 1print('li: ',li) print(gen_2(9)) for i in gen_2(9):print(i)
# 使用yield关键字就是生成器函数 def test_a():yield 1yield 2yield 3 print(test_a()) ta = test_a() print(next(ta)) #从对象里面取值 print(next(ta)) print(next(ta)) print(next(test_a())) #加括号是调用函数,永远都是<generator object test_a at 0x00000233D5F40F90>的下一个,也就是1 print(next(test_a())) print(next(test_a()))
4.三者关系 可迭代对象只实现了python迭代协议,可以通过for...in...循环遍历的对象,比如list、dict、str...、迭代器、生成器 迭代器: 可以记住自己遍历位置的对象,直观体现就是使用next()函数返回值,迭代器只能往前,不能往后(单向),当遍历完毕后,迭代器会抛出异常StopIteration 生成器:是特殊的迭代器,需要注意一下迭代器不一定是生成器,它是python中提供的通过简便的方法写出迭代器的一种手段 包含关系:可迭代对象>迭代器>生成器