CQL 教程/数据类型/推导式

推导式

用一行中文语法快速生成列表、字典、集合与生成器,理解推导式的条件过滤、嵌套循环与惰性求值。

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,它把本节所有写法串在一起运行。