1.什么是生成器
生成器就是迭代器, 但是迭代器不一定是生成器
1)怎么创建生成器
如果函数中有yield关键字,那么这个函数就不再是一个普通的函数。
调用函数不再是执行函数体,获取返回值。而是创建这个函数对应的生成器对象
def nums():
print('============')
print(100)
if False:
yield
return 100
gen1 = nums() # 函数调用表达式nums()才是生成器
2)生成器怎么产生数据
一个生成器能够产生多少个数据,就看执行完生成器对应的函数体会遇到几次yield关键字
生成器是在获取数据的时候才会产生数据,执行生成器对应的函数的函数体,直到遇到yield为止,
将yield后面的数据作为生成器的元素返回,并且会记录这次产生数据函数体结束的位置,下次再产生
数据的时候,会接着上次结束的位置接着往后执行...如果从执行开始到函数结束,没有遇到yield,那么就不会产生数据。
def nums():
print('++++++')
yield 'abc'
print('-------')
yield 100
print('********')
for x in range(5):
yield x
# 创建一个生成器gen2
gen2 = nums()
print('取第一个值')
print(next(gen2))
print('取第二个值')
print(next(gen2))
print('取第三个值')
print(next(gen2))
# 练习: 写一个生产器,能够产生'stuXXXX'的学号, stu0000 ~ stu9999
def stu_num_creater(count, width=0):
for num in range(count):
if width == 0:
width = len(str(count))
num_str = 'stu' + str(num).zfill(width)
yield num_str
creater = stu_num_creater(100, 4)
print(next(creater))
for num in creater:
print(num)
生成式
生产式是生成器的另外一种写法(简写)
a.语法1:
生成器变量 = (表达式 for 变量 in 序列) -- 结果是生成器
列表变量 = [表达式 for 变量 in 序列] -- 结果是列表
b.说明: 表达式 - 可以是值、变量、运算表达式、函数调用表达式等,只要不是赋值语句都可以
c.展开
def 函数名():
for 变量 in 序列:
yield 表达式
gen1 = (x*2 for x in range(5))
print(gen1)
for num in gen1:
print(num)
"""
a.语法2:
生成器变量 = (表达式 for 变量 in 序列 if 条件语句)
b.展开
def 函数名():
for 变量 in 序列:
if 条件语句:
yield 表达式
"""
gen2 = (x for x in range(10) if x % 2)
# 5个 1,3,5,7,9
for num in gen2:
print(num)
gen2 = ((x, x*2) for x in range(10) if x % 2)
for num in gen2:
print(num)
gen2 = ((x, x*2) for x in range(10) if x % 2)
list2 = list(gen2)
print(list2)