第014篇:三大神器之生成器
2019-11-19 本文已影响0人
yydafx
Python的三大神器:装饰器、迭代器、生成器
1、生成器
1.1、什么是生成器
- 生成器就是迭代器的一种;生成器作为容器保存的不是数据,而是产生数据的算法。
1.2、怎么创建生成器
- 调用带有yield关键字的函数,就可以得到一个生成器。
注意:函数中只要有yield,不管遇不遇到,调用这个函数都不会执行函数体,并且得到的是一个生成器对象
def func1():
print('=====')
print('+++++')
if False:
yield
re = func1()
print(re) # <generator object func1 at 0x00A94DF0> 得到生成器的对象
1.3、生成器怎么产生数据(怎么确定生成器中的元素)
- 一个生成器能够产生多少个数据和那些数据,看执行完生成器关联的函数的函数体会遇到几次yield。遇到几次yield生成器就可以产生多少个数据;每次遇到yield,yield后面的数据就是对应的元素
def func2():
print('===')
yield 10
yield 100
gen1 = func2()
for x in gen1:
print('x:',x)
1.4、生成器产生数据的规律
生成器怎么获取元素:
获取第一个元素的时候从函数的第一条语句开始执行,执行到第一个yield停下来,并且将yield后面的值作为当前获取到的元素;获取下一个元素的时候,接着上次结束的位置往后执行,直到遇到下一个yield为之。并且将yield的后面的值作为当前的元素,以此类推。
如果从执行位置开始到函数结束没有遇到yield就会报StopIteration错误。
def func3():
print('+++++')
yield 1
print('+++++')
yield 2
print('======')
gen2 = func3()
print(next(gen2))
print(gen2.__next__())
# print(gen2.__next__()) # StopIteration
def func4(n):
for _ in range(n):
yield 100
gen3 = func4(4)
print(next(gen3))
for x in gen3:
print('x:', x)
写一个生成器,能够产生一个班所有学生的学号,班级人数自己定,前缀自己定
- eg:121 --> 002 032 --> 01 23
def cls_gen(stu_num, char):
length = len(str(stu_num))
for i in range(1, stu_num+1):
yield char + str(i).zfill(length)
cls_stu = cls_gen(23, 'st')
for stu in cls_stu:
print(stu)
2、生成式
2.1、什么是生成式
- 生成式就是生成器;写法简洁,只有一行代码。
1)语法一:
生成器 = (表达式 for 变量 in 序列)
展开如下:
def 函数名:
for 变量 in 序列:
gen2 = (i for i in range(1, 11))
print(next(gen2))
def great_num():
for num in range(1, 11):
yield num
gen1 = great_num()
gen3 = ('str%d' % i for i in range(5))
print(next(gen3))
2)语法二:
生成器 = (表达式 for 变量 in 序列 if 条件语句)
展开如下:
def 函数名():
for 变量 in 序列:
if 条件语句:
yield 表达式
gen3 = ('str%d' % i for i in range(1, 5) if i & 1)
for i in gen3:
print(i, end=', ') # str1, str3,
print()
3)语法三:
生成器 = (表达式 for 变量1 in 序列1 for 变量2 in 序列2)
展开如下:
for 变量1 in 序列1:
for 变量2 in 序列2:
yield 表达式
gen4 = (x for x in range(0, 10) if x % 2)
for x in gen4:
print(x, end=', ') # 1, 3, 5, 7, 9,
4)列表生成式
- 将上面语法中的所有的小括号变成中括号,结果就会由原来的生成器变成列表
1)语法一:
生成器 = [表达式 for 变量 in 序列)]
展开如下:
def 函数名:
for 变量 in 序列:
yield 表达式