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使用gensim计算文档相似性
Apr 10 Python
python实现自动登录后台管理系统
Oct 18 Python
python random从集合中随机选择元素的方法
Jan 23 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
pycharm 安装JPype的教程
Aug 08 Python
Python线程条件变量Condition原理解析
Jan 20 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 Python
Python使用xlrd实现读取合并单元格
Jul 09 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 Python
Python list去重且保持原顺序不变的方法
Apr 03 Python
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
Apr 12 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 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使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
JavaScript Cookie的读取和写入函数
2009/12/08 Javascript
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
javascript的回调函数应用示例
2014/02/20 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
Python中类型关系和继承关系实例详解
2015/05/25 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
python反转列表的三种方式解析
2019/11/08 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
python 解决函数返回return的问题
2020/12/05 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
C语言笔试题
2014/09/04 面试题
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
通信工程专业毕业生推荐信
2013/12/25 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
父亲节寄语大全
2015/02/27 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
PyTorch device与cuda.device用法
2022/04/03 Python
设置IIS Express并发数
2022/07/07 Servers