python代码:生成器
本人的话:原书只写了生成器,没有写生成器表达式。可能是书太古老了。还需要查资料看看生成器表达式,这样有关生成器的知识才算是完整的。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:xiaxiaoyun
@file:test02.py
@time:2022-04-03 21:04
"""
"""
书《Python核心编程(第二版).pdf》,作者:Wesley J. Chun
协同程序是可以运行的独立函数调用,可以暂停或者挂起,并从程序离开的地方继续或者重新开始。在有调用者和(被调用的)协同程序也有通信。
举例来说,当协同程序暂停的时候,我们能从其中获得一个中间的返回值,当调用回到程序中时,能够传入额外或者改变了的参数,但仍能够从我们上次离开的地方继续,并且所有状态完整。
挂起返回出中间值并多次继续的协同程序被称为生成器。
从语法上讲,生成器是一个带yield语句的函数。
一个生成器能暂停执行并返回一个中间的结果(那就是yield语句的功能),返回一个值给调用者并暂停执行。当生成器的__next__()方法被调用的时候,它会准确地从离开地方继续(当它返回[一个值以及]控制给调用者时)。
当到达一个真正的返回或者函数结束没有更多的值返回(当调用__next__()),一个StopIteration异常就会抛出。
Python的for循环有next()调用和对StopIteration的处理。
"""
# # 例子1:一个简单的生成器
# def simpleGen():
# yield 1
# yield '2 --> punch!'
#
# myG = simpleGen()
# print(myG.__next__()) # 1
# print(myG.__next__()) # 2 --> punch!
# print(myG.__next__()) # 程序出错,抛出异常StopIteration
# # ----
# # 例子2:使用for循环
# # Python的for循环有next()调用和对StopIteration的处理。
# def simpleGen():
# yield 1
# yield '2 --> punch!'
#
# for eachItem in simpleGen():
# print(eachItem)
# """
# Output:
# 1
# 2 --> punch!
# """
# # ----
# # 例子3:创建一个带序列并从那个序列中返回一个随机元素的随机迭代器。
# from random import randint
# # 解释:def randint(self, a, b): # Return random integer in range [a, b], including both end points.
#
# def randGen(aList):
# while len(aList) > 0:
# yield aList.pop(randint(0, len(aList) - 1)) # 每个返回的元素将从那个队列中消失,像一个list.pop()和random.choice()的结合的归类。
#
# for item in randGen(['rock', 'paper', 'scissors']):
# print(item)
# """
# Output:
# rock
# scissors
# paper
# """
# # 例子4:生成器在闭包中的运用
# def counter(start_at=0):
# count = start_at
# while True:
# val = (yield count)
# if val is not None:
# count = val
# else:
# count += 1
# """
# 生成器带有一个初始化的值,对每次对生成器__next__()调用以1累加计数。
# 用户也可以选择重置这个值,如果他们非常想要用新的值来调用send()不是调用next()。
# 这个生成器是永远运行的,所以如果你想要终结它,调用close()方法。
# """
# # 调用
# count = counter(5)
# print(count.__next__()) # 5
# print(count.__next__()) # 6
# print(count.send(9)) # 9
# print(count.__next__()) # 10
# count.close()
# print(count.__next__()) # 程序抛出异常StopIteration
# # ----
# ====
|