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实现rest请求api示例
Apr 22 Python
python操作ie登陆土豆网的方法
May 09 Python
从头学Python之编写可执行的.py文件
Nov 28 Python
python多进程中的内存复制(实例讲解)
Jan 05 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
python实现简易数码时钟
Feb 19 Python
浅谈Python的条件判断语句if/else语句
Mar 21 Python
python实现超级玛丽游戏
Mar 18 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
Django之全局使用request.user.username的实例详解
May 14 Python
Python获取android设备cpu和内存占用情况
Nov 15 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 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
模仿OSO的论坛(五)
2006/10/09 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
laravel框架学习笔记之组件化开发实现方法
2020/02/01 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
微信小程序页面开发注意事项整理
2017/05/18 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
Python检测数据类型的方法总结
2019/05/20 Python
pywinauto自动化操作记事本
2019/08/26 Python
使用Python发现隐藏的wifi
2020/03/04 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
联强国际笔试题面试题
2013/07/10 面试题
函授大专自我鉴定
2013/11/01 职场文书
学习雷锋活动总结
2014/04/29 职场文书
个人委托函范文
2015/01/29 职场文书
校友回访母校寄语
2015/02/26 职场文书
自我推荐信怎么写
2015/03/24 职场文书
教务处教学工作总结
2015/08/10 职场文书
健身房被搭讪?用python写了个小米计时器助人为乐
2021/06/08 Python