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 相关文章推荐
linux环境下安装pyramid和新建项目的步骤
Nov 27 Python
在Heroku云平台上部署Python的Django框架的教程
Apr 20 Python
Python 安装setuptools和pip工具操作方法(必看)
May 22 Python
Python3.4编程实现简单抓取爬虫功能示例
Sep 14 Python
matplotlib中legend位置调整解析
Dec 19 Python
快速了解Python中的装饰器
Jan 11 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
Aug 20 Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 Python
Python用access判断文件是否被占用的实例方法
Dec 17 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 Python
Python&Matlab实现灰狼优化算法的示例代码
Mar 21 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中for循环语句的几种变型
2007/03/16 PHP
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
php ci框架验证码实例分析
2013/06/26 PHP
PHP实现的简单日历类
2014/11/29 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
Zend Framework数据库操作技巧总结
2017/02/18 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
php实现映射操作实例详解
2019/10/02 PHP
jQuery创建DOM元素实例解析
2015/01/19 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
jQuery+ajax的资源回收处理机制分析
2017/01/07 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
基于Vue生产环境部署详解
2017/09/15 Javascript
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
Javascript地址引用代码实例解析
2020/02/25 Javascript
如何使用RoughViz可视化Vue.js中的草绘图表
2021/01/30 Vue.js
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python实现360皮肤按钮控件示例
2014/02/21 Python
python之wxPython应用实例
2014/09/28 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
想学python 这5本书籍你必看!
2018/12/11 Python
python retrying模块的使用方法详解
2019/09/25 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
获取CSDN文章内容并转换为markdown文本的python
2020/09/06 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
大学生自我鉴定范文
2013/12/28 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
被告答辩状范文
2015/05/22 职场文书