App下載

Python 函數(shù)示例——如何使用參數(shù)聲明和調(diào)用

知名氣人小說寫手 2021-08-25 10:26:43 瀏覽數(shù) (3133)
反饋

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)行后可能會(huì)或不會(huì)將值返回給調(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)鍵字。
  • 然后我們有一組左括號(hào)和右括號(hào),()。在它們內(nèi)部,可以有零個(gè)、一個(gè)或多個(gè)可選的逗號(hào)分隔參數(shù)及其可選的默認(rèn)值。這些被傳遞給函數(shù)。
  • 接下來是一個(gè)冒號(hào),:結(jié)束函數(shù)的定義行。
  • 然后是一個(gè)新行,后跟縮進(jìn)級(jí)別(您可以使用鍵盤或使用 1 個(gè) Tab 使用 4 個(gè)空格來執(zhí)行此操作)。縮進(jìn)很重要,因?yàn)樗?Python 知道哪些代碼將屬于函數(shù)。
  • 然后我們有函數(shù)的主體。這里是要執(zhí)行的代碼 - 調(diào)用函數(shù)時(shí)要執(zhí)行的操作的內(nèi)容。
  • 最后,函數(shù)體中有一個(gè)可選的return 語句,在函數(shù)退出時(shí)將一個(gè)值傳回給調(diào)用者。

請(qǐng)記住,如果您在嘗試定義新函數(shù)時(shí)忘記了括號(hào)()或冒號(hào):,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ù),代碼就不會(huì)自行運(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ù)名后面必須跟括號(hào)。如果有任何必需的參數(shù),它們必須在括號(hào)中傳遞。如果函數(shù)不接受任何參數(shù),您仍然需要括號(hào)。

要調(diào)用上面示例中不接受任何參數(shù)的函數(shù),請(qǐng)執(zhí)行以下操作:

hello_world_func()

#Output
#hello world 

如何定義和調(diào)用帶參數(shù)的函數(shù)

到目前為止,您已經(jīng)看到了一些簡(jiǎn)單的函數(shù),除了向控制臺(tái)打印一些東西之外,它們實(shí)際上并沒有做太多事情。

如果你想向函數(shù)傳遞一些額外的數(shù)據(jù)怎么辦?

我們?cè)谶@里使用了參數(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}")

括號(hào)內(nèi)可以有一個(gè)參數(shù)列表,所有參數(shù)都用逗號(hào)分隔。

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ù)對(duì)應(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ù),否則會(huì)報(bào)錯(cuò)。

對(duì)于位置參數(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ù),像這樣,會(huì)出現(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ù),則會(huì)再次出現(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ù),也會(huì)出現(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è)值直接對(duì)應(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)緊要。

所以你可以這樣做并且不會(huì)有錯(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ù)之后。否則會(huì)報(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ù)。

對(duì)于具有默認(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í),它們?cè)诤瘮?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)建簡(jiǎn)單函數(shù)以及如何使用參數(shù)將數(shù)據(jù)傳遞給它們的介紹。我們還討論了不同類型的參數(shù),如positional、keyword和default參數(shù)。

回顧一下:

  • 位置參數(shù)的順序和數(shù)量很重要。
  • 對(duì)于關(guān)鍵字參數(shù),順序無關(guān)緊要。但是,數(shù)字確實(shí)很重要,因?yàn)槊總€(gè)關(guān)鍵字參數(shù)都對(duì)應(yīng)于函數(shù)定義中的每個(gè)參數(shù)。
  • 默認(rèn)參數(shù)完全是可選的。您可以傳遞所有這些,其中一些,或者根本不傳遞。


0 人點(diǎn)贊