三目和推导式
流程控制章节的进阶。
三目运算符
也叫三元表达式
普通的 if else 语句
python
if b:
print(a)
else:
print(c)
三元表达式写法,相当于 java 中输出 b?a:c
python
print(a if b else c)
赋值表达式
在 python3.8 中,将赋值语句的 =
前加上一个冒号 :
。
它就变成了一个赋值表达式(Assignment expressions)。
It is affectionately known as “the walrus operator” due to its resemblance to the eyes and tusks of a walrus
由于它和海象的眼睛和长牙相似,它被亲切地称为海象运算符
赋值表达式会在赋值的同时返回左值的引用。
if,while 中使用
pythoncur.execute("select t1.id, t1.name from t1") row = cur.fetchone() while row: print("id=%d, name=%s" % (row[0], row[1])) row = cur.fetchone()
在这个示例中,赋值表达式可以减少部分代码:
pythoncur.execute("select t1.id, t1.name from t1") while row := cur.fetchone(): print("id=%d, name=%s" % (row[0], row[1]))
短路用法使用
pythonn = 0 for char in txt: if char == "p": n += 1 print(n)
使用短路和赋值表达式可以修改为:
pythonn = 0 for char in txt: (char == "p") and (n := n + 1) print(n)
列表解析式
也叫列表推导式。代码可读性较差,使用可能降低协同开发的效率,按需使用。
python
["%s" % i for i in range(5)]
# 得到["0","1","2","3","4"]
["%s" % i for i in range(5) if i % 2 == 0]
# 得到["0","2","4"]
换用圆括号是生成式。它惰性使用,相比于列表解析占用的内存小得多
生成器(generator)会在之后章节详细介绍。
python
("%s" % i for i in range(5))
它可以直接在 for in 语句中使用
python
for i in ("%s" % i for i in range(5)):
print(i)
它的结果和使用内置函数 map 一样
python
map(lambda i: "%s" % i, range(5))
换用花括号得到的则是集合推导式。
字典推导式
字典推导式语法和列表解析式类似
python3.8 后,字典推导式已与字典字面值实现同步,会先计算键再计算值。
shell
>>> # Dict comprehension
>>> cast = {input('role? '): input('actor? ') for i in range(2)}
role? King Arthur
actor? Chapman
role? Black Knight
actor? Cleese