Python生成器

Python生成器是一种特殊的迭代器,通过yield语句实现函数的暂停和恢复。生成器可以在每次迭代时返回一个中间结果,并在下次迭代时从暂停的地方继续执行。使用for循环与生成器配合,可以简洁地处理序列数据。此外,还可以通过next()、send()、抛出异常以及close()方法与生成器交互,实现更复杂的功能,如改变生成器的执行流程或释放资源。
摘要由CSDN通过智能技术生成

从句法上讲,生成器是一个带yield 语句的函数。一个函数或者子程序只返回一次,但一个生成器能暂停执行并返回一个中间的结果——那就是yield 语句的功能, 返回一个值给调用者并暂停执行。当生成器的next()方法被调用的时候,它会准确地从离开地方继续。当到达一个真正的返回或者函数结束没有更多的值返回(当调用next()),一个StopIteration 异常就会抛出。简单的生成器:

def simple_gen():
        yield 1
        yield '2 --> punch!'

调用:

>>> myG = simple_gen()
>>> myG.next()
1
>>> myG.next()
'2 --> punch!'
>>> myG.next()
Traceback (most recent call last):
File "", line 1, in ?
myG.next() StopIteration

由于python 的for 循环有next()调用和对StopIteration 的处理,使用一个for 循环而不是手动迭代穿过一个生成器(或者那种事物的迭代器)总是要简洁漂亮得多:

>>> for eachItem in simple_gen():
... print eachItem
...
1
'2 --> punch!'

下面的例子,将要创建一个带序列并从那个序列中返回一个随机元素的随机迭代器,每个返回的元素将从那个队列中消失,像一个list.pop()和random.choice()的结合的归类:

from random import randint
def rand_gen(aList):
    while len(aList) > 0:
        yield aList.pop(randint(0, len(aList)))

调用:

>>> for item in rand_gen(['rock', 'paper', 'scissors']):
... print item
...
scissors
rock
paper

除了next()来获得下个生成的值,用户可以将值回送给生成器[send()],在生成器中抛出异常,以及要求生成器退出[close()]

def counter(start_at=0):
        count = start_at
        while True:
            val = (yield count)
            if val is not None:
                print 'reset here'
                count = val
            else:
                count += 1
                if count == 4:
                    raise Exception('aha')

send调用:

count = counter(5)
print count.next()
print count.next()
count.send(9)
print count.next()

输出:

5
6
reset here
10

close调用:

count = counter(5)
print count.next()
print count.next()
count.close()
count.next()  # raise StopIteration here

输出:

5
6
Traceback (most recent call last):
  File "/home/zhangjun/workspace/try/src/try.py", line 16, in <module>
    count.next()  # raise StopIteration here
StopIteration

抛出异常调用:

count = counter(3)
print count.next()
print count.next()# raise Exception here

输出:

3
Traceback (most recent call last):
  File "/home/zhangjun/workspace/try/src/try.py", line 14, in <module>
    print count.next()# raise Exception here
  File "/home/zhangjun/workspace/try/src/try.py", line 11, in counter
    raise Exception('aha')
Exception: aha
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值