.. _comprehensions: ============= 推导式 ============= 推导式是简洁的符号结构,旨在允许使用其他序列构建序列。 语法的灵感来自 for 循环的语法:: comprehension ::= array_comprehension | iterator_comprehension | table_comprehension array_comprehension ::= [ any_comprehension ] table_comprehension ::= { any_comprehension } iterator_comprehension := [iterator array_comprehension ]] any_comprehension ::= for '('' argument_list in source_list ')'; result { ; where optional_clause } argument_list ::= argument | argument_list ',' argument source_list ::= iterable_expression | source_list ',' iterable_expression 推导式生成迭代器或动态数组,具体取决于括号的样式:: var a1 <- [iterator for(x in range(0,10)); x] // iterator var a2 <- [for(x in range(0,10)); x] // array var at1 <- {for(x in range(0,10)); x} // table var at2 <- {for(x in range(0,10)); x=>"{x}"} // table ``where``子句充当过滤器:: var a3 <- [for(x in range(0,10)); x; where (x & 1) == 1] // 只有奇数 就像 for 循环一样,推导式可以迭代多个源:: var a4 <- [for(x,y in range(0,10),a1); x + y; where x==y] // 多个变量 迭代器推导式可能会产生一个引用的迭代器:: var a = [1,2,3,4] var b <- [iterator for(x in a); a] // iterator 的 API 中,并将指向捕获的元素副本 常规 lambda 捕获规则适用于迭代器推导式 (参阅 :ref:`Lambdas `). 在内部,数组推导产生一个本地块的 ``invoke`` 和一个 for 循环;而迭代器推导式生成生成器 (lambda)。 数组推导式通常更快,但迭代器推导式的内存占用较少。