Python3中的列表生成式、生成器与迭代器实例详解


Posted in Python onJune 11, 2018

本文实例讲述了Python3中的列表生成式、生成器与迭代器。分享给大家供大家参考,具体如下:

列表生成式

Python内置的一种极其强大的生成列表 list 的表达式。返回结果必须是列表。

基本语法:

[ 变量表达式 for 变量 in 表达式 ]

示例

a = [x ** 2 for x in range(1, 10)]
b = [x * x for x in range(1, 11) if x % 2 == 0]
c = [m + n for m in 'ABC' for n in '123']
d = {'Java': "99", 'C': "99", 'C++': "99"}
L = [k + '=' + v for k, v in d.items()]
print(a)
print(b)
print(c)
print(L)

通过列表生成式,可以直接创建一个列表,但是,受到内存的限制,列表容量是有限的,当列表元素很大的时候,会很浪费内存空间。所以可以通过生成器 Generator 生成。

生成器 Generator

Generator 是一种一边循环一边计算的机制。

应用场景:只需要获得 list 中的前几个元素,节省存储空间。

使用 () 创建列表生成器

把列表生成式的中括号 [] 修改为圆括号即可 ()

a = (x ** 2 for x in range(1, 10))
b = (x * x for x in range(1, 11) if x % 2 == 0)
c = (m + n for m in 'ABC' for n in '123')
d = {'Java': "99", 'C': "99", 'C++': "99"}
L = (k + '=' + v for k, v in d.items())
print(a)
print(b)
print(c)
print(L)

打印结果如下

<generator object <genexpr> at 0x1052ec2b0>
<generator object <genexpr> at 0x1052ec468>
<generator object <genexpr> at 0x1052ec4c0>
<generator object <genexpr> at 0x1052ec518>

使用 next 调用元素:

print(a.__next__())
print(a.__next__())
print(a.__next__())
print(a.__next__())

next 方法会一个个的返回元素值,调用一次,返回一次下一个位置的元素。
该方法在没有元素可以调用的时候,会返回 StopIteration 的错误

使用循环调用元素

for i in a:
  print(i)

该方法的好处,是不会返回 StopIteration 的错误

yield 关键字 创建 Generator

如果一个函数包含了yield 关键字,那么该函数就不再是普通的函数,而是一个生成器 Generatior。

print(sum) 修改为 yield(sum),即将原来的函数,修改为了生成器。

def fib(n):
  sum = 0
  i = 0
  while (i<n):
    sum = sum + i
    i += 1
    yield(sum)
print(type(fib(10)))
for x in fib(10):
  print(x)

包含 yield 语句的函数会被特定的编译成生成器。可以吧生成器理解为迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。

Generator 的工作原理,是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。

对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。

python 生成器可参考 https://3water.com/article/63929.htm

以下实例使用 yield 实现斐波那契数列

#!/usr/bin/python3
import sys
def fibonacci(n): # 生成器函数 - 斐波那契
  a, b, counter = 0, 1, 0
  while True:
    if (counter > n):
      return
    yield a
    a, b = b, a + b
    counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
while True:
  try:
    print (next(f), end=" ")
  except StopIteration:
    sys.exit()

迭代器 iterator

  • 迭代器是访问集合元素的一种方式
  • 迭代器有两个方法,生成迭代器 iter(),返回迭代器的下一个项目 next()
  • 迭代器对象从集合的第一个元素开始访问,知道所有元素被访问结束。迭代器只能往前,不能回退。
  • 字符串、列表、元组 都可以用于创建迭代器

迭代器 iterator 和可迭代对象 iterable 的区别在于:

可以直接作用于for循环的对象统称为可迭代对象:Iterable,list、tuple、dict、set、str、Generator 等等。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

使用 iter 创建迭代器

list、dict、str等数据类型不是Iterator,但是可以通过 iter() 来创建迭代器
list=[1,2,3,4]
it = iter(list)  # 创建迭代器对象
print (next(it))  # 输出迭代器的下一个元素
  1
print (next(it))
  2

Python迭代器 Iterator 可参考:https://3water.com/article/128183.htm

附:廖学峰Python相关资料下载:

廖雪峰 Python2.7 教程 PDF版:https://3water.com/books/536707.html

廖雪峰 python3 教程(带标签完整版):https://3water.com/books/536708.html

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python 代码性能优化技巧分享
Aug 07 Python
详解Python程序与服务器连接的WSGI接口
Apr 29 Python
Python实现的栈(Stack)
Jan 26 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 Python
Python中修改字符串的四种方法
Nov 02 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 Python
Python input函数使用实例解析
Nov 22 Python
Python换行与不换行的输出实例
Feb 19 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
Python爬虫使用bs4方法实现数据解析
Aug 25 Python
python spilt()分隔字符串的实现示例
May 21 Python
python xlsxwriter创建excel图表的方法
Jun 11 #Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 #Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 #Python
python操作excel的方法(xlsxwriter包的使用)
Jun 11 #Python
Python 爬取携程所有机票的实例代码
Jun 11 #Python
完美解决安装完tensorflow后pip无法使用的问题
Jun 11 #Python
Anaconda 离线安装 python 包的操作方法
Jun 11 #Python
You might like
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
PHP 魔术函数使用说明
2010/05/14 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
accesskey 提交
2006/06/26 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
[04:56]经典回顾:前Ehome 与 前LGD
2015/02/26 DOTA
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
介绍Python的@property装饰器的用法
2015/04/28 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
国外平面设计素材网站:The Hungry JPEG
2017/03/28 全球购物
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
UNIX文件类型
2013/08/29 面试题
自荐信格式范文
2013/10/07 职场文书
副处级干部考察材料
2014/05/17 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
PHP解决高并发问题
2021/04/01 PHP
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js
JS实现简单的九宫格抽奖
2022/06/28 Javascript