麦子学院 2017-03-09 12:25
python之yield和Generator
回复:0 查看:2716
首先我们从一个小程序导入,各定一个list
,找出其中的素数,我们会这样写
import math
def
is_Prims(number):
if number == 2:
return
True
//
除
2
以外的所有偶数都不是素数
elif number % 2 == 0:
return
False
//
如果一个数能被除
1
和本身之外的数整除,则为合数。其实我们的判定范围到根号
n
就可以
for cur
in range(2,int(math.sqrt(number))+1,2):
if number % cur == 0:
return
False
else:
return
True
def
get_Prims(input_list):
result_list = list()
for element
in input_list:
if is_Prims(element):
result_list.append(element)
return result_list
aa = get_Prims([1,2,3,4,5,6,7,8,9])
print (aa)
但如果我们想给定一个数,然后列出比这个数大的所有素数呢?我们可能这样写:
def
get_Prims(number):
if is_Prims(number):
return number
但是一旦return
函数将控制权交给调用者后彻底结束,任何局部变量和函数工作都被丢弃,下一次调用又会从头开始。因此我们就可以用一下写法:
def
get_Prims(number):
while(
True):
if is_Prims(number):
yield number
number += 1
def
get_numbers():
total = list()
for next_prim
in get_Prims(2):
if next_prim < 100:
total.append(next_prim)
else:
print(total)
return
get_numbers()
下面解释一下generator
函数,一个函数的
def
代码里包含了
yield,
函数就自动成为了一个
generator
函数(及时仍包含有
return
),
generator
函数创建
generator
(一种特殊形式的迭代器,这个迭代器有一个内置
__next__()
方法),当需要一个值的时候通过
yield
来产生而不是直接
return
,因此与一般函数不同的是,此时控制权并未交出。
for
循环会隐式的调用
next()
函数,
next()
函数负责调用
generator
中的
__next__()
方法,此时
generator
负责返回一个值给任何调用
next()
的方法,利用
yield
将此值传回去,相当于
return
语句。
来源:
博客园