Python在函数参数内迭代

时间:2014-09-16 19:46:56

标签: python

我知道我已经看过(可能只在其他语言中)你可以在函数参数中使用for循环。我忘了它的名字,但是为了让我的代码更小,我想尝试一下。对于那些不知道我在说什么的人,它就是这样的:

math.sum(for i in range(5)) # Just an example; code will probably not work

或类似的东西?我不确定它是如何工作的,但我打算学习。我知道有这样一个名字的名字,但我已经忘记了它是什么。谁能给我一些指示,或者我是疯了,这在python中不存在?

2 个答案:

答案 0 :(得分:2)

“for循环作为表达式”通常被称为“理解”,至少在Haskell,Python和受其启发的其他语言中。

阅读教程中的List Comprehensions以了解该想法。还有一些理解和词典理解,一旦你获得了列表理解,就会非常明显。

然后有生成器表达式,这有点棘手 - 但更酷。在您第一次阅读Iterators,然后Generators,然后Generator Expressions是下一部分之前,您不会理解这些内容。

为什么生成器表达式很酷,但David Beazley explains that masterfully仍然不清楚。


要将代码翻译成实际代码,您只需要:

math.sum(i for i in range(5))

但是,你所要求的是“range(5)的所有元素,你可以更容易地做到这一点:

math.sum(range(5))

为什么呢?因为range已经是一个可迭代的对象。*如果不是,那么根据定义,你不能在for循环中使用它。 除非你有一些表达式要对每个元素执行,或者有一个if子句来过滤循环,或者多个for子句用于嵌套循环,所以理解不会给你带来什么。所以,这里有一些更有用的例子:

math.sum(i*i for i in range(5))
math.sum(i for i in range(5) if i%3 != 0)
math.sum(j for i in range(5) for j in range(i))

*从技术上讲,你要求{em>迭代器覆盖range(5)中的所有元素,而不仅仅是迭代它们。对于for循环来说无关紧要,但是如果你需要一些可以手动调用next的东西,让它记住它当前的位置等等,它确实如此。在这种情况下,您想要的是iter(range(5))


你的理解恰好是一个函数参数的事实在这里几乎完全无关紧要。您可以在任何可以使用表达式的地方使用它们:

squares_to_5 = (i*i for i in range(5)) # often useful
for square in (i*i for i in range(5)): # silly, but legal

但是,请注意,生成器表达式需要放在括号内。在特殊情况下,生成器表达式是函数的唯一参数,因此它已经在括号中,您可以保留额外的括号。

答案 1 :(得分:1)

您正在考虑列表推导和生成器表达式。

这可以在Python中使用,只需稍作修改:

sum(i for i in range(5))

这是关于生成器的开创性工作:http://www.dabeaz.com/generators/

从技术上讲,它们与你将它们用作函数参数完全无关:

x = (i for i in range(5))
evens = [i for i in range(100) if i % 2 == 0]
even_squares = [i**2 for i in evens]