python之yield和Generator深入解析


Posted in Python onSeptember 18, 2019

首先我们从一个小程序导入,各定一个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语句。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
python实现多线程的方式及多条命令并发执行
Jun 07 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
Python使用arrow库优雅地处理时间数据详解
Oct 10 Python
Python3 伪装浏览器的方法示例
Nov 23 Python
深入了解Python中pop和remove的使用方法
Jan 09 Python
Python----数据预处理代码实例
Mar 20 Python
远程部署工具Fabric详解(支持Python3)
Jul 04 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
python3 中使用urllib问题以及urllib详解
Aug 03 Python
PyTorch预训练的实现
Sep 18 #Python
用python实现英文字母和相应序数转换的方法
Sep 18 #Python
Django模板导入母版继承和自定义返回Html片段过程解析
Sep 18 #Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
Sep 18 #Python
python rsa实现数据加密和解密、签名加密和验签功能
Sep 18 #Python
决策树剪枝算法的python实现方法详解
Sep 18 #Python
python生成requirements.txt的两种方法
Sep 18 #Python
You might like
PHP脚本的10个技巧(7)
2006/10/09 PHP
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
Jquery颜色选择器ColorPicker实现代码
2012/11/14 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
js的OOP继承实现(必看篇)
2017/02/18 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
Python实现八大排序算法
2016/08/13 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
2020/03/14 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
生产主管岗位职责
2013/11/10 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
新学期决心书
2014/03/11 职场文书
团队精神口号
2014/06/06 职场文书
新书发布会策划方案
2014/06/09 职场文书
初中教师个人总结
2015/02/10 职场文书
质量承诺书格式范文
2015/04/28 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
MySQL七种JOIN类型小结
2021/10/24 MySQL