我一直在研究列表理解,但几天来有些事情阻止了我。
简单的列表理解形式为
[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
循环的背后原因。或者,用一种花哨的方式说同样的话,这是因为列表理解就像一元操作链(可以这样翻译)。
上一篇:LINQ查询来获取在Silverlight列标题标题、LINQ、Silverlight
下一篇:SQL服务器&放大器; .NET支持调用存储过程与参数的值wihout提供参数的名字呢?参数、放大器、存储过程、名字