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实现ftp客户端示例分享
Feb 17 Python
python之import机制详解
Jul 03 Python
python列表操作之extend和append的区别实例分析
Jul 28 Python
Windows下python2.7.8安装图文教程
May 26 Python
python解决方案:WindowsError: [Error 2]
Aug 28 Python
浅谈python中的变量默认是什么类型
Sep 11 Python
如何使用Python进行OCR识别图片中的文字
Apr 01 Python
使用python实现简单五子棋游戏
Jun 18 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
python的faker库用法
Nov 28 Python
Python sublime安装及配置过程详解
Jun 29 Python
Python入门之使用pandas分析excel数据
May 12 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
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
php缓存技术详细总结
2013/08/07 PHP
php查看当前Session的ID实例
2015/03/16 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
2017/04/04 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
javascript concat数组累加 示例
2009/09/03 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
js单词形式的运算符
2014/05/06 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
javascript生成大小写字母
2015/07/03 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
JS+html5实现异步上传图片显示上传文件进度条功能示例
2019/11/09 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
python编程实现希尔排序
2017/04/13 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
Python图片的横坐标汉字实例
2019/12/04 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
pandas 数据类型转换的实现
2020/12/29 Python
毕业生的求职信范文分享
2013/12/04 职场文书
竞争上岗实施方案
2014/03/21 职场文书
社区矫正工作方案
2014/06/04 职场文书
银行求职自荐书
2014/06/25 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
院系推荐意见
2015/06/05 职场文书
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL