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调用浏览器并打开一个网址的例子
Jun 05 Python
Python logging管理不同级别log打印和存储实例
Jan 19 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
Python简单计算给定某一年的某一天是星期几示例
Jun 27 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
python 杀死自身进程的实现方法
Jul 01 Python
python实现图片九宫格分割
Mar 07 Python
django重新生成数据库中的某张表方法
Aug 28 Python
python生成任意频率正弦波方式
Feb 25 Python
keras绘制acc和loss曲线图实例
Jun 15 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
Jul 13 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 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 similar_text 字符串的相似性比较函数
2010/05/26 PHP
php笔记之:有规律大文件的读取与写入的分析
2013/04/26 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
jQuery版Tab标签切换
2011/03/16 Javascript
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
js实现5秒倒计时重新发送短信功能
2017/02/05 Javascript
js数据类型检测总结
2018/08/05 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
python write无法写入文件的解决方法
2019/01/23 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
如何基于python操作json文件获取内容
2019/12/24 Python
tensorflow查看ckpt各节点名称实例
2020/01/21 Python
CSS3 Backgrounds属性相关介绍
2011/05/11 HTML / CSS
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
求最大连续递增数字串(如"ads3sl456789DF3456ld345AA"中的"456789")
2015/09/11 面试题
爱心捐助倡议书
2014/05/19 职场文书
数学系毕业生求职信
2014/05/29 职场文书
亚运会口号
2014/06/20 职场文书
超市理货员岗位职责
2014/07/04 职场文书
股份合作协议书
2014/09/10 职场文书
财务年终工作总结大全
2019/06/20 职场文书