我有一些形式的代码:
for i in range(nIterations):
y = f(y)
f
是其他地方定义的函数。希望该代码的想法是,在运行y
之后,f
将nIterations
应用于{{1}}次。
python中有没有办法在一行中写这个?
答案 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)]
希望有所帮助;)