2012-02-08 54 views
1

我只是玩弄一些代碼,但它似乎具有硬編碼的特定數量的變量。我想知道如果它有可能使用未知數量的變量。是否可以引用未知數量的變量?

這裏是有問題的代碼示例,以澄清(它不是功能上自己的,只是把它從一個更大的代碼庫,以顯示我的意思):

def test(a,b,c,current_total): 
    a_range = range(0, target_sum + 1, a) 
    b_range = range(0, target_sum + 1, b) 
    c_range = range(0, target_sum + 1, c) 
    for i, j, k in itertools.product(a_range, b_range, c_range): 
     if i + j + k == current_total: 
      counter = counter +1 

正如你可以看到它有3個變量在代碼中被引用,但是如果變量的列表變量更大。例如,而不是[1,2,3],這是[1,2,3,4,5,6..]

我知道我可以找出有多少變量在新的列表(LEN(名單)),但我該怎麼從那裏做,如果我知道有N個變量中清單?有沒有辦法在for循環(和程序的其餘部分)中使用未知數量的變量?

+2

如果有支持對於未知數量的變量,他們將如何命名,以及如何知道他們的名字是什麼?通過猜測?這沒有意義。處理未知數值的經典方法是使用數組,列表或其他容器。 – 2012-02-08 00:41:38

+0

例如...?你如何計劃實施這樣的事情。我保證有另一種方式來做到這一點。 – 2012-02-08 00:44:07

回答

4

雖然你可能通過* args使用任意數量的參數,爲什麼不簡單地使用列表?我認爲這更自然。就像是:。

def test(vs, target_sum, current_total): 
    counter = 0 
    vranges = [range(0, target_sum+1, v) for v in vs] 
    for ivec in itertools.product(*vranges): 
     if sum(ivec) == current_total: 
      counter += 1 
    return counter 

[順便說一句,請注意,這只是一個例子。如果你真的想你給特定功能的結果,有更快的方法來計算它]

+0

非常感謝。我拿了這段代碼,把它變成了一個列表,並且意識到我不知道該怎麼做,於是我問道。我今天早上在*列表和**字幕上看到了一個YouTube視頻,但我沒有建立鏈接。我會玩弄它,但感謝你我正在尋找的東西。 Re:函數..我正在研究一個更好的可擴展,更快的解決方案,並且只是現在就修補其他代碼,以更好地理解發生了什麼(當遇到問題時,我會確定bug)。 。再次感謝您向我展示* vranges – Lostsoul 2012-02-08 00:59:20

+0

@Lostsoul:關於[unpacking參數列表](http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists)上的文檔可能會有所幫助。 – DSM 2012-02-08 01:01:16

+0

謝謝,我會檢查出來(並重新閱讀我的一些Python書籍) – Lostsoul 2012-02-08 01:02:15

1

只是因爲我已經寫了,這裏是一個使用*args一個解決方案:

>>> target_sum = 10 
>>> counter = 0 
>>> def test(current_total, *args): 
... global counter, target_sum 
... for t in itertools.product(*(range(0, target_sum + 1, x) for x in args)): 
...  if sum(t) == current_total: 
...  counter = counter + 1 
... 
>>> test(10, 1, 2, 3) 
>>> counter 
14 
>>> counter = 0 
>>> test(10, 1, 2, 3, 4, 5, 6) 
>>> counter 
35 
相關問題