day12 生成器 yield

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容