Skip to content

三目和推导式

流程控制章节的进阶。

三目运算符

也叫三元表达式

普通的 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 中使用

    python
    cur.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()

    在这个示例中,赋值表达式可以减少部分代码:

    python
    cur.execute("select t1.id, t1.name from t1")
    while row := cur.fetchone():
        print("id=%d, name=%s" % (row[0], row[1]))
  • 短路用法使用

    python
    n = 0
    for char in txt:
        if char == "p":
            n += 1
    print(n)

    使用短路和赋值表达式可以修改为:

    python
    n = 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