2011-08-16 276 views
0

什麼是[函數]參數?他們用於什麼?
最近我開始學習Python;我是編程新手,我對這個基本問題表示歉意。函數參數(以Python爲例)

在每一個Python教程中,我都會通過他們談論參數。  我已經找到了這個問題的答案,並找到了很多答案,但他們只是有點太難以讓我忽略。我可能會錯過一些概念背景。
所以......當我定義一個函數時,括號裏用到的是什麼? 例子:

def hi(This is the part that i dont get): 
    print 'hi' 

編輯:
兩個與此相關的一個後續問題後來被關閉,在這裏融合,因此一些答案的部分外的背景特徵。
的後續問題是:[意譯]

+2

請**停止**重複詢問同一個問題。我把過去六個小時中提出的其他兩個(相同)問題合併爲一個。再次,不要**再次發佈這個問題。 –

+1

爲什麼「倒票」?當然,這個問題有點弱,而初學者似乎並沒有花太多的時間來解決問題。從概念上來說,這個問題與StackOverflow非常相似,它確實對應於真正可能非非典型的障礙新手遇到的問題,因爲他們通過教程和其他書籍進行篩選,但缺乏正確的詞彙表。 (還有許多教程 - 這些基本概念的顯而易見的/常識的知識很容易理解)。讓我們都更「歡迎」! – mjv

+0

@mjv我認爲downvotes是合理的,除了缺乏努力和重複發佈相同的問題,迫使我標記它並讓主持人合併它們之外,用戶明顯沒有閱讀FAQ。如果人們認爲這是無關緊要的話,那麼它就會被封閉,而不是被低估。這是一個糟糕的問題,對於一個問題來說不是一個壞主題,並且受到社區的如此的對待。 (我認爲,對於那些似乎是母語爲英語的人而言,也有一種偏見,但他們並沒有努力去使用這種語言,這肯定會讓我感到不適。) – agf

回答

10

簡而言之,它們是「傳入」函數以告訴它該做什麼的數據。維基百科有詳細信息。

http://en.wikipedia.org/wiki/Function_argument

比如你hi()功能可能需要知道誰打招呼:

def hi(person): 
    print "Hi there " + person + ", how are you?" 

或數學函數可能需要一個值進行操作:

def square(x): 
    return x * x 
1

在你的例子中,它們不被使用。

如果你的函數根據你給的參數需要有不同的行爲,那麼參數是什麼。

def hi_name(name): 
    print 'Hi ' + name 

hi_name("John doe") 

這會打印出「Hi John Doe」。

現在回到關於functions的基礎知識。

0

如果您無法向他們提供他們應該處理的信息,那麼這些功能將毫無用處。
參數就是這樣的信息。

def GiveMeANumberAndIDuplicateIt(x): 
    return x * 2 

def DontGiveMeAnythingAtAll(): 
    return None 
5

這不是一個Python問題,而是一個泛型編程問題。一個非常基本的。


前回答這個問題有關參數,並鑑於你問的其他問題,是非常有用的討論變量概念。
變量是一個指定的內存塊,其中可以存儲和檢索底層程序感興趣的信息。換句話說,它是程序員選擇的與其內容相關聯的符號名稱。使用通常被稱爲賦值的各種語言結構,程序員可以讀取或寫入變量的內容。
需要注意的是,當編寫程序時,變量的值(即內容)不需要定義。只有在運行時才需要。這允許程序描述在符號元素上執行的操作,而不知道這些元素具有的值。考慮這個片段中,一個更大的計劃的一部分:

# ... some logic above 
ball_volume = 4.0/3 * math.pi * ball_radius 
if ball_volume > 200: 
    print ("Man, that's a big ball") 
# ... more logic below 

在程序寫入一個不需要知道ball_radius的實際值的時間;然而,假設這個變量將包含某個假設球的數值,那麼這個片段能夠描述如何計算球的體積。在這種方式下,當程序運行時,以某種方式(稍後更多)ball_radius變量已經初始化爲一個適當的值,變量ball_volume也可以被初始化和使用,這裏在條件語句(if)中,並可能在下面。 (在某些情況下,變量可能會超出範圍,但這個概念控制程序可以訪問特定變量的時間遠遠超出了本指南)。
在某些語言中,可能與特定變量關聯的數據類型需要明確定義,並且不能更改。例如,一些變量可以只保存整數值,其他變量字符串值(文本)等。在Python中沒有這樣的限制,變量可以被分配並重新分配給任何類型的數據,但是當然,程序員需要爲了避免將某些文本數據傳遞給數學函數,請記住這一點。

存儲在變量內部的數據可能來自完全不同的來源。教程和介紹性文檔中提供的許多示例都有這些數據來自鍵盤輸入(就像您在某些問題中提到的使用raw_input時一樣)。這是因爲它允許人們嘗試使用這些教程片段進行交互式測試。但是,如果變量只從交互式用戶輸入中獲取數據,那麼程序的用處就會相當有限。還有許多其他的來源,這是什麼使得編程如此強大:變量可以與從數據初始化:

  • 數據庫
  • 文本文件或各種文本基格式(XML,JSON,CSV ..)
  • 二進制文件與各種格式
  • 互聯網連接
  • 物理設備:攝像機,溫度傳感器...

簡而言之,參數,也稱爲Parameters,是變量傳遞給[通常]用於提供從功能不同的輸出和行爲功能。例如:

>>> def say_hello(my_name): 
... print("Hello,", my_name, "!") 

>>> say_hello("Sam") 
Hello, Sam ! 
>>> customer_name = "Mr Peter Clark" #imagine this info came from a database 
>>> # ... 
>>> say_hello(customer_name) 
Hello, Mr Peter Clark ! 
>>> 

在上面的例子中,是my_name就像say_hello功能的任何局部變量;這允許函數定義在運行時調用函數時將使用底層值執行的操作。
在運行時,可以使用立即值(邏輯中的「硬編碼」值,如示例中的"Sam")或[另一個變量的值(如customer_name)。在這兩種情況下,函數的my_name變量的值分別被賦予一些值,分別爲「Sam」和「Mr Peter Clark」。在後一種情況下,該值是customer_name變量包含的值。請注意,函數內部使用的變量(my_name)和函數調用時(customer_name)的名稱的不需要相同。 (這些被稱爲「形式參數(S)」,並分別在「實際參數」)

注意的是,雖然作爲作爲輸入傳遞給函數,在某些情況下通常最論點,他們可用作輸出,即在調用該函數的邏輯級別提供新的/修改的值。這樣做需要使用,或明或暗地,適當調用約定規範(見下文Argument passing conventions)現在


...超出參數的目的,這種非常基本的理解,事情變得比更復雜(但不多)。我將一般性地討論這些附加概念,並將它們應用於Python進行說明。對於參數

默認值(又名「可選」的參數)
當函數聲明它可以指定某些參數的默認值。這些值用於調用函數時未指定的參數。由於顯而易見的原因,這些可選參數,在參數列表的末尾找到(否則語言編譯器/解釋器可能找出困難哪個參數是...)

>>> def say_hello(dude = "Sir"): 
...  print("Hello,", dude, "!") 
... 
>>> say_hello() 
Hello, Sir ! 
>>> say_hello("William Gates") 
Hello, Bill !   #just kidding ;-) 
Hello, William Gates ! # but indeed. works as the original function when param 
         # is specified 

的參數變量數
在某些情況下,定義一個函數可能會很方便,以便它可以接受可變數量的參數。儘管這些參數值列表最終會在某種容器(列表,數組,集合等)中傳遞,但各種語言提供了訪問此類參數值的便捷方法。

>>> def add_many(operand1, *operands): 
... Sum = operand1 
... for op in operands: 
...  Sum += op 
... return Sum 
... 
>>> add_many(1, 3, 5, 7, 20) 
36 
>>> add_many(1, 3) 
4 

命名參數(關鍵參數)
Python和一些其他語言,也可以調用函數時明確命名的參數。因此,參數傳遞默認基於位置基礎(「第一個參數,第二個參數等),Python會讓你命名參數並以任意順序傳遞它們。這主要是一個句法的精確性,但是可以是有用的,與默認參數爲接受很多參數的函數,它也是一個很好的自我記錄功能。

>>> def do_greetings(greeting, person): 
... print (greeting, "dear", person, "!") 
... 
>>> do_greetings(person="Jack", greeting="Good evening") 
Good evening dear Jack ! 

在Python中,你甚至可以通過一本字典,以代替例如幾個命名參數,與do_greetingsas-是,想象你有這樣一本字典:

>>> my_param_dict = {"greeting":"Aloha", "person":"Alan"} 

>>> do_greetings(**my_param_dict) 
Aloha dear Alan ! 

在最後,雖然傳遞參數的花哨方式,而ca已具備的方法來處理可變數量的參數是各種語言的實用功能,兩個關鍵的概念需要提及:

參數傳遞約定:通過值或引用
到目前爲止,所有的功能,我們使用沒」 t改變傳遞給它們的參數的值。我們可以想象,無論是功能可能需要這麼做的很多實例,或者是對上述值執行一些轉換或計算,還是爲了其自身的內部使用,或者是爲了有效地改變變量的值,以使得變化反映在級別上的稱爲函數的邏輯。這就是參數傳遞約定得心應手的地方......
通過值傳遞的參數可能會被其自身內部計算的函數改變,但在調用方法級別上不會改變。
通過引用通過引用的參數將反映在調用方法級別對它們所做的更改。
每種語言都指定參數傳遞的方式。典型的慣例是按值傳遞整數,數值和其他基本類型,並通過引用傳遞對象。大多數語言還提供允許更改其默認約定的關鍵字。

在python中,所有參數都通過引用傳遞。然而,一些變量類型是不可變的(數字,字符串,元組...),因此它們不能被函數改變。

隱「自」或「這個」的類的方法
在面向對象的語言中,(a類內即函數)的方法參數接收一個額外的參數是基本的對象的值(類的實例),允許該方法在其計算中使用該類的各種屬性成員和/或更改其中一些屬性的值。

在Python中,此參數在方法定義的級別聲明,但隱式傳遞。被宣佈後,它可能會被命名爲大多數人希望的東西,但按照慣例,這通常被稱爲self

>>> class Accumulator: 
... def __init__(self, initialValue = 0): 
...  self.CurValue = initialValue 
... def Add(self, x): 
...  self.CurValue += x 
...  return self.CurValue 
... 
>>> my_accu = Accumulator(10) 
>>> my_accu.Add(5) 
15 
>>> my_accu.Add(3) 
18 
+0

好的答案......雖然我害怕在這種情況下,你很快就會遇到複雜的問題,而在這種情況下,許多討論基礎的段落就是所謂的。 –

+0

@Nate,你可能是對的。考慮到人們進一步混淆的風險,鑑於OP問到的其他問題,我增加了更多細節,特別是關於'變量'概念。它可能沒有幫助,但是再次,你看起來像我的頭像;-) – mjv

2

圓括號中的內容稱爲參數。基本上這些是你想要的功能的變量。例如,假設您有一個功能,並且您希望它在打電話時打印一個單詞。有了參數,你可以定義那個詞將是什麼。這裏有一個例子:

def hi(word): 
    print word 

現在,如果我做這樣的事情:

hi('Hello!') 

它將打印:

'Hello!' 

喜()被傳遞'Hello!'爲一個名爲word變量,然後打印該單詞。

+0

謝謝你簡單地解釋它。 –

5

在使用參數的情況下,它只是演示如何使用它們,而不是像您演示的那樣最有效。函數非常有用。例如,如果我想補充兩個數字:

def add(num1, num2): 
    x = num1 + num2 
    return x 
add(1,3) 

功能是執行重複性任務非常有用,讓我們在你的例子說你有打招呼數百名,而不必做raw_input()的環函數來讀取它們的名字並添加一些文本,你可以簡單地調用一個函數來執行任務並傳遞參數(人名)。

根據你的第二個問題,參數只是傳遞給函數的變量,所以無論你從外部傳遞給它的變量,例如我將數字1和3傳遞給函數內部的函數add,簡稱爲num1 num2

在你的情況與傳遞的參數太多會產生這樣的:

>>> add(1,2) 
3 
>>> add(1,2,3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: add() takes exactly 2 arguments (3 given) 
>>> 

祝您好運!並隨時如果您需要進一步的幫助(sbrichards(AT)mit.edu)

1

的說法是,只存在於該函數的特殊變量來拍我的電子郵件。

在您的例子,你有一個函數,需要兩個參數:

def add(num1,num2): 
    x = num1 + num2 
    return x 

當我打電話與add()這個功能,我一定要在括號中添加什麼,我想num1num2是。在你的情況下,你有13,所以你把它叫做這個add(1,3)

什麼你說還有就是你要調用add()和你想的第一個參數,num1等於1,並且第二個參數,num2,等於3

0

如果arg是mutable對象,也可以使用它作爲一個輸出的容器中,例如像這樣:

def sort_my_arg(foo) 
    foo.sort() 

x = [1, 3, 2] 
sort_my_arg(x) 
print x 

另一種優雅的使用我所看到的是使用可變容器作爲默認的說法,這是在函數定義時創建的,所以,對於耗時的計算,你可以使用它像一個緩存..

def complicated_calculation(x, cache={}) 
    if cache.has_key(x): 
    # we have already computed this one 
    pass 
    else: 
    # complete some complicated deterministic calculation, and add it to cache 
    # ... 
    cache[x] = result 
    return cache[x]