本文实例讲述了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://www.jb51.net/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://www.jb51.net/article/128183.htm
附:廖学峰Python相关资料下载:
廖雪峰 Python2.7 教程 PDF版:https://www.jb51.net/books/536707.html
廖雪峰 python3 教程(带标签完整版):https://www.jb51.net/books/536708.html
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]