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的collections模块中的OrderedDict有序字典
Jul 07 Python
python机器学习之决策树分类详解
Dec 20 Python
理解python中生成器用法
Dec 20 Python
python的staticmethod与classmethod实现实例代码
Feb 11 Python
使用PyInstaller将python转成可执行文件exe笔记
May 26 Python
python变量赋值方法(可变与不可变)
Jan 12 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
python实现人机五子棋
Mar 25 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
Jun 28 Python
PyQt5的相对布局管理的实现
Aug 07 Python
Python Unittest原理及基本使用方法
Nov 06 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调用数据库的存贮过程!
2006/10/09 PHP
php ftp文件上传函数(基础版)
2010/06/03 PHP
PHP中单引号与双引号的区别分析
2014/08/19 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
详解jQuery简单的表单应用
2016/12/16 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
js图片上传的封装代码
2017/08/01 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
python练习程序批量修改文件名
2014/01/16 Python
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
python类和继承用法实例
2015/07/07 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
python实现图像外边界跟踪操作
2020/07/13 Python
巴西图书和电子产品购物网站:Saraiva
2017/06/07 全球购物
香港零食网购:上仓胃子
2020/06/08 全球购物
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
资金主管岗位职责范本
2014/03/04 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
关于教师节的演讲稿
2014/09/04 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
MySQL GTID复制的具体使用
2022/05/20 MySQL