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 li
li.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 = 0
while a <= n:
li.append(a)
yield a
a += 1
print('li: ',li)
print(gen_2(9))
for i in gen_2(9):
print(i)
# 使用yield关键字就是生成器函数
def test_a():
yield 1
yield 2
yield 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中提供的通过简便的方法写出迭代器的一种手段
包含关系:可迭代对象>迭代器>生成器
