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 10 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
Python 最大概率法进行汉语切分的方法
Dec 14 Python
TensorFlow——Checkpoint为模型添加检查点的实例
Jan 21 Python
python搜索算法原理及实例讲解
Nov 18 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 Python
python 调用Google翻译接口的方法
Dec 09 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
Dec 14 Python
python实现批量移动文件
Apr 05 Python
用Python实现一个打字速度测试工具来测试你的手速
May 28 Python
高考要来啦!用Python爬取历年高考数据并分析
Jun 03 Python
用Python生成会跳舞的美女
Jan 18 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
php 字符串替换的方法
2012/01/10 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
2014/06/26 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
PHP+mysql防止SQL注入的方法小结
2019/04/27 PHP
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
改进:论坛UBB代码自动插入方式
2006/12/22 Javascript
javascript 数组排序函数
2009/08/20 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
php的文件上传入门教程(实例讲解)
2014/04/10 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
Bootstrap 中data-[*] 属性的整理
2018/03/13 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
python不带重复的全排列代码
2013/08/13 Python
Django实现自定义404,500页面教程
2017/03/26 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
python实现壁纸批量下载代码实例
2018/01/25 Python
python找出完数的方法
2018/11/12 Python
简单了解python反射机制的一些知识
2019/07/13 Python
HTML5新增元素如何兼容旧浏览器有哪些方法
2014/05/09 HTML / CSS
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
社会学专业学生职业规划书
2014/02/07 职场文书
中学生运动会入场词
2014/02/12 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
离职证明格式样本
2015/06/12 职场文书
运动会主持人开幕词
2016/03/04 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python