...超出參數的目的,這種非常基本的理解,事情變得比更復雜(但不多)。我將一般性地討論這些附加概念,並將它們應用於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
請**停止**重複詢問同一個問題。我把過去六個小時中提出的其他兩個(相同)問題合併爲一個。再次,不要**再次發佈這個問題。 –
爲什麼「倒票」?當然,這個問題有點弱,而初學者似乎並沒有花太多的時間來解決問題。從概念上來說,這個問題與StackOverflow非常相似,它確實對應於真正可能非非典型的障礙新手遇到的問題,因爲他們通過教程和其他書籍進行篩選,但缺乏正確的詞彙表。 (還有許多教程 - 這些基本概念的顯而易見的/常識的知識很容易理解)。讓我們都更「歡迎」! – mjv
@mjv我認爲downvotes是合理的,除了缺乏努力和重複發佈相同的問題,迫使我標記它並讓主持人合併它們之外,用戶明顯沒有閱讀FAQ。如果人們認爲這是無關緊要的話,那麼它就會被封閉,而不是被低估。這是一個糟糕的問題,對於一個問題來說不是一個壞主題,並且受到社區的如此的對待。 (我認爲,對於那些似乎是母語爲英語的人而言,也有一種偏見,但他們並沒有努力去使用這種語言,這肯定會讓我感到不適。) – agf