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中的hashlib和base64加密模块使用实例
Sep 02 Python
详解Python中time()方法的使用的教程
May 22 Python
Python使用装饰器进行django开发实例代码
Feb 06 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
详解Python函数式编程—高阶函数
Mar 29 Python
Python实现中值滤波去噪方式
Dec 18 Python
Pytorch Tensor的统计属性实例讲解
Dec 30 Python
python 回溯法模板详解
Feb 26 Python
浅谈Python程序的错误:变量未定义
Jun 02 Python
matplotlib 画双轴子图无法显示x轴的解决方法
Jul 27 Python
解决pytorch 模型复制的一些问题
Mar 03 Python
Python基础之赋值,浅拷贝,深拷贝的区别
Apr 30 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/11/10 PHP
sae使用smarty模板的方法
2013/12/17 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
PHP7修改的函数
2021/03/09 PHP
js表格分页实现代码
2009/09/18 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
js计算时间差代码【包括计算,天,时,分,秒】
2016/04/26 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
在Python程序中操作文件之isatty()方法的使用教程
2015/05/24 Python
python将回车作为输入内容的实例
2018/06/23 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
python操作链表的示例代码
2020/09/27 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
旅游管理专业个人求职信范文
2013/12/24 职场文书
应届生如何写自荐信
2014/01/05 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
综合测评个人总结
2015/03/03 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
python 遍历磁盘目录的三种方法
2021/04/02 Python
基于JavaScript实现省市联动效果
2021/06/22 Javascript
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL
instantclient客户端 连接oracle数据库
2022/04/26 Oracle