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实现封装得到virustotal扫描结果
Oct 05 Python
Python中的index()方法使用教程
May 18 Python
python timestamp和datetime之间转换详解
Dec 11 Python
1 行 Python 代码快速实现 FTP 服务器
Jan 25 Python
python创建文件备份的脚本
Sep 11 Python
对IPython交互模式下的退出方法详解
Feb 16 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
Python的形参和实参使用方式
Dec 24 Python
Tensorflow Summary用法学习笔记
Jan 10 Python
python opencv 实现读取、显示、写入图像的方法
Jun 08 Python
解决pytorch 保存模型遇到的问题
Mar 03 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 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
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
canvas绘制万花筒效果(代码分享)
2017/01/20 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
使用JSON格式提交数据到服务端的实例代码
2018/04/01 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
Python 正则表达式的高级用法
2016/12/04 Python
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
Python命令行解析模块详解
2018/02/01 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
Python Web版语音合成实例详解
2019/07/16 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
Macbook安装Python最新版本、GUI开发环境、图像处理、视频处理环境详解
2020/02/17 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
销售自荐信
2013/10/22 职场文书
精通CAD能手自荐书
2014/01/31 职场文书
2015年女职工工作总结
2015/05/15 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
详解Python魔法方法之描述符类
2021/05/26 Python
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers