关于python:Python列表推导式

33次阅读

共计 2697 个字符,预计需要花费 7 分钟才能阅读完成。

Python 列表推导式
列表推导式是 Python 构建列表(list)的一种快捷方式, 能够应用简洁的代码就创立出一个列表.

一、range()函数

python 的 range()函数可用来创立一个整数列表,个别用在 for 循环中.

range()语法:range(start, stop[, step])

start: 计数从 start 开始, 默认是从 0 开始 (闭区间), 如:range(5) 等价于 range(0,5).

stop: 计数到 stop 完结, 但不包含 stop(开区间). 如:range(0,5)是[0, 1, 2, 3, 4], 不蕴含 5.

step: 步长, 相邻两个值的差值, 默认为 1. 如:range(0,5)相当于 range(0, 5, 1).

为什么要在列表推导式前讲 range(), 因为列表推导式是通过一个可迭代对象来生成列表的,range()能够说是列表推导式中最罕用的可迭代对象了. 对列表推导式来说,range()是其中的精华之一. 没有 range(), 列表推导式的可读性和简洁性将会大打折扣.

二、列表推导式

列表推导式 (list comprehension) 是指循环创立列表.

for 循环有十分广的利用场景, 也能够用来创立一个列表, 而列表推导式就相当于 for 循环创立列表的简化版.

# for 循环
list_a = list()
for a in range(5):
    list_a.append(a)
print(list_a)
# 列表推导式
list_b = [b for b in range(5)]
print(list_b)

下面别离是用 for 循环和列表推导式创立列表的代码,list_a 和 list_b 的后果是一样的, 都是[0, 1, 2, 3, 4].

上面来看简单点的列表推导式:

# in 前面跟其余可迭代对象, 如字符串
list_c = [7 * c for c in "python"]
print(list_c)
 
# 带 if 条件语句的列表推导式
list_d = [d for d in range(6) if d % 2 != 0]
print(list_d)
 
# 多个 for 循环
list_e = [(e, f * f) for e in range(3) for f in range(5, 15, 5)]
print(list_e)
 
# 嵌套列表推导式, 多个并列条件
list_g = [[x for x in range(g - 3, g)] for g in range(22) if g % 3 == 0 and g != 0]
print(list_g)

运行后果:

['ppppppp', 'yyyyyyy', 'ttttttt', 'hhhhhhh', 'ooooooo', 'nnnnnnn']
[1, 3, 5]
[(0, 25), (0, 100), (1, 25), (1, 100), (2, 25), (2, 100)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20]]

代码解释:

1. 列表推导式会遍历前面的可迭代对象, 而后依照 for 前的表达式进行运算, 生成最终的列表.

2. 如果有 if 条件语句,for 遍历后紧跟着进行条件判断.

3. 如果有多个 for 循环, 则最终的数据数量为多个 for 循环的笛卡尔积.

4. 能够进行嵌套的列表推导, 与嵌套 for 循环的原理雷同.

三、代码可读性

对于不相熟列表推导式的人来说,能够应用 for 循环来实现雷同的性能, 然而须要好几行代码, 而列表推导式只须要一行代码.

很多人会说代码简洁了但可读性升高了, 其实不然, 当咱们对列表推导式相熟(本人写几次就相熟了),代码的性能一眼就能轻松地看进去, 然而 for 循环代码根本不可能一眼看完. 尤其当创立列表的 for 循环嵌套在业务逻辑的其余 for 循环里时, 恰好是应用列表推导式的可读性最高.

同时, 在 Python3 中列表推导式有本人的部分作用域, 就像函数似的. 表达式外部的变量和赋值只在部分起作用,表达式的上下文里的同名变量还能够被失常援用,局部变量并不会影响到它们.

也就是说, 列表推导不会有变量透露的问题, 在列表推导中的赋值操作不可能会影响到列表推导上下文中的同名变量.

当然, 也不是所有场景都举荐应用列表推导式. 比如说: 如果列表推导的代码超过了两行, 就要思考改成用 for 循环了. 超过了两行的列表推导式就真的没有可读性了. 通常的准则是,只用列表推导来创立新的列表,并且尽量放弃简短.

四、字典推导式

自 Python2.7 以来, 列表推导概念就移植到了字典上, 从而有了字典推导(前面还会看到汇合推导).

如果列表推导的概念曾经为你所熟知, 承受字典推导并不难. 间接看代码吧:

# 因为 key 是惟一的, 所以最初 value 都是 1
dict_a = {key: value for key in 'python' for value in range(2)}
print(dict_a)
 
# 能够依据键来结构值
dict_b = {key: key * key for key in range(6)}
print(dict_b)
 
# 遍历一个有键值关系的可迭代对象
list_phone = [('HUAWEI', '华为'), ('MI', '小米'), ('OPPO', 'OPPO'), ('VIVO', 'VIVO')]
dict_c = {key: value for key, value in list_phone}
print(dict_c)

运行后果:

{'p': 1, 'y': 1, 't': 1, 'h': 1, 'o': 1, 'n': 1}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
{'HUAWEI': '华为', 'MI': '小米', 'OPPO': 'OPPO', 'VIVO': 'VIVO'}

五、汇合推导式

Python2.7 不仅带来了字典推导式, 还带来了汇合推导式.

同样的, 咱们间接看代码, 这样能够直观的看到汇合推导式.

# 遍历一个可迭代对象生成汇合
set_a = {value for value in '有人云淡风轻, 有人负重前行'}
print(set_a)

运行后果:

{'负', '有', '人', '轻', '前', '云', '重', ',', '淡', '风', '行'}

汇合是无序且不反复的, 所以会主动去掉反复的元素, 并且每次运行显示的程序不一样.

从下面的代码中能够总结:

汇合推导式就是将列表推导式的 [] 换成{}, 字典推导式就是推导出两个值并构建成键值对的样子.

另外, 不论是字典推导式还是汇合推导式, 前面都能够像列表推导式一样接 if 条件语句, 嵌套循环等, 具体能够依据您本人的需要来应用.

————————————————
版权申明:本文为 CSDN 博主「Python 碎片」的原创文章,遵循 CC 4.0 BY-SA 版权协定,转载请附上原文出处链接及本申明。
原文链接:https://blog.csdn.net/weixin_…

正文完
 0