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 相关文章推荐
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
九步学会Python装饰器
May 09 Python
Python中断言Assertion的一些改进方案
Oct 27 Python
TensorFlow深度学习之卷积神经网络CNN
Mar 09 Python
Python中判断输入是否为数字的实现代码
May 26 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
Sep 17 Python
Python打包方法Pyinstaller的使用
Oct 09 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
Apr 23 Python
Pycharm添加虚拟解释器报错问题解决方案
Oct 13 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 Python
人工智能深度学习OpenAI baselines的使用方法
May 20 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
在字符串中把网址改成超级链接
2006/10/09 PHP
php 数学运算验证码实现代码
2009/10/11 PHP
php 将excel导入mysql
2009/11/09 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
javascript 判断数组是否已包含了某个元素的函数
2010/05/30 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
Actionscript与javascript交互实例程序(修改)
2016/09/22 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
React实现轮播效果
2020/08/25 Javascript
python获取指定网页上所有超链接的方法
2015/04/04 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
python做量化投资系列之比特币初始配置
2018/01/23 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
2019 Python最新面试题及答案16道题
2019/04/11 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
HTML5学习笔记之History API
2015/02/26 HTML / CSS
数百万免费的图形资源:Freepik
2020/09/21 全球购物
劳资员岗位职责
2013/11/11 职场文书
大学生自荐书范文
2013/12/10 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
矿泉水广告词
2014/03/20 职场文书
高一学生期末评语
2014/04/25 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL