我有形式的一些代碼:迭代在一行
for i in range(nIterations):
y = f(y)
哪裏f
是別處定義的函數。希望該代碼的想法是,運行後y
將有f
適用於它nIterations
次。
python有沒有辦法在一行寫這個?
我有形式的一些代碼:迭代在一行
for i in range(nIterations):
y = f(y)
哪裏f
是別處定義的函數。希望該代碼的想法是,運行後y
將有f
適用於它nIterations
次。
python有沒有辦法在一行寫這個?
是這樣的?
for i in range(nIterations): y = f(y)
帶有一個命令的for循環可以寫成單行。
編輯
或許稍微乾淨:
for _ in xrange(nIterations): y = f(y)
既然你不希望有一個東西,可以分成兩個單獨的語句(我認爲),這裏的另一個問題:
reduce(lambda y, _: f(y), xrange(nIterations), initValue)
不過,我會建議只需使用你原來的代碼,whic h更加直觀和可讀。還請注意Guido van Rossum必須在循環中說與repeat
。 請注意(在python 2.x中)xrange
對於大型nIterations比range
更有效,因爲它返回實際的迭代器而不是分配的列表。
+1 - 我認爲,儘管OP想要做什麼,但有一種python的方式。 – KevinDTimm 2009-12-08 15:36:56
哈哈。不,你所做的一切都是取消了回報,在我的腦海中,它仍然是「那裏」,還有兩條分開的線路。我只是把它作爲一個荒謬的練習,哈哈,並且想知道是否有辦法做到這一點。 – VolatileStorm 2009-12-08 15:37:48
是的,我只消除了你的回報。現在是一條線。你還想要什麼;) – catchmeifyoutry 2009-12-08 15:39:06
那麼這樣的你是什麼意思?
for i in range(nIterations): y = f(y)
雖然這看起來不錯,很漂亮,我要說的(如已在下面的文章的評論已完成),這不提高可讀性,並且是最好關閉左爲2行。
只要堅持這一切就這樣一行:for i in range(nIterations): y = f(y)
爲一條線或多個代碼的決定多年來一直是一個爭論 - 沒有性能提升 - 只是躺在出來你喜歡它以及如何你可以讀得最好。
你的問題缺乏背景下,但是這可能使用map
功能或列表理解(均爲單行)
如何使用列表解析來重寫?這是我正在尋找的。 – VolatileStorm 2009-12-08 15:41:37
這是錯誤的,重新閱讀這個問題。 – SilentGhost 2009-12-08 15:41:40
它可以用'reduce'重寫,但不能用'map'或列表理解。 – sth 2009-12-08 15:43:11
不完全是一條線被改寫,但一旦你定義功能的功耗工作:
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)
reduce(lambda y,_: f(y),xrange(niterations),y)
好吧,這可能是一個非常奇怪的使用reduce
函數,所以對於真正的代碼,我會堅持你所擁有的。但只是爲了樂趣,這裏有雲:
reduce(lambda a, b: f(a), range(nIterations), y)
如果您y
可變的,那麼你可以使用列表理解。但這不是我真正使用的代碼,除非需要確實。
def f(y):
y[0] += 5
y = [0]
[f(y) for _ in xrange(10)]
print y[0] # => 50
雖然我建議你保持原有的代碼片段,因爲它是更清晰,你可以用一個單一的代碼行中使用減少功能實現這一點:
您可以創建這樣的使用分號的片段;如果需要執行循環內多於一個的指令,這裏有一個例子:
for i in xrange(nIterations): x=f(i); y=f(x); z=f(y)
爲什麼你要在一行寫這? – SilentGhost 2009-12-08 15:34:00
如果您在控制檯上進行交互式操作,這可能會很有用。單行者往往更容易在python控制檯中複製粘貼。 – Kena 2009-12-08 15:36:33
否則,這似乎是一個壞主意。 – Kena 2009-12-08 15:37:17