生成器和生成式

1.生成器

a.概念1
生成器就是迭代器

b.概念2
调用一个带有 yield 关键字的函数就可以得到一个生成器

def func1():
    print('+++')
    print('---')
    if  2 > 3:
        yield

result = func1()
print('result:', result)        # result: <generator object func1 at 0x000001A76E91BAC8>

2.生成器产生数据(生成器中的元素怎么产生)

生成器能生产多少数据就看执行生成器对应的函数的函数体会遇到几次 yield
yield 后面表达式的值就是生成器能够产生的数据

#示例一:创建一个生成器可以产生3个数据分别是:10,100,78

def create_gener1():
    yield 10
    yield 100
    yield 78

gen1 = create_gener1()
print(list(gen1))       # [10, 100, 78]

3.生成器产生数据的原理

当获取生成器元素的时候,会自动调用生成器关联的函数。第一次从函数开始的地方开始执行,直到遇到 yield 位置,并且将 yield 后面的值作为获取到的数据,后面每次都是从上一次结束的位置开始执行,知道遇到 yield 如果从开始执行到函数结束都没遇到 yield 就不会产生数据(如果是用 next 去取的数据这个时候会报错)

def create_gener2():
    for x in range(100, 150):
        yield x

gen2 = create_gener2()
print(f'元素:{next(gen2)}')       # 元素:100

可以不断产生数据

def creat_gener3():
    num = 0
    while True:
        num += 1
        yield num


gen3 = creat_gener3()
#print(next(gen3))

#练习:写一个产生4位验证码的生成器(验证码有随机的4位数字和字母组成)

from random import choices
def code_gener():
    alp = 'abcdefghijklmnopqrstuvwxyz'
    str1 = alp + alp.upper() + '0123456789'
    while True:
        yield ' '.join(choices(str1, k=4))


gen4 = code_gener()
print(next(gen4))

#注意:每次调用函数都是在创建一个新的生成器对象

def create_gender5():
    for x in range(5):
        yield x


print(next(create_gender5()))    # 0
print(next(create_gender5()))    # 0

gen5 = create_gender5()
print(next(gen5))       # 0
print(next(gen5))       # 1

2. 生成式

“”"
生成式就是生成器的简写

列表推导式的[]变成()就变成了生成式
“”"""

list1 = [x*2 for x in range(5)]
print(list1)    # [0, 2, 4, 6, 8]

gen1 = (x*2 for x in range(5))
print(gen1)     # <generator object <genexpr> at 0x103dba050>
print(next(gen1))    # 0
print(next(gen1))    # 2
#gen1 = (x*2 for x in range(5)) 相当于:
def func():
    for x in range(5):
        yield x*2


gen1 = func()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值