序列
序列是指一组数据,按存放类型分为容器序列与扁平序列,按能否被修改分为不可变序列与可变序列。
容器序列与扁平序列
容器序列存放的是对象的引用,包括list、tuple、collections.deque。
扁平序列存放的是对象的值,包括str、bytes、bytearray、memoryview和array.array。
扁平序列的值是字符、字节和数值这种基础类型。
不可变序列与可变序列
不可变序列,包括tuple、str、bytes。
可变序列,包括list、bytearray、array.array、collection.deque、memoryview。
下图左边是父类,右边是子类,可以看出可变序列是从不可变序列继承来的,扩展了可变方法:
列表推导
Python语言魅力在于简洁,这能从最常见的创建列表体现出来,比如我们想把字符串"abc"转换成新列表["a", "b", "c"],常规写法:
symbols = "abc" codes = [] for symbol in symbols: codes.append(symbol) print(codes) # ["a", "b", "c"]
用到了for循环和列表append方法。实际上可以不用append方法,直接:
symbols = "abc" codes = [symbol for symbol in symbols]
这叫做列表推导,是更加Pythonic的写法。
无论是编写效率还是可阅读性,列表推导都更胜一筹,可以说是构建列表的快捷方式。但是不能滥用,通用原则是,如果列表推导的代码超过了两行,就要考虑用append了。这不是规定,完全可以凭借自我喜好来选择。
笛卡尔积是指多个序列中元素所有组合,我们用列表推导来实现笛卡尔积:
colors = ["black", "white"] sizes = ["S", "M", "L"] tshirts = [(color, size) for color in colors for size in sizes]
一行代码搞定!Life is short,use Python,list comprehension is wonderful,amazing。
注意这行代码有两个for循环,等价于:
for color in colors: for size in sizes:
运行结果是:
[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]
如果换一下顺序:
[(color, size) for color in colors for size in sizes]
等价于:
for size in sizes: for color in colors:
运行结果是不同的,观察第2个元素:
[('black', 'S'), ('white', 'S'), ('black', 'M'), ('white', 'M'), ('black', 'L'), ('white', 'L')]
生成器表达式
一般接触到生成器时,都要讲yield
关键字,看似有点复杂,然而却很简单,生成器就像列表推导一样,只不过是用来生成其他类型序列的,比如元组:
symbols = "abc" codes = (symbol for symbol in symbols)
它的语法非常简单,把列表推导的中括号[]换成小括号(),就可以了。
语法相似,本质上却有很大区别,我们试着用生成器表达式来实现笛卡尔积,看看会有什么变化:
colors = ["black", "white"] sizes = ["S", "M", "L"] tshirts = ((color, size) for color in colors for size in sizes)
运行结果是:
<generator object <genexpr> at 0x000001FD57D2DB30>
generator object,结果是一个生成器对象。因为生成器表达式在每次迭代时才会逐个产出元素,所以这里的结果并不是已经创建好的元组。列表推导才会一次性产生新列表所有元素。
通过迭代把生成器表达式结果输出:
for tshirt in tshirts: print(tshirt)
('black', 'S') ('white', 'S') ('black', 'M') ('white', 'M') ('black', 'L') ('white', 'L')
生成器表达式可以提升程序性能,比如要计算两个各有1000个元素的列表的笛卡尔积,生成器表达式可以帮忙省掉运行for循环的开销,即一个包含100万个元素的列表。
yield作用和return差不多,后面会讲到。
Tips
本小节内容是我看《流畅的Python》第一遍时记录的知识点:
- Python标准库用C实现了丰富的序列类型。
- 列表推导,就是指
a = [x for x in something]
这种写法。 - 生成器表达式用于生成列表外的其他类型的序列,它跟列表推导的区别仅仅在于方括号换成圆括号,如
b = tuple(x for x in something)
。 array.array('I', x for x in something)
,array构造方法的第一个参数指定了数组中数字的存储方式。for tshirt in [c, s for c in colors for s in sizes]
,列表推导会一次性生成这个列表,存储在内存中,占用资源。for tshirt in ('%s %s' for c in colors for s in sizes)
,生成器表达式只在循环时逐个产出元素,避免额外的内存占用,省掉了运行for循环的开销。
小结
本文首先介绍了序列的概念,然后演示了Python常规骚操作——列表推导,最后引出了生成器表达式这个看似复杂实则简单的语法。列表是可变的,它有个不可变的孪生兄弟,元组。
参考资料:
《流畅的Python》
以上就是python 列表推导和生成器表达式的使用的详细内容,更多关于python 列表推导和生成器表达式的资料请关注其它相关文章!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]