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修改Excel数据的实例代码
Nov 01 Python
使用Python编写Linux系统守护进程实例
Feb 03 Python
浅谈Python的垃圾回收机制
Dec 17 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
Feb 23 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
Django之模型层多表操作的实现
Jan 08 Python
Python中使用logging和traceback模块记录日志和跟踪异常
Apr 09 Python
使用Pytorch来拟合函数方式
Jan 14 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
如何用python反转图片,视频
Apr 24 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
Windows下的PHP安装pear教程
2014/10/24 PHP
php自定义扩展名获取函数示例
2016/12/12 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
javascript设置连续两次点击按钮时间间隔的方法
2014/10/28 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
Jquery基础教程之DOM操作
2015/08/19 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
2017/11/20 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
关于Js中new操作符的作用详解
2021/02/21 Javascript
[04:44]DOTA2 2017全国高校联赛视频回顾
2017/08/21 DOTA
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
python去除所有html标签的方法
2015/05/05 Python
Python 中的with关键字使用详解
2016/09/11 Python
[机器视觉]使用python自动识别验证码详解
2019/05/16 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
法国家具及室内配件店:home24
2017/01/21 全球购物
俄罗斯首家面向中国消费者的一站式购物网站:Wruru
2020/05/08 全球购物
保安队长职务说明书
2014/02/23 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
借款协议书
2014/04/12 职场文书
公司演讲稿开场白
2014/08/25 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript