2009-12-08 43 views
0

我有形式的一些代碼:迭代在一行

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

哪裏f是別處定義的函數。希望該代碼的想法是,運行後y將有f適用於它nIterations次。

python有沒有辦法在一行寫這個?

+5

爲什麼你要在一行寫這? – SilentGhost 2009-12-08 15:34:00

+0

如果您在控制檯上進行交互式操作,這可能會很有用。單行者往往更容易在python控制檯中複製粘貼。 – Kena 2009-12-08 15:36:33

+0

否則,這似乎是一個壞主意。 – Kena 2009-12-08 15:37:17

回答

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) 

不過,我會建議只需使用你原來的代碼,whic h更加直觀和可讀。還請注意Guido van Rossum必須在循環中說與repeat。 請注意(在python 2.x中)xrange對於大型nIterations比range更有效,因爲它返回實際的迭代器而不是分配的列表。

+0

+1 - 我認爲,儘管OP想要做什麼,但有一種python的方式。 – KevinDTimm 2009-12-08 15:36:56

+0

哈哈。不,你所做的一切都是取消了回報,在我的腦海中,它仍然是「那裏」,還有兩條分開的線路。我只是把它作爲一個荒謬的練習,哈哈,並且想知道是否有辦法做到這一點。 – VolatileStorm 2009-12-08 15:37:48

+0

是的,我只消除了你的回報。現在是一條線。你還想要什麼;) – catchmeifyoutry 2009-12-08 15:39:06

2

那麼這樣的你是什麼意思?

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

雖然這看起來不錯,很漂亮,我要說的(如已在下面的文章的評論已完成),這提高可讀性,並且是最好關閉左爲2行。

0

只要堅持這一切就這樣一行:for i in range(nIterations): y = f(y)

爲一條線或多個代碼的決定多年來一直是一個爭論 - 沒有性能提升 - 只是躺在出來你喜歡它以及如何可以讀得最好。

0

你的問題缺乏背景下,但是這可能使用map功能或列表理解(均爲單行)

+0

如何使用列表解析來重寫?這是我正在尋找的。 – VolatileStorm 2009-12-08 15:41:37

+0

這是錯誤的,重新閱讀這個問題。 – SilentGhost 2009-12-08 15:41:40

+0

它可以用'reduce'重寫,但不能用'map'或列表理解。 – sth 2009-12-08 15:43:11

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) 
0

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

0

好吧,這可能是一個非常奇怪的使用reduce函數,所以對於真正的代碼,我會堅持你所擁有的。但只是爲了樂趣,這裏有雲:

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

如果您y可變的,那麼你可以使用列表理解。但這不是我真正使用的代碼,除非需要確實

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

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

雖然我建議你保持原有的代碼片段,因爲它是更清晰,你可以用一個單一的代碼行中使用減少功能實現這一點:

​​
0

您可以創建這樣的使用分號的片段;如果需要執行循環內多於一個的指令,這裏有一個例子:

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

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

希望幫助;)

+0

這是錯誤的,重新閱讀這個問題 – SilentGhost 2009-12-08 16:51:08