Python生成器generator用法示例


Posted in Python onAugust 10, 2018

本文实例分析了Python生成器generator用法。分享给大家供大家参考,具体如下:

生成器generator本质是一个函数,它记住上一次在函数体中的位置,在生成器函数下一次调用,会自动找到该位置,局部变量都保持不变

l = [x * 2 for x in range(10)] # 列表生成式
g = (x * 2 for x in range(10))
print(l,g) # l打印的是一个列表,g则是一个generator的内存地址

一次性打印获取generator的所有元素:

for index in g:
  print(index)

逐步获取generator的元素:

print(g.__next__())   # 0
print(g.__next__())   # 2
print(g.__next__())   # 4
print(g.__next__())   # 6
print(g.__next__())   # 8

yield关键字

通常我们做一个打印0-50的数时,会定义一个函数,只要调用这个函数,它就会自定打印0-50的数

def fib(num):
  n = 0
  while n < num:
    print(n)
    n+=1
fib(50)

其实我们只需要改动那么一丢丢,就可以将上面那个函数改变成一个generator

def fib(num):
  n = 0
  while n < num:
    yield n   # 在使用yield关键字时,需在前面先定义一个变量n
    n+=1
g = fib(50)   # 此时的g是一个generator

generator原理:通过某一种特定的算法,在一个特定的条件下,不断向下推算,得出后续的元素。因为generator不必创建list,所以可以大大的节约内存空间。举个栗子:

def fib():
  print("step 1")
  yield 1
  print("step 2")
  yield 2
  print("step 3")
  yield 3
g = fib()
g.__next__()  # 结果:step 1
g.__next__()  # 结果:step 2
g.__next__()  # 结果:step 3

根据结果可以看出,每次执行next(),都会打印一句,而遇到yield就直接跳出,并记录位置,再次执行next()时,会从记录的那个位置开始往下执行,再次遇到yield时跳出。

此时我们不经会想,如果我们不断的调用next(),该如何判断是否已经完毕,如果越界了,是否会报错?

# -* coding:utf-8 -*-
#! python3
'''
Created on 2018年8月10日

@author: Administrator
'''
def fib(num):
  n = 0
  while n < num :
    yield n
    n+=1
g = fib(10)
while True:
  print(g.__next__())

执行结果:

Python生成器generator用法示例

可以看出当遍历完毕之后,如果在此调用next()将会报错,我们是无法获取到遍历的下标的,那么我们该如何规避这个错误呢?对next()抛异常处理

def fib(num):
  n = 0
  while n < num :
    yield n
    n+=1
g = fib(10)
while True:
  try:
    print(g.__next__())
  except StopIteration:
    print("已经完毕")
    break

此时将不再报错,当越界的时候,系统会自动捕捉该异常,并且打印你想要输出的信息

send方法

在单线程下实现一个简单的并行效果

# -*- coding:utf-8 -*-
#! python3
'''
Created on 2018年8月10日

@author: Administrator
'''
import time
def startEat(name):
  print("%s准备开始吃包子了"%name)
  while True:
    b = yield
    print("%s被%s吃了"%(b,name))
def startMake():
  laowang = startEat("laowang")
  laowang.__next__()
  for index in range(10):
    time.sleep(1)
    print("已经做好了包子%d号"%index)
    laowang.send("包子%d号"%index)
startMake()

执行结果:

Python生成器generator用法示例

更多关于Python相关内容可查看本站专题:《Python列表(list)操作技巧总结》、《Python字符串操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中的filter()函数的用法
Apr 27 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
Python3 适合初学者学习的银行账户登录系统实例
Aug 08 Python
浅谈Python2获取中文文件名的编码问题
Jan 09 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
pandas的qcut()方法详解
Jul 06 Python
Python爬虫学习之翻译小程序
Jul 30 Python
使用selenium和pyquery爬取京东商品列表过程解析
Aug 15 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
python 实现按对象传值
Dec 26 Python
详解Python中的路径问题
Sep 02 Python
python中round函数保留两位小数的方法
Dec 04 Python
python 字典修改键(key)的几种方法
Aug 10 #Python
详解python 注释、变量、类型
Aug 10 #Python
python文件操作之批量修改文件后缀名的方法
Aug 10 #Python
Random 在 Python 中的使用方法
Aug 09 #Python
Python中函数参数调用方式分析
Aug 09 #Python
Python动态生成多维数组的方法示例
Aug 09 #Python
Python爬虫之正则表达式基本用法实例分析
Aug 08 #Python
You might like
第十三节 对象串行化 [13]
2006/10/09 PHP
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
PHP的类 功能齐全的发送邮件类
2006/10/09 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
PHP递归算法的简单实例
2019/02/28 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
2019/10/11 PHP
Jquery常用技巧收集整理篇
2010/11/14 Javascript
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
2015/01/19 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
AngularJS双向绑定和依赖反转实例详解
2017/04/15 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
Python中字符串的修改及传参详解
2016/11/30 Python
Python排序算法实例代码
2017/08/10 Python
python如何为创建大量实例节省内存
2018/03/20 Python
python tkinter界面居中显示的方法
2018/10/11 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
临床医师专业个人自我评价
2014/01/08 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
运动会跳远广播稿
2015/08/19 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers