12.1列表推导式
列表推导式用方括号包裹,语法为 [表达式 循环 变量 在 可迭代],直接生成新的列表。
cql
# 列表推导式
平方 = [x * x 循环 x 在 范围(10)]
打印("平方:", 平方) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]上面的写法等价于下面的普通循环:
cql
# 等价的普通写法
平方 = []
循环 x 在 范围(10):
平方.append(x * x)
打印(平方)12.2带条件的推导式
在推导式末尾追加 如果 条件 即可过滤元素:
cql
# 带条件的推导式
偶数 = [x 循环 x 在 范围(20) 如果 x % 2 == 0]
打印("偶数:", 偶数) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]12.3嵌套循环推导式
多个 循环 依次书写即嵌套循环,执行的顺序与普通嵌套 for 完全一致;过滤条件写在最后:
cql
# 嵌套循环推导式
坐标 = [(x, y) 循环 x 在 范围(3) 循环 y 在 范围(3) 如果 x != y]
打印("坐标:", 坐标)
# [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]12.4字典推导式
把方括号换成花括号,用 键: 值 形式即可生成字典:
cql
# 字典推导式
字典推导 = {x: x ** 2 循环 x 在 范围(5)}
打印("字典推导:", 字典推导) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}12.5集合推导式
同样是花括号,但只写表达式不写键值对,就会生成一个自动去重的集合:
cql
# 集合推导式
集合推导 = {x % 4 循环 x 在 范围(10)}
打印("集合推导:", 集合推导) # {0, 1, 2, 3}12.6生成器表达式
把方括号换成圆括号就是生成器表达式。它与列表推导式写法几乎一样,但采用惰性求值:元素按需逐个产生,不会一次性全部生成,适合处理大数据流。
cql
# 生成器表达式(惰性求值)
生成器 = (x * 2 循环 x 在 范围(6))
打印("生成器求和:", 求和(生成器)) # 0 + 2 + 4 + 6 + 8 + 10 = 30提示:生成器只能迭代一次。上面的
求和(生成器) 消耗掉生成器后,再迭代它就为空了。12.7与海象运算符结合
海象运算符 := 可以在表达式内部赋值并复用,与推导式结合可以避免重复计算:
cql
# 海象运算符 + 推导式
数据 = [1, 3, 5, 8, 13, 21]
打印("大于 5 的:", [x 循环 x 在 数据 如果 (n := x) > 5])
# [8, 13, 21](赋值表达式 n := x 在过滤条件中先求值)完整的推导式示例可以参考 examples/comprehension.cql,它把本节所有写法串在一起运行。