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 Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
Python将文本去空格并保存到txt文件中的实例
Jul 24 Python
Django中使用Celery的方法示例
Nov 29 Python
python字典排序的方法
Oct 12 Python
python使用ctypes调用扩展模块的实例方法
Jan 28 Python
Python 中的pygame安装与配置教程详解
Feb 10 Python
python中shell执行知识点
May 06 Python
keras 权重保存和权重载入方式
May 21 Python
python调用百度AI接口实现人流量统计
Feb 03 Python
Python selenium绕过webdriver监测执行javascript
Apr 12 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
深入解析PHP垃圾回收机制对内存泄露的处理
2013/06/14 PHP
浅谈PHP解析URL函数parse_url和parse_str
2014/11/11 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
jquery tab插件制作实现代码
2010/06/22 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
javascript 密码框防止用户粘贴和复制的实现代码
2014/02/17 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
vue中使用echarts制作圆环图的实例代码
2018/07/27 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
2018/09/13 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
js面向对象之实现淘宝放大镜
2020/01/15 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
详解Python多线程Selenium跨浏览器测试
2017/04/01 Python
在python win系统下 打开TXT文件的实例
2018/04/29 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Python秒算24点实现及原理详解
2019/07/29 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
使用Keras构造简单的CNN网络实例
2020/06/29 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
三项教育活动实施方案
2014/03/30 职场文书
2014年租房协议书范本
2014/10/30 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技