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网络编程学习笔记(五):socket的一些补充
Jun 09 Python
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
Jul 27 Python
举例讲解Python中的死锁、可重入锁和互斥锁
Nov 05 Python
全面分析Python的优点和缺点
Feb 07 Python
python tensorflow学习之识别单张图片的实现的示例
Feb 09 Python
对Python字符串中的换行符和制表符介绍
May 03 Python
儿童学习python的一些小技巧
May 27 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
python pickle存储、读取大数据量列表、字典数据的方法
Jul 07 Python
python celery分布式任务队列的使用详解
Jul 08 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
详细分析Python垃圾回收机制
Jul 01 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 图像函数大举例(非原创)
2009/06/20 PHP
PHP缓存技术的多种方法小结
2012/08/14 PHP
在Laravel中使用MongoDB的方法示例
2019/11/11 PHP
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
JavaScript初学者建议:不要去管浏览器兼容
2014/02/04 Javascript
js读取配置文件自写
2014/02/11 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
js实现无刷新监听URL的变化示例代码详解
2020/06/03 Javascript
[55:02]2014 DOTA2国际邀请赛中国区预选赛 HGT VS Orenda
2014/05/21 DOTA
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
一些Python中的二维数组的操作方法
2015/05/02 Python
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
Python selenium 三种等待方式解读
2016/09/15 Python
浅谈python可视化包Bokeh
2018/02/07 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
Python获取时间戳代码实例
2019/09/24 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
网络安全方面的面试题
2016/01/07 面试题
绩效考核实施方案
2014/03/18 职场文书
个人贷款授权委托书样本
2014/10/07 职场文书
婚礼父母答谢词
2015/01/04 职场文书
青岛导游词
2015/02/12 职场文书
热血教师观后感
2015/06/10 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
python读取mnist数据集方法案例详解
2021/09/04 Python