2.9.简洁的Python
Windows 10
Python 3.7.3 @ MSC v.1915 64 bit (AMD64)
Latest build date 2020.06.24
import pprint
Python以简洁著称,Python提供了一些可以让我们很容易写出简洁代码的语法。
推导式
Comprehensions译为推导式,或者生成式,这是Python独有的特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。Python共有三种推导式:
- List Comprehensions
- Dict Comprehensions
- Set Comprehensions
列表推导式
List Comprehensions 是用来创建list的推导式。
运用列表推导式,可以写出非常简洁的代码。
举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
可以用list(range(1, 11))
:
list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]
怎么做?方法一是循环:
L = []
for x in range(1, 11):
L.append(x * x)
pprint.pprint(L)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但是循环太繁琐,而列表推导式则可以用一行代码代替循环生成上面的list:
[x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
写列表推导式时,把要生成的元素x * x
放到前面,后面跟for
循环,就可以把list创建出来。
for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:
[x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
还可以使用两层循环,可以生成全排列:
[m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
三层和三层以上的循环就很少用到了。
for
循环其实可以同时使用两个甚至多个变量,比如dict
的items()
可以同时迭代key和value:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
for k, v in d.items():
print(k, '=', v)
x = A
y = B
z = C
因此,列表推导式也可以使用两个变量来生成list:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
[k + '=' + v for k, v in d.items()]
['x=A', 'y=B', 'z=C']
字典推导式
字典推导式和列表推导式是类似的:
{key:value for key, value in enumerate(range(4))}
{0: 0, 1: 1, 2: 2, 3: 3}
集合推导式
{value for value in range(4)}
{0, 1, 2, 3}
序列解包
x, y, z = (1, 2, 3)
print(x, y, z)
x, y = y, x
print(x, y)
1 2 3
2 1
要解包的序列包含的元素个数必须与你在等号左边列出的目标个数相同,否则Python将引发异常。
try:
x, y = (1, 2, 3)
except ValueError as e:
print(e)
try:
x, y, z = (1, 2)
except ValueError as e:
print(e)
too many values to unpack (expected 2)
not enough values to unpack (expected 3, got 2)
可使用星号运算符( * )来收集多余的值,这样无需确保值和变量的个数相同,如下例所示:
x, *y = (1, 2, 3)
print(x, y)
x, *y, z = (1, 2, 3, 4)
print(x, z)
1 [2, 3]
1 4
链式赋值
链式赋值是一种快捷方式,用于将多个变量关联到同一个值。
x = y = 1
print(x, y)
1 1
上述代码与下面的代码等价:
y = 1
x = y
请注意,这两条语句可能与下面的语句不等价:
x = somefunction()
y = somefunction()
if/else三元表达式
a = 2
a if a > 0 else 1
2