我一直在研究列表理解,有件事让我停了好几天。
一个简单的列表理解有这样的形式
[expression for item in iterable]
相当于 for
循环是
li=[]
for item in iterable
li.append(item)
如果我没看错的话,一般来说,列表理解的做法是对可迭代的对象进行迭代,对每次迭代的表达式进行评估,然后将其追加到列表中。
无论在 for
循环写在liscomp的开头。
我们可以认为,在一个listcomp中,Python只允许一个表达式和 for
襻的衣服只允许有一个。if
嵌套 for
循环。
引用我在看的一本书上的说法是
由于列表理解会产生列表,也就是可迭代,而且列表理解的语法需要一个可迭代,所以可以嵌套列表理解。这相当于有嵌套的
for … in
循环。
这让我的理解很混乱。
这是否说了有一个listcomp这样的原因?[s+z for s in iterable_1 for z in iterable_2]
谁能给我解释一下这说的是什么。
你的第一个翻译应该是
li=[]
for item in iterable:
li.append( expression(item) )
你的例子 [s+z for s in iterable_1 for z in iterable_2]
译为
li=[]
for s in iterable_1:
for z in iterable_2:
li.append(s+z)
恭喜你,你发现了......单片机!这基本上就是你所描述的。嵌套环.
嵌套循环只是产生一个普通的结果流。嵌套 列表当 扁平化,也变成了一个普通的元素流。这就是相似性。A 懒惰 append
差不多 yield
.
每个单体类型都是由它如何实现的 其版本 的 flatMap
函数,这是一个映射,然后是嵌套结构的扁平化。嵌套结构在每个嵌套层次上的扁平化,可以实现一个 任意 窝的深度要平整。
M [M (a)] ==> M (a)
M [M [M (a)]] ==> # flatten the outer two layers first:
M [M (a)] ==> M (a)
OR:
==> # flatten the inner two layers first:
M [M (a)] ==> M (a)
看到区别了吗?没有任何区别! 凡是能做到以上几点的类型,都是 "单体"。像列表一样。
循环也是如此,它可以被嵌套到一个任意的深度--两个,三个,不管是什么,这都不重要。
那 是我们可以使用嵌套的底层原因。for
列表理解中的循环--因为列表理解就像单项操作链一样(可以这样翻译)。