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抓taobao图片爬虫
Oct 26 Python
python实现在控制台输入密码不显示的方法
Jul 02 Python
Python通过正则表达式选取callback的方法
Jul 18 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
Jan 20 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
python算法与数据结构之单链表的实现代码
Jun 27 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
python 实现表情识别
Nov 21 Python
教你用Python爬取英雄联盟皮肤原画
Jun 13 Python
Python OpenCV超详细讲解基本功能
Apr 02 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
什么是MVC,好东西啊
2007/05/03 PHP
php中socket的用法详解
2014/10/24 PHP
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
在vue-cli脚手架中配置一个vue-router前端路由
2017/07/03 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
2019/11/07 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
Python 爬虫图片简单实现
2017/06/01 Python
Python学习小技巧总结
2018/06/10 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
windows下Python安装、使用教程和Notepad++的使用教程
2019/10/06 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
Shell编程面试题
2012/05/30 面试题
涉外文秘个人求职的自我评价
2013/10/07 职场文书
土地转让协议书范本
2014/04/15 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
欠款纠纷起诉状
2015/05/19 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers