我们可以在列表理解中使用嵌套for循环的背后原因是什么 [英] What is the under the hood reason that we can use nested for loops in list comprehensions
问题描述
我一直在研究列表理解,但几天来有些事情阻止了我。
简单的列表理解形式为
[expression for item in iterable]
等效的for
循环为
li=[]
for item in iterable
li.append(item)
如果我是对的,那么列表理解通常所做的就是迭代遍历可迭代对象,计算每次迭代的表达式,然后将其附加到列表中。
在for
循环中应该发生的任何事情都写在liscomp的开头。
我们可以认为,在listcomp中,Python只允许一个表达式,并且for
循环的套件只允许有if
子句或嵌套的for
循环。
引用我正在读的一本书的话说
因为列表理解产生列表,也就是可迭代的,并且列表理解的语法需要可迭代的,所以嵌套列表理解是可能的。这相当于嵌套了for … in
个循环。
这混淆了我的理解。
这说明了拥有像[s+z for s in iterable_1 for z in iterable_2]
这样的listcomp的原因吗?
有人能解释一下这是什么意思吗?
推荐答案
您的第一个翻译应该是
li=[]
for item in iterable:
li.append( expression )
您的示例[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)
祝贺你,你发现了.单子星!它们本质上就是您所描述的,泛化嵌套循环。
嵌套循环只产生简单的结果流。当展平时,嵌套的列表也会转换为普通的元素流。这就是相似之处。懒惰append
与yield
非常相似。
每个Monad类型由它如何实现其flatMap
函数的版本定义,该函数是一个映射,后跟生成的嵌套结构的展平。在每个嵌套级别上展平嵌套结构允许展平任意深度的嵌套:
M [M (a)] ==> M (a)
M [M [M (a)]] ==> # flatten the two outer layers first:
M [M (a)] ==> M (a)
OR:
==> # flatten the two inner layers first:
M [M (a)] ==> M (a)
看到区别了吗?什么都没有!任何执行上述操作的类型都是单子类型。喜欢列表。
循环也是如此,它可以嵌套到任意深度--两个、三个,不管是什么,都无关紧要。整个结构仍在一个接一个地产生结果,而这些是最里面的循环一个接一个地产生的结果。
那个是我们可以在列表理解中使用嵌套for
循环的背后原因。或者,用一种花哨的方式说同样的话,这是因为列表理解就像一元操作链(可以这样翻译)。
这篇关于我们可以在列表理解中使用嵌套for循环的背后原因是什么的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!