模块 6 · 第 1 课(共 4)课程中的21/36~12 min
模块课程(1/4)
列表理解
列表理解是一个通过应用构建列表的表达式
到可迭代的转换(以及可选的过滤器)。这是
在单行上编写 for + append 的 Pythonic 方式。
Python
# stile imperativo (verboso)
quadrati = []
for n in range(5):
quadrati.append(n * n)
# stile pythonico
quadrati = [n * n for n in range(5)]
# [0, 1, 4, 9, 16]完整语法
Python
[espressione for elemento in iterabile if condizione]- 表达式:将什么放入结果列表中
- for element in iterable: 源循环
- if条件(可选):仅保留匹配的元素
Python
pari = [n for n in range(10) if n % 2 == 0]
# [0, 2, 4, 6, 8]
maiuscole = [p.upper() for p in ["ciao", "mondo"]]
# ['CIAO', 'MONDO']
lunghe = [p for p in ["a", "bb", "ccc", "dddd"] if len(p) >= 3]
# ['ccc', 'dddd']表达式内的 if/else(三元)
要有条件地转换(而不是过滤器),请使用三元
for 之前的表达式:
Python
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]多用于:笛卡尔积
您可以嵌套多个 for 子句:
Python
coppie = [(x, y) for x in range(3) for y in range(2)]
# [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]for 子句的顺序是“outer-before-inner”,就好像它们是
嵌套循环。
何时不使用理解式
- 具有许多嵌套
if/else分支的复杂逻辑 → 使用显式循环。 - 副作用(打印、文件写入)→ 循环,而不是理解。
- 超过 2 个嵌套级别 → 显式命名循环几乎总是更好。
嵌套列表理解
您可以在单个列表理解中链接多个 for 循环。例如,要将矩阵(列表列表)展平为单个平面列表,您可以编写:
Python
matrix = [[1, 2], [3, 4]]
flat = [item for row in matrix for item in row]
# result: [1, 2, 3, 4]循环的顺序完全反映了传统 for 循环的嵌套顺序。
尝试一下
锻炼#python.m6.l1.e1
尝试:0加载中...
给定“nums = [1, 2, 3, 4, 5, 6]”,用偶数的平方构建“even_squares”。评估“even_squares”。
正在加载编辑器...
显示提示
如果最后 n % 2 == 0 。
3 次尝试后可用的解决方案
复习练习
锻炼#python.m6.l1.e2
尝试:0加载中...
给定 `words = ['Ciao', 'Mondo', 'Python', 'Java']`,使用每个单词的长度构建 `lengths`,并仅使用短于 5 个字符的单词构建 `short_words`。评估“(长度,短单词)”。
正在加载编辑器...
显示提示
两种不同的理解。
3 次尝试后可用的解决方案
额外的挑战
锻炼#python.m6.l1.e3
尝试:0加载中...
Use a list comprehension to calculate the squares of only the even integers between 1 and 10 inclusive. Store the list in `even_squares` and evaluate it.
正在加载编辑器...
显示提示
使用 range(1, 11) 进行迭代,if x % 2 == 0 进行过滤,x**2 作为表达式。
3 次尝试后可用的解决方案