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中的reduce内建函数使用方法指南
Aug 31 Python
django 自定义用户user模型的三种方法
Nov 18 Python
在Python中使用元类的教程
Apr 28 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
Python实现判断一个字符串是否包含子串的方法总结
Nov 21 Python
遗传算法python版
Mar 19 Python
python批量修改图片大小的方法
Jul 24 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
Dec 28 Python
详解python中的模块及包导入
Aug 30 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
python opencv旋转图片的使用方法
Jun 04 Python
Python Django ORM连表正反操作技巧
Jun 13 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 安全检测代码片段(分享)
2013/07/05 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
PHP高精确度运算BC函数库实例详解
2017/08/15 PHP
详解php 使用Callable Closure强制指定回调类型
2017/10/26 PHP
如何在PHP中生成随机数
2020/06/04 PHP
JavaScript将页面表格导出为Excel的具体实现
2013/12/27 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
JavaScript中Form表单技术汇总(推荐)
2016/06/26 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Python中return语句用法实例分析
2015/08/04 Python
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
Python书单 不将就
2017/07/11 Python
Django中Forms的使用代码解析
2018/02/10 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
Python基础之字符串操作常用函数集合
2020/02/09 Python
德尔福集团DELPHI的笔试题
2012/02/22 面试题
前处理组长岗位职责
2014/03/01 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
工商管理专业自荐信
2014/06/03 职场文书
环境卫生标语
2014/06/09 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
大学毕业生自我评价
2015/03/02 职场文书
小学总务工作总结
2015/08/13 职场文书
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL