python之yield和Generator
2024-09-05 10:35:32
首先我们从一个小程序导入,各定一个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语句。
参考:http://article.yeeyan.org/view/75219/422747
最新文章
- Date.parse
- Python装饰器详解
- 【bzoj1433】 ZJOI2009—假期的宿舍
- http请求过程
- 微信支付PHP SDK —— 公众号支付代码详解
- MongoDB项目中常用方法
- Oracle- 备份单表结构和单表数据
- poj1274 匈牙利算法 二分图最大匹配
- 使用Reveal.app调试整个项目UI时间,增加LD指令 -Objc引起项目中多个静态库冲突问题
- (HYSBZ)BZOJ 1588 营业额统计
- Linux学习之挂载
- 让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET
- sqlserver2012 密码过期问题
- Python随笔--爬虫(下载妹子图片)
- LAB8 android
- Java-Socket实现文件的断点续传
- log4j打印堆栈信息
- python渗透
- centos7 下安装配置python3.6
- Sql Server 关于列名带中括号";[]";的问题