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实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 Python
python切片及sys.argv[]用法详解
May 25 Python
tensorflow 打印内存中的变量方法
Jul 30 Python
python检测IP地址变化并触发事件
Dec 26 Python
利用Python+阿里云实现DDNS动态域名解析的方法
Apr 01 Python
python 一篇文章搞懂装饰器所有用法(建议收藏)
Aug 23 Python
Python模块的定义,模块的导入,__name__用法实例分析
Jan 07 Python
tensorflow图像裁剪进行数据增强操作
Jun 30 Python
Python如何输出警告信息
Jul 30 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
python多线程爬取西刺代理的示例代码
Jan 30 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 面向对象实现代码
2009/11/11 PHP
PHP验证码函数代码(简单实用)
2013/09/29 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
javascript 常用方法总结
2009/06/03 Javascript
js加强的经典分页实例
2013/03/15 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
两种简单的跨域方法(jsonp、php)
2017/01/02 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
Python 利用pydub库操作音频文件的方法
2019/01/09 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
详解python算法常用技巧与内置库
2020/10/17 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
Ellesse英国官网:意大利高级运动品牌
2019/07/23 全球购物
年度考核自我鉴定
2013/11/09 职场文书
大学自主招生推荐信
2014/05/10 职场文书
学校节能减排倡议书
2014/05/16 职场文书
供用电专业求职信
2014/07/07 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
村委会贫困证明范文
2014/09/21 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS