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开发实例分享bt种子爬虫程序和种子解析
May 21 Python
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
Python3爬虫全国地址信息
Jan 05 Python
详解python中init方法和随机数方法
Mar 13 Python
详解python3 + Scrapy爬虫学习之创建项目
Apr 12 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
Pyecharts地图显示不完成问题解决方案
May 11 Python
python删除某个目录文件夹的方法
May 26 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 Python
Python爬取某平台短视频的方法
Feb 08 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
visual studio code 调试php方法(图文详解)
2017/09/15 PHP
JavaScript的Function详细
2006/11/14 Javascript
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
javascript中如何判断类型汇总
2019/05/14 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
基于树莓派的语音对话机器人
2019/06/17 Python
详解Scrapy Redis入门实战
2020/11/18 Python
python中用Scrapy实现定时爬虫的实例讲解
2021/01/18 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
详解css3中dispaly的Grid布局与Flex布局
2020/09/11 HTML / CSS
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
特步官方商城:Xtep
2017/03/21 全球购物
Linux如何压缩可执行文件
2013/10/21 面试题
毕业生幼师求职自荐信
2013/10/01 职场文书
六年级数学教学反思
2014/02/03 职场文书
年级组长自我鉴定
2014/02/22 职场文书
临床医师个人自我评价
2014/04/06 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
Linux中文件的基本属性介绍
2022/06/01 Servers
一篇文章带你掌握SQLite3基本用法
2022/06/14 数据库