Python 有一堆有用的內(nèi)置函數(shù),你可以用它來做各種事情。每個(gè)函數(shù)都能都執(zhí)行特定的任務(wù)。但是您知道 Python 還允許您定義自己的函數(shù)嗎?本文將向您展示如何創(chuàng)建和調(diào)用您自己的 Python 函數(shù)。它還將為您概述如何將輸入?yún)?shù)和參數(shù)傳遞給您的函數(shù)。
什么是函數(shù)?
函數(shù)是執(zhí)行特定任務(wù)的隔離代碼塊。
函數(shù)在編程中很有用,因?yàn)樗鼈兿嗽谡麄€(gè)程序中不必要和過多的代碼復(fù)制和粘貼。
如果在不同的地方經(jīng)常需要某個(gè)動(dòng)作,這是一個(gè)很好的指標(biāo),你可以為它編寫一個(gè)函數(shù)。函數(shù)是可重用的。
函數(shù)還有助于組織您的代碼。
如果您需要進(jìn)行更改,則只需更新該特定功能。這使您不必通過復(fù)制和粘貼來搜索分散在程序中不同位置的相同代碼的不同部分。
這符合軟件開發(fā)中的 DRY(不要重復(fù)自己)原則。
函數(shù)內(nèi)的代碼僅在函數(shù)被調(diào)用時(shí)運(yùn)行。
函數(shù)可以接受參數(shù)和默認(rèn)值,并且在代碼運(yùn)行后可能會或不會將值返回給調(diào)用者。
如何在 Python 中定義函數(shù)
在 Python 中創(chuàng)建函數(shù)的一般語法如下所示:
def function_name(parameters):
function body
讓我們分解一下這里發(fā)生的事情:
- def 是一個(gè)關(guān)鍵字,告訴 Python 正在定義一個(gè)新函數(shù)。
- 接下來是您選擇的有效函數(shù)名稱。有效名稱以字母或下劃線開頭,但可以包含數(shù)字。單詞是小寫的并用下劃線分隔。重要的是要知道函數(shù)名不能是 Python 保留關(guān)鍵字。
- 然后我們有一組左括號和右括號,()。在它們內(nèi)部,可以有零個(gè)、一個(gè)或多個(gè)可選的逗號分隔參數(shù)及其可選的默認(rèn)值。這些被傳遞給函數(shù)。
- 接下來是一個(gè)冒號,:結(jié)束函數(shù)的定義行。
- 然后是一個(gè)新行,后跟縮進(jìn)級別(您可以使用鍵盤或使用 1 個(gè) Tab 使用 4 個(gè)空格來執(zhí)行此操作)??s進(jìn)很重要,因?yàn)樗?Python 知道哪些代碼將屬于函數(shù)。
- 然后我們有函數(shù)的主體。這里是要執(zhí)行的代碼 - 調(diào)用函數(shù)時(shí)要執(zhí)行的操作的內(nèi)容。
- 最后,函數(shù)體中有一個(gè)可選的return 語句,在函數(shù)退出時(shí)將一個(gè)值傳回給調(diào)用者。
請記住,如果您在嘗試定義新函數(shù)時(shí)忘記了括號()或冒號:,Python 將報(bào)錯(cuò):SyntaxError.
如何在 Python 中定義和調(diào)用基本函數(shù)
下面是一個(gè)沒有 return 語句并且不接受任何參數(shù)的基本函數(shù)的示例。
它只是hello world在被調(diào)用時(shí)打印。
def hello_world_func():
print("hello world")
一旦定義了函數(shù),代碼就不會自行運(yùn)行。
要執(zhí)行函數(shù)內(nèi)的代碼,您必須進(jìn)行函數(shù)調(diào)用或函數(shù)調(diào)用。
然后,您可以根據(jù)需要多次調(diào)用該函數(shù)。
要調(diào)用一個(gè)函數(shù),你需要這樣做:
function_name(arguments)
這是代碼的細(xì)分:
- 鍵入函數(shù)名稱。
- 函數(shù)名后面必須跟括號。如果有任何必需的參數(shù),它們必須在括號中傳遞。如果函數(shù)不接受任何參數(shù),您仍然需要括號。
要調(diào)用上面示例中不接受任何參數(shù)的函數(shù),請執(zhí)行以下操作:
hello_world_func()
#Output
#hello world
如何定義和調(diào)用帶參數(shù)的函數(shù)
到目前為止,您已經(jīng)看到了一些簡單的函數(shù),除了向控制臺打印一些東西之外,它們實(shí)際上并沒有做太多事情。
如果你想向函數(shù)傳遞一些額外的數(shù)據(jù)怎么辦?
我們在這里使用了參數(shù)等術(shù)語。
他們的定義究竟是什么?
參數(shù)是將信息傳遞給函數(shù)的命名占位符。
它們充當(dāng)在函數(shù)定義行中本地定義的變量。
def hello_to_you(name):
print("Hello " + name)
在上面的例子中,有一個(gè)參數(shù),name。
我們可以使用f-string formatting它來代替——它的工作方式與前面的例子相同:
def hello_to_you(name):
print(f"Hello {name}")
括號內(nèi)可以有一個(gè)參數(shù)列表,所有參數(shù)都用逗號分隔。
def name_and_age(name,age):
print(f"I am {name} and I am {age} years old!")
這里,函數(shù)中的參數(shù)是name和age。
當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),參數(shù)被傳入。
參數(shù)與參數(shù)一樣,是傳遞給函數(shù)的信息。
特別是,它們是與函數(shù)定義中的參數(shù)對應(yīng)的實(shí)際值。
調(diào)用上一個(gè)示例中的函數(shù)并傳入?yún)?shù)將如下所示:
def hello_to_you(name):
print(f"Hello {name}")
hello_to_you("Timmy")
#Output
# Hello Timmy
該函數(shù)可以被多次調(diào)用,每次傳入不同的值。
def hello_to_you(name):
print(f"Hello {name}")
hello_to_you("Timmy")
hello_to_you("Kristy")
hello_to_you("Jackie")
hello_to_you("Liv")
#Output:
#"Hello Timmy"
#"Hello Kristy"
#"Hello Jackie"
#"Hello Liv"
到目前為止提出的參數(shù)稱為位置參數(shù)。
非常需要所有位置參數(shù)。
位置參數(shù)的數(shù)量很重要
調(diào)用函數(shù)時(shí),需要傳入正確數(shù)量的參數(shù),否則會報(bào)錯(cuò)。
對于位置參數(shù),傳遞給函數(shù)調(diào)用的參數(shù)數(shù)量必須與函數(shù)定義中的參數(shù)數(shù)量完全相同。
您不能遺漏任何內(nèi)容或添加任何內(nèi)容。
假設(shè)您有一個(gè)接受兩個(gè)參數(shù)的函數(shù):
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
如果只傳入一個(gè)參數(shù)調(diào)用函數(shù),像這樣,會出現(xiàn)錯(cuò)誤:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy")
輸出:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello_to_you() missing 1 required positional argument: 'last_name'
如果在傳入三個(gè)參數(shù)的情況下調(diào)用該函數(shù),則會再次出現(xiàn)錯(cuò)誤:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy","Jones",34)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello_to_you() takes 2 positional arguments but 3 were given
如果我們不傳入任何參數(shù),也會出現(xiàn)錯(cuò)誤。
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello_to_you() missing 2 required positional arguments: 'first_name' and 'last_name'
相反,我們需要兩個(gè)參數(shù),因?yàn)楹瘮?shù)定義中列出了兩個(gè)參數(shù)。
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy","Jones")
#Output:
# Hello,Timmy Jones
位置參數(shù)的順序很重要
除了包括正確數(shù)量的參數(shù)外,重要的是要注意參數(shù)傳遞的順序很重要。
參數(shù)的傳遞順序必須與函數(shù)定義中聲明的參數(shù)的順序完全相同。
它的工作原理類似于變量賦值。
第一個(gè)參數(shù)是函數(shù)定義中第一個(gè)參數(shù)的值。第二個(gè)參數(shù)是函數(shù) ddefinition 中第二個(gè)參數(shù)的值——依此類推。
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy","Jones")
#Output
#Hello,Timmy Jones
#you can visualise it like:
#first_name = "Timmy"
#last_name = "Jones"
如果順序不正確,輸出可能沒有多大意義,也不是您想要的。
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language("Python","Dionysia")
#output:
#Hello, I am Python and my favorite programming language is Dionysia
#it is like you did
#name="Python"
#language = "Dionysia"
如何在 Python 函數(shù)中使用關(guān)鍵字參數(shù)
到目前為止,您已經(jīng)看到了一種類型的參數(shù),位置參數(shù)。
使用位置參數(shù),只使用在函數(shù)調(diào)用中傳遞的值來調(diào)用函數(shù)。在那里,每個(gè)值直接對應(yīng)于函數(shù)定義中每個(gè)參數(shù)的數(shù)量、順序和位置。
然而,Python 中的函數(shù)可以接受另一種類型的參數(shù),即關(guān)鍵字參數(shù)。
在這種情況下,不是在函數(shù)調(diào)用中只傳遞值,而是指定參數(shù)的名稱,然后指定要分配給它的值,格式為key = value.
每個(gè)鍵匹配函數(shù)定義中的每個(gè)參數(shù)。
顯式調(diào)用參數(shù)名稱和它們采用的值有助于更清楚地了解您傳入的內(nèi)容并避免任何可能的混淆。
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language(name="Dionysia",language="Python")
#output:
#Hello, I am Dionysia and my favorite programming language is Python
如上所示,關(guān)鍵字參數(shù)可以按特定順序排列。但它們比位置參數(shù)更靈活,因?yàn)閰?shù)的順序現(xiàn)在無關(guān)緊要。
所以你可以這樣做并且不會有錯(cuò)誤:
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language(language="Python",name="Dionysia")
#output:
#Hello, I am Dionysia and my favorite programming language is Python
但是您仍然必須提供正確數(shù)量的參數(shù)。
您可以在函數(shù)調(diào)用中同時(shí)使用位置參數(shù)和關(guān)鍵字參數(shù),如下例所示,其中有一個(gè)位置參數(shù)和一個(gè)關(guān)鍵字參數(shù):
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language("dionysia",language="Python")
#output:
#Hello, I am dionysia and my favorite programming language is Python
在這種情況下,順序又很重要。
位置參數(shù)總是首先出現(xiàn),所有關(guān)鍵字參數(shù)都應(yīng)該跟在位置參數(shù)之后。否則會報(bào)錯(cuò):
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language(language="Python","dionysia")
如何在 Python 中定義具有默認(rèn)值的參數(shù)
函數(shù)參數(shù)也可以有默認(rèn)值。它們被稱為默認(rèn)或可選參數(shù)。
對于具有默認(rèn)值的函數(shù)參數(shù),您必須為函數(shù)定義中的參數(shù)分配一個(gè)默認(rèn)值。
您使用key=value表單執(zhí)行此操作,其中value將是該參數(shù)的默認(rèn)值。
def fave_language(language="python"):
print(f"My favorite programming language is {language}!")
fave_language()
#output
#My favorite programming language is python!
正如你看到的,都是缺省參數(shù)未在函數(shù)調(diào)用所需,和值language將始終默認(rèn)到Python如果呼叫中沒有提供其他值。
但是,如果您在函數(shù)調(diào)用中提供另一個(gè)值,則可以輕松覆蓋默認(rèn)值:
def fave_language(language="python"):
print(f"My favorite programming language is {language}!")
fave_language("Java")
#prints "My favorite programming language is Java!" to the console
可以有多個(gè)默認(rèn)值傳遞給函數(shù)。
調(diào)用函數(shù)時(shí),可以提供無、一個(gè)、部分或全部默認(rèn)參數(shù),順序無關(guān)緊要。
def personal_details(name="Jimmy",age=28,city="Berlin"):
print(f"I am {name},{age} years old and live in {city}")
#We can do:
personal_details()
#output:
#I am Jimmy,28 years old and live in Berlin
personal_details(age=30)
#I am Jimmy,30 years old and live in Berlin
personal_details(city="Athens",name="Ben",age=24)
##I am Ben,24 years old and live in Athens
默認(rèn)參數(shù)可以與函數(shù)調(diào)用中的非默認(rèn)參數(shù)組合。
這是一個(gè)接受兩個(gè)參數(shù)的函數(shù):一個(gè)是位置性的,非默認(rèn)的 ( name) 和一個(gè)可選的,默認(rèn)的 ( language)。
def fave_language(name,language="Python"):
print(f"My name is {name} and my favorite programming language is {language}!")
fave_language("Dionysia")
#output:
#"My name is Dionysia and my favorite programming language is Python!"
默認(rèn)參數(shù)langyage="Python"是optional。但是位置參數(shù) ,name總是需要的。如果language未傳入另一個(gè),則該值將始終默認(rèn)為 Python。
這里要提到的另一件事是,當(dāng)默認(rèn)值和非默認(rèn)值一起使用時(shí),它們在函數(shù)定義中的定義順序很重要。
所有位置參數(shù)都在前面,然后是默認(rèn)參數(shù)。
這將不起作用:
def fave_language(language="Python",name):
print(f"My name is {name} and my favorite programming language is {language}!")
fave_language("Dionysia")
輸出:
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
結(jié)論
在本文中,您學(xué)習(xí)了如何在 Python 編程語言中聲明函數(shù)并使用參數(shù)調(diào)用它們。
這是關(guān)于如何創(chuàng)建簡單函數(shù)以及如何使用參數(shù)將數(shù)據(jù)傳遞給它們的介紹。我們還討論了不同類型的參數(shù),如positional、keyword和default參數(shù)。
回顧一下:
- 位置參數(shù)的順序和數(shù)量很重要。
- 對于關(guān)鍵字參數(shù),順序無關(guān)緊要。但是,數(shù)字確實(shí)很重要,因?yàn)槊總€(gè)關(guān)鍵字參數(shù)都對應(yīng)于函數(shù)定義中的每個(gè)參數(shù)。
- 默認(rèn)參數(shù)完全是可選的。您可以傳遞所有這些,其中一些,或者根本不傳遞。