Python 生成器

生成器是一个特殊的迭代器(迭代器的抽象层级更高)。
所以拥有迭代器的特性:

  • 惰性计算数据,节省内存
  • 能够记录状态,并通过next()函数,访问下一个状态
  • 具有可迭代特性

创建方式

生成器表达式

把列表推导式[]修改为()

l = (i for i in range(1, 10000) if i % 2 == 0)
print(next(l))
print(next(l))
print(l.__next__())

2
4
6

生成器函数

函数中包含yield语句,这个函数的执行结果就是生成器。
yield可以去阻断当前的函数执行,使用next()会让函数继续执行,当执行到下一个yield语句时,又会被暂停。

def test():
    print('xxx')
    yield 1
    print('a')

    yield 2
    print('b')

    yield 3
    print('c')

    yield 4
    print('d')

    yield 5
    print('e')

g = test()
print(g)

print(next(g))
print(next(g))
print(next(g))

<generator object test at 0x03A49270>
xxx
1
a
2
b
3

产生数据的方式

生成器具备可迭代特性
for in

send()方法

send方法有一个参数,指定的是上一次被挂起的yield语句的返回值
注意,第一次调用t.send(None)

def test():
    res1 = yield 1
    print(res1)

    res2 = yield 2
    print(res2)


g = test()

# print(g.__next__())
# print(g.__next__())

print(g.send(None))
print(g.send('ooo'))

1
ooo
2

关闭生成器

g.close()
后续如果继续调用,会抛出StopIteration异常提示

def test():
    yield 1
    print('a')
    
    yield 2
    print('b')

    yield 3
    print('c')

g = test()

print(g.__next__())
print(g.__next__())
g.close()
print(g.__next__())

1
a
2
Traceback (most recent call last):
StopIteration

注意

如果碰到return 会直接终止,抛出 StopIteration异常提示
生成器只会遍历一次

def test():
    yield 1
    print('a')
    
    yield 2
    print('b')

    yield 3
    print('c')

    return 10

g = test()

print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

1
a
2
b
3
c
Traceback (most recent call last):
StopIteration: 10

def test():
    yield 1
    print('a')
    
    yield 2
    print('b')

    yield 3
    print('c')

    # return 10

g = test()

for i in g:
    print(i)

print('-' * 30)
for i in g:
    print(i)

1
a
2
b
3
c
------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值