python использует for
в списках и выражениях генератора.Они очень похожи на выражение scala for
:
это python
>>> letters = ['a', 'b', 'c', 'd']
>>> ints = [0, 1, 2, 3]
>>> [l + str(i) for l in letters for i in ints if i % 2 == 0]
['a0', 'a2', 'b0', 'b2', 'c0', 'c2', 'd0', 'd2']
это scala
scala> val letters = List('a', 'b', 'c', 'd')
scala> val ints = List(0, 1, 2, 3)
scala> for (l <- letters; i <- ints if i % 2 == 0) yield l.toString + i
res0: List[java.lang.String] = List(a0, a2, b0, b2, c0, c2, d0, d2)
Каждая конструкция может принимать несколько генераторов / итераторов, применять фильтры к выражениям и давать комбинированное выражение.В Python (expr for v1 in gen1 if expr1 for v2 in gen2 if expr2)
примерно соответствует:
for v1 in gen1:
if expr1:
for v2 in gen2:
if expr2:
yield expr
В Scala for (v1 <- gen1 if expr1; v2 <- gen2 if expr2) yield expr
примерно соответствует:
gen1.withFilter(expr1).flatMap(v1 => gen2.withFilter(expr2).map(v2 => expr))
Если вам нравится синтаксис Python for x in xs
, выСкорее всего, вам понравится выражение scala for
.
Scala имеет некоторые дополнительные синтаксические особенности и особенности перевода.Синтаксис for
можно использовать с фигурными скобками, чтобы вы могли размещать операторы в отдельных строках.Вы также можете выполнять присвоения значений.
val res = for {
i <- 1 to 20; i2 = i*i
j <- 1 to 20; j2 = j*j
k <- 1 to 20; k2 = k*k
if i2 + j2 == k2
} yield (i, j, k)
Также v1 <- gen1
действительно выполняет сопоставление case v1 => gen1
.Если совпадений нет, эти элементы игнорируются при итерации.
scala> val list = List(Some(1), None, Some(2))
scala> for (Some(i) <- list) yield i
res2: List[Int] = List(1, 2)
Я думаю, for
занимает важное место в языке.Я могу судить по тому факту, что в книге, которую вы читаете, есть целая глава (23)!