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文件右键找不到IDLE打开项解决办法
Jun 08 Python
使用Python的Bottle框架写一个简单的服务接口的示例
Aug 25 Python
Python按行读取文件的简单实现方法
Jun 22 Python
Python列表切片用法示例
Apr 19 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
Nov 30 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python pandas修改列属性的方法详解
Jun 09 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
TensorFlow实现自定义Op方式
Feb 04 Python
安装完Python包然后找不到模块的解决步骤
Feb 13 Python
python两种注释用法的示例
Oct 09 Python
对PyTorch中inplace字段的全面理解
May 22 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表单提交表单名称含有点号(.)则会被转化为下划线(_)
2011/12/14 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
2015/10/08 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
jQuery中Ajax的load方法详解
2015/01/14 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
Python实现随机生成任意数量车牌号
2020/01/21 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
基于python实现操作git过程代码解析
2020/07/27 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
一套.net面试题及答案
2016/11/02 面试题
《浅水洼里的小鱼》听课反思
2014/02/28 职场文书
成语的广告词
2014/03/19 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
空气的环保标语
2014/06/12 职场文书
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android