迭代在一行

时间:2009-12-08 15:31:45

标签: python

我有一些形式的代码:

for i in range(nIterations):
    y = f(y)

f是其他地方定义的函数。希望该代码的想法是,在运行y之后,fnIterations应用于{{1}}次。

python中有没有办法在一行中写这个?

11 个答案:

答案 0 :(得分:5)

像这样?

for i in range(nIterations): y = f(y)

带有一个命令的for循环可以写成一行。

修改

或者可能稍微清洁一点:

for _ in xrange(nIterations): y = f(y)

既然你不希望有一个可以分成两个单独的陈述的东西(我想),这是另一个陈述:

reduce(lambda y, _: f(y), xrange(nIterations), initValue)

不过,我建议只使用原始代码,这样更直观,更易读。另请注意Guido van Rossum对循环与repeat的说法。 请注意(在python 2.x中)xrange对于大型n迭代比range更有效,因为它返回实际的迭代器而不是已分配的列表。

答案 1 :(得分:2)

你喜欢这个吗?

for i in range(nIterations): y = f(y)

虽然这可能看起来很漂亮,但我认为(正如你的帖子下面的评论中所做的那样)提高了可读性,最好离开2行

答案 2 :(得分:0)

只需将其全部放在一行,如下所示:for i in range(nIterations): y = f(y)

将代码放在一行或多行上的决定多年来一直是一个争论 - 没有性能提升 - 只是说明你喜欢它以及如何能够最好地阅读它。< / p>

答案 3 :(得分:0)

您的问题缺少上下文,但可以使用map函数或列表理解(两个单行)重写

答案 4 :(得分:0)

不完全是一行,但是一旦为函数定义了电源操作:

def f_pow(f, n):
  if n == 1:
    return f
  else:
    return lambda x: f_pow(f, n-1)(f(x))

你可以这样写:

f_pow(f, nIterations)(y)

答案 5 :(得分:0)

reduce(lambda y,_: f(y),xrange(niterations),y)

答案 6 :(得分:0)

好的,这可能是一个非常奇怪的reduce函数难以理解的使用,所以对于真正的代码我会坚持你所拥有的。但只是为了它的乐趣,这里有:

reduce(lambda a, b: f(a), range(nIterations), y)

答案 7 :(得分:0)

如果你使y变为可变,那么你可以使用列表理解。但这不是我在实际代码中使用的东西,除非真的必要。

def f(y):
    y[0] += 5

y = [0]
[f(y) for _ in xrange(10)]
print y[0] # => 50

答案 8 :(得分:0)

虽然我建议您保留原始代码段,因为它更清晰,但您可以使用reduce函数通过一行代码完成此操作:

reduce(lambda a,b: f(a), xrange(nIterations), y)

答案 9 :(得分:0)

如果需要在循环内执行多条指令,可以使用分号; 创建此类代码段,这是一个示例:

for i in xrange(nIterations): x=f(i); y=f(x); z=f(y)

答案 10 :(得分:0)

y=[f(y) for i in range(niteration)]

希望有所帮助;)