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中精确输出JSON浮点数的方法
Apr 18 Python
Python列表append和+的区别浅析
Feb 02 Python
python转换字符串为摩尔斯电码的方法
Jul 06 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 Python
python实现多线程网页下载器
Apr 15 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
python使用sessions模拟登录淘宝的方式
Aug 16 Python
wxPython之wx.DC绘制形状
Nov 19 Python
python如何写出表白程序
Jun 01 Python
基于Django集成CAS实现流程详解
Nov 28 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 读取Postgresql中的数组
2013/04/14 PHP
探讨php define()函数及defined()函数使用详解
2013/06/09 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
js实现简单的星级选择器提交效果适用于评论等
2013/10/18 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
vue 之 .sync 修饰符示例详解
2018/04/21 Javascript
使用webpack打包后的vue项目如何正确运行(express)
2018/10/26 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
js调用网络摄像头的方法
2020/12/05 Javascript
深入理解Python对Json的解析
2017/02/14 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
速记Python布尔值
2017/11/09 Python
python对日志进行处理的实例代码
2018/10/06 Python
Python常用的json标准库
2019/02/19 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
Python count函数使用方法实例解析
2020/03/23 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
Python extract及contains方法代码实例
2020/09/11 Python
HTML5进度条特效
2014/12/18 HTML / CSS
信息管理专业推荐信
2013/10/29 职场文书
广告学专业推荐信范文
2013/11/23 职场文书
党章学习思想汇报
2014/01/14 职场文书
初中美术教学反思
2014/01/29 职场文书
软件售后服务承诺书
2014/05/21 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
大学四年个人总结
2015/03/03 职场文书
零基础学java之循环语句的使用
2022/04/10 Java/Android