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使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
pygame学习笔记(5):游戏精灵
Apr 15 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
python抓取京东小米8手机配置信息
Nov 13 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
pytorch查看通道数 维数 尺寸大小方式
May 26 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
如何在keras中添加自己的优化器(如adam等)
Jun 19 Python
Python使用Kubernetes API访问集群
May 30 Python
Python实现自动玩连连看的脚本分享
Apr 04 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公用函数列表[正则]
2007/02/22 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
2019/04/10 PHP
JS getMonth()日期函数的值域是0-11
2010/02/15 Javascript
jquery二级导航内容均分的原理及实现
2013/08/13 Javascript
CSS+jQuery实现的一个放大缩小动画效果
2013/09/24 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
2015/09/15 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
Bootstrap弹出框modal上层的输入框不能获得焦点问题的解决方法
2016/12/13 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
Vue2.0生命周期的理解
2018/08/20 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
layui-table获得当前行的上/下一行数据的例子
2019/09/24 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
python中实现php的var_dump函数功能
2015/01/21 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
python对象转字典的两种实现方式示例
2019/11/07 Python
django美化后台django-suit的安装配置操作
2020/07/12 Python
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
上课玩手机检讨书
2014/02/08 职场文书
党员批评与自我批评
2014/02/12 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
招标授权委托书样本
2014/09/23 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
简短清晨问候语
2015/11/10 职场文书
2019教师的学习计划
2019/06/25 职场文书