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定时器使用示例分享
Feb 16 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
Python实现计算最小编辑距离
Mar 17 Python
python脚本实现验证码识别
Jun 07 Python
python调用tcpdump抓包过滤的方法
Jul 18 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
在python中使用xlrd获取合并单元格的方法
Dec 26 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
基于python plotly交互式图表大全
Dec 07 Python
pytorch下大型数据集(大型图片)的导入方式
Jan 08 Python
python给图像加上mask,并提取mask区域实例
Jan 19 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文件上传表单摘自drupal的代码
2011/02/15 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
jQuery使用Layer弹出层插件闪退问题
2016/12/22 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
2017/12/22 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
python实现的各种排序算法代码
2013/03/04 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
劳资专员岗位职责
2013/12/27 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
取保候审保证书
2014/04/30 职场文书
颐和园导游词
2015/01/30 职场文书
汽车修理厂管理制度
2015/08/05 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
导游词之无锡东林书院
2019/12/11 职场文书