2013-04-17 27 views
-1

這個簡單的循環工作得很好:Python:如何編寫一個函數,該函數使用它的一些參數循環遍歷自身?

>>> def loop (i): 
     i+=i 
     if 0<i<20: 
      print i 
      loop(i) 


>>> loop (1) 
2 
4 
8 
16 

但是這一次不工作,它意外退出循環:

>>> from functools import partial 
>>> def loop (i): 
     i+=i 
     if 0<i<20: 
      print i 
      partial(loop,i) 


>>> loop(1) 
2 
>>> 

什麼問題?有沒有一種解決方案,讓它以某種方式工作?

這只是一個簡單的功能... 我真正的問題是

問:如何編寫一個函數,它能夠遍歷自身,只有一些它的參數,每次?我應該看看其他地方(除部分)?

+0

tl; dr爲什麼不遞歸適合你? http://stackoverflow.com/a/479352/860635 –

回答

4

partial創建一個可調用的,所以..

def loop (i): 
     i+=i 
     if 0<i<20: 
      print i 
      partial(loop,i)() 
+0

完美。謝謝。 – Dusk

1

的問題是,你是在功能遞增i。不要增加i並在loop功能通過i-1: -

>>> def loop(i): 
...  if i>0 and i<20: 
...    print i 
...    loop(i-1) 

使用這種方法,當你運行你的函數,這裏是輸出: -

>>> loop(1) 
1 
>>> loop(2) 
2 
1 
>>> loop(3) 
3 
2 
1 
>>> loop(4) 
4 
3 
2 
1 
>>> loop(20) 
>>> loop(19) 
19 
18 
17 
16 
15 
14 
13 
12 
11 
10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
>>> 
1

不知道你想達到什麼樣的但部分並不實際運行該函數只構造並返回函數與你給出的參數'固定'

你需要這樣的東西來得到與你的第一個例子相同的結果:

>>> from functools import partial 
>>> def loop (i): 
     i+=i 
     if 0<i<20: 
      print i 
      partial(loop,i)() 
+0

是的,我認爲我忽略了在我的代碼中調用partial的部分。謝謝 – Dusk

1

partial給你回的一些已經設置其參數的函數 - 它實際上並沒有呼叫起作用的呢。你需要調用partial對象做到這一點:

>>> def foo(a, b): 
     print(a, b) 
>>> bar = partial(foo, 5) 
>>> bar 
functools.partial(<function foo at 0x01E1A348>, 5) 
>>> bar() 
Traceback (most recent call last): 
    File "<pyshell#6>", line 1, in <module> 
    bar() 
TypeError: foo() takes exactly 2 arguments (1 given) 
>>> bar(4) 
5 4 

正如你所看到的,partial這裏結合一個函數參數foo - 它需要一個功能和一些參數,並給出了回來,很多功能比原來少了的論點。您可以通過立即撥打partial(loop, i)()來調用該部分,但這與撥打loop(i)完全相同。這意味着這是你在這裏使用的錯誤工具 - partial主要用於你希望將可調用對象傳遞給另一個函數的情況(或者稍後將其設置爲稍後在代碼中使用)並設置一些(或全部) )是在您決定使用該函數時,而不是在最終調用時的參數。

+0

是的。我只是以簡單的循環功能爲例來說明我的問題。我不想將人們與外星人的功能混淆。謝謝。 – Dusk

相關問題