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清除字符串里非字母字符的方法
Jul 02 Python
python数组过滤实现方法
Jul 27 Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
asyncio 的 coroutine对象 与 Future对象使用指南
Sep 11 Python
Python面向对象class类属性及子类用法分析
Feb 02 Python
python3 破解 geetest(极验)的滑块验证码功能
Feb 24 Python
用python实现百度翻译的示例代码
Mar 09 Python
Python实现去除列表中重复元素的方法小结【4种方法】
Apr 27 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
python+pygame实现坦克大战
Sep 10 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操作文件方法问答
2007/03/16 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
2009/08/24 PHP
php通过COM类调用组件的实现代码
2012/01/11 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
js loading加载效果实现代码
2009/11/24 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
浅谈javascript获取元素transform参数
2015/07/24 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
python类:class创建、数据方法属性及访问控制详解
2016/07/25 Python
10个Python小技巧你值得拥有
2018/09/29 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
个人求职信范例
2014/01/29 职场文书
社区平安建设方案
2014/05/25 职场文书
文明城市标语
2014/06/16 职场文书
责任书范本
2014/08/25 职场文书
单位接收函范文
2015/01/30 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
学校团代会开幕词
2016/03/04 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
redis通过6379端口无法连接服务器(redis-server.exe闪退)
2021/05/08 Redis
Golang二维数组的使用方式
2021/05/28 Golang
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android