2015-02-06 56 views
1

我在編碼方面的經驗很少,我正在學習Python中的一個類。我正在學習條件語句和循環,並且被要求創建一個函數,它會接受任意數量的參數,並給我最大的幫助。很明顯,我不允許使用內置的max函數。在Python中取最大數量的參數

到目前爲止,我有:

def max(x): 
    current_max = x[1] 
    for i in x[i]: 
     if x[i] > current_max: 
      current_max = x[i] 

當我運行的代碼,它給了我沒有錯誤,但是當我嘗試運行MAX(),它會只接受一個參數。浮現在腦海中唯一的想法是中加:

x = input('Enter numbers to compare:') 

當我跑了這一點,我得到:

UnboundLocalError:「我」分配

之前引用局部變量,我不能確定的我可以做什麼在這一點上,因爲我不確定我是不是正確地定義了參數,或者在定義max(x)的代碼中有一個錯誤,因爲某些原因第一次沒有出現。

+0

只是一句話,隨機數的參數。你的函數只需要一個參數。 Python中的N-Arguments將是'max(* args)'。 – RedX 2015-02-06 07:11:45

+0

這很有趣,我不知道你可以做到這一點。我在定義函數時如何參考參數?所以,舉個例子,當我寫「for i in x」時,我會用什麼來代替「x」? – BRamses 2015-02-06 07:16:27

+0

這只是一個列表:'對於一個參數'。有關更多詳細信息,請參閱[本文](http://stackoverflow.com/questions/36901/what-does-double-star-and-star-do-for-python-parameters)。 – RedX 2015-02-06 07:19:43

回答

0

兩件事情:

1)在Python中,你需要添加一個single *在參數前面表示該參數實際上是一個參數列表。沒有那個*,你的功能只會期待一個參數。編輯:啊,我只是看到你實際上是傳遞一個列表對象到你的函數,在這種情況下,*是不需要的。如果您想支持諸如max(1,3,7,-4)的呼叫,那麼您確實需要*。

2)遍歷列表或任何其他「迭代」時,可以使用for item in list_of_items:迭代並檢查列表中的每個項目。這是在Python中一直使用的,並且是像這樣的情況下迭代遍歷arg列表的首選方式(即Pythonic方式)。

下面是一個例子最大功能設備結合起來(並支持呼叫如max(1,5,7,3)

def max(*x): 
    current_max = x[0] # Note we're assuming at least one argument was passed in. What if nothing was passed in? 
    for i in x: 
     if i > current_max: 
      current_max = i 
    return current_max 

而這裏的支持呼叫的例子max函數如max([1,5,7,3])

def max(x): 
    current_max = x[0] # Note we're assuming at least one argument was passed in. What if nothing was passed in? 
    for i in x: 
     if i > current_max: 
      current_max = i 
    return current_max 

僅供參考我的例子並不是解決這個問題的最佳解決方案,所以我建議你擴展它們以獲得最終解決方案

+0

謝謝你的兩個例子。我沒有想過簡單地輸入x作爲列表。這也說明了如何很好地使用* x。非常感激! – BRamses 2015-02-06 07:36:36

0

x [i]在循環被編譯器處理之前執行,因此如果不事先聲明而試圖通過x [i]循環將導致錯誤。

鑑於其中x是列表X = [1,2,3,4]下面應該工作

def max(x): 
    current_max = x[0] 
    for i in x: 
     if i > current_max: 
      current_max = i 
    return current_max 


x = [1,2,3,4] 
print max(x) 
+0

啊,好吧。我明白爲什麼我現在得到錯誤,謝謝。然而,我嘗試了這個,最終告訴我元組索引超出範圍。分配x = [1,2,3,4]只是改變了類型,但仍然給了我相同的錯誤。 (列表索引超出範圍) – BRamses 2015-02-06 07:11:53

+0

道歉。現在試試我的例子。 – 2015-02-06 07:16:54

+0

如果'x'是空的,該怎麼辦? – 2015-02-06 07:19:14

0

Y我們的算法會起作用,但有兩個小問題。首先,迭代數組存在問題。通常你根本不需要索引,只是做:

some_list = [1, 2, 3] 
for item in some_list: 
    print item 
# Will print 1, then 2 and finally 3 

你也需要返回current_max當你與你的循環完成。

重用內置函數的名稱並不是一個好主意,所以我把它稱爲my_max或類似的東西。如果你還需要檢查你的論點,並添加一個文檔字符串,你會這樣結束了:

def my_max(x): 
    """ Return the biggest item in an iterable. """ 

    if len(x) == 0: 
     raise ValueError("my_max() arg is an empty sequence") 

    current_max = x[0] 

    for i in x: 
     if i > current_max: 
      current_max = i 

    return current_max 

如果你喜歡一個功能的編碼風格,你可以使用reduce到您的列表減少的最大因素。簡單地定義返回的最大元素的拉姆達:

def my_max(xs): 
    return reduce(lambda x, y: x if x > y else y, xs) 

如果你想知道如何Python的內置max定義,它實際上是用C語言編寫像許多Python的內置功能。如果你好奇,你可以check it out on GitHub。在內部,它的工作原理與min一樣,因爲使用稱爲PyObject_RichCompareBool的比較可以以不同方式比較兩個對象(更少,更少或相等,不等於,...)