溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python的函數(shù)是什么

發(fā)布時(shí)間:2020-09-24 13:44:44 來源:億速云 閱讀:124 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關(guān)Python的函數(shù)是什么,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

定義函數(shù)

我們通過斐波那契數(shù)列來理解定義函數(shù)

>>> def fib(n):    # 將斐波那契數(shù)列打印到 n
...     """將斐波那契數(shù)列打印到 n"""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # 調(diào)用上面定義的函數(shù)
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

關(guān)鍵字 def 引入了一個(gè)函數(shù)定義 。其后面必須跟隨有函數(shù)的名稱以及用括號(hào)包起來的一系列參數(shù)。構(gòu)成函數(shù)體的語句從下一行開始,并且必須縮進(jìn)。

函數(shù)體的第一個(gè)語句可以是一個(gè)字符串常量,這個(gè)字符串常量就是這個(gè)函數(shù)的文檔字符串,或者說是 docstring ,有很多工具可以用于在線或者可打印文檔的自動(dòng)化生成,或者可以讓用戶交互地在代碼中瀏覽文檔;在代碼中寫文檔字符串是比較好的實(shí)踐,所以請(qǐng)養(yǎng)成寫文檔字符串的習(xí)慣。

函數(shù)的執(zhí)行引入了一個(gè)新的符號(hào)表用于存儲(chǔ)函數(shù)的局部變量。更準(zhǔn)確地說,在函數(shù)內(nèi)的所有變量賦值都會(huì)被存儲(chǔ)到這張局部符號(hào)表中;所以在查找一個(gè)變量的引用時(shí),會(huì)先查找局部符號(hào)表,然后查找閉包函數(shù)的局部符號(hào)表,接著是全局符號(hào)表,最后才是內(nèi)置名稱表。因此,盡管可能在函數(shù)中引用全局變量,但在函數(shù)中無法對(duì)全局變量直接進(jìn)行賦值(除非用 global 語句來定義一個(gè)變量)

當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),函數(shù)參數(shù)被引入到局部符號(hào)表中;因此,參數(shù)是通過 按值傳遞 的方式來傳遞的(這個(gè)值表示一個(gè)對(duì)象的 引用 ,而不是該對(duì)象的值)。[1] 當(dāng)在一個(gè)函數(shù)中調(diào)用另外一個(gè)函數(shù)時(shí),將會(huì)為這次調(diào)用創(chuàng)建一個(gè)新的局部符號(hào)表。

一個(gè)函數(shù)定義將會(huì)在當(dāng)前符號(hào)表中引入函數(shù)的名稱。這個(gè)函數(shù)的名稱對(duì)應(yīng)的值的類型會(huì)被解釋器解釋為用戶定義的函數(shù)。這個(gè)值可以被賦值給另外一個(gè)名稱,并且將這名稱可以當(dāng)作一個(gè)函數(shù)來使用。這是一種常用的重命名機(jī)制:

>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89

默認(rèn)參數(shù)值

最常用的形式是為一個(gè)或多個(gè)參數(shù)指定默認(rèn)值。這樣,函數(shù)可以以少于其定義的參數(shù)被調(diào)用。比如:

def ask_ok(prompt, retries=4, reminder='Please try again!'):
    while True:
        ok = input(prompt)
        if ok in ('y', 'ye', 'yes'):
            return True
        if ok in ('n', 'no', 'nop', 'nope'):
            return False
        retries = retries - 1
        if retries < 0:
            raise ValueError('invalid user response')
        print(reminder)

該函數(shù)可以有幾種不同的調(diào)用方式:

只指定強(qiáng)制的參數(shù)

參數(shù): ask_ok('Do you really want to quit?')

提供一個(gè)可選參數(shù)

參數(shù): ask_ok('OK to overwrite the file?', 2)

或者給定全部的參數(shù)

參數(shù): ask_ok('OK to overwrite the file?', 2, 'Come on, onlyyes or no!')

上述例子順便也提及了 in 關(guān)鍵字。它是用來測(cè)試某個(gè)特定值是否在一個(gè)序列中。

默認(rèn)值是在定義函數(shù)時(shí)的 “定義過程中” (defining )的范圍內(nèi)評(píng)估的(函數(shù)參數(shù)默認(rèn)值是個(gè)變量的話,要根據(jù)函數(shù)定義前變量的值來確定參數(shù)默認(rèn)值), 所以,

i = 5

def f(arg=i):
    print(arg)

i = 6
f()

會(huì)打印 5.

關(guān)鍵字參數(shù)

形如 kwarg=value 形式的參數(shù)是 關(guān)鍵字參數(shù)。例如,以下函數(shù):

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print("-- This parrot wouldn't", action, end=' ')
    print("if you put", voltage, "volts through it.")
    print("-- Lovely plumage, the", type)
    print("-- It's", state, "!")

接收一個(gè)必選參數(shù) (voltage ) 和三個(gè)可選參數(shù)( state,action, 和 type )。這個(gè)函數(shù)下方式調(diào)用:

parrot(1000)                                          # 一個(gè)位置參數(shù)
parrot(voltage=1000)                                  # 一個(gè)關(guān)鍵字參數(shù)
parrot(voltage=1000000, action='VOOOOOM')             # 2個(gè)關(guān)鍵字參數(shù)
parrot(action='VOOOOOM', voltage=1000000)             # 2個(gè)關(guān)鍵字參數(shù)
parrot('a million', 'bereft of life', 'jump')         # 3個(gè)位置參數(shù)
parrot('a thousand', state='pushing up the daisies')  # 一個(gè)位置參數(shù),一個(gè)關(guān)鍵字參數(shù)

但是下列的所有調(diào)用方式都是無效的:

parrot()                     # 必選參數(shù)缺失
parrot(voltage=5.0, 'dead')  # 非關(guān)鍵字參數(shù)在關(guān)鍵字參數(shù)后面
parrot(110, voltage=220)     # 同一參數(shù)重復(fù)賦值
parrot(actor='John Cleese')  # 未知關(guān)鍵字參數(shù)

在函數(shù)調(diào)用中,關(guān)鍵字參數(shù)必須遵循參數(shù)位置。傳遞的所有關(guān)鍵字參數(shù)必須跟函數(shù)接受的其中一個(gè)參數(shù)相匹配。(例如: actor 在函數(shù) parrot 中不是一個(gè)有效的參數(shù)),并且它們的順序并不重要。這同樣也包括那些非必選參數(shù) (例如 parrot(voltage=1000) 同樣有效)。沒有參數(shù)可能多次獲取一個(gè)值。下例就是因此而失敗的:

>>> def function(a):
...     pass
...
>>> function(0, a=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function() got multiple values for keyword argument 'a'

當(dāng)最后存在 **name 形式的參數(shù)時(shí),它最后會(huì)接收一個(gè)字典,(參見 Mapping Types --- dict) 包含所有除了和形式參數(shù)相對(duì)應(yīng)的關(guān)鍵字參數(shù)。這可以與 * name 形式的形式參數(shù)(在下一小節(jié)中描述)結(jié)合,該參數(shù)接收包含正式參數(shù)列表之外的位置參數(shù)的元組。 (*name 必須出現(xiàn)在 **name 之前。) 例如,我們?nèi)绻x一個(gè)如下函數(shù):

def cheeseshop(kind, *arguments, **keywords):
    print("-- Do you have any", kind, "?")
    print("-- I'm sorry, we're all out of", kind)
    for arg in arguments:
        print(arg)
    print("-" * 40)
    for kw in keywords:
        print(kw, ":", keywords[kw])

它可以像這樣調(diào)用:

cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper="Michael Palin",
           client="John Cleese",
           sketch="Cheese Shop Sketch")

可變參數(shù)

最后,最不常用的指定參數(shù)的選項(xiàng)是可變數(shù)量的參數(shù)。這些參數(shù)將被組裝成一個(gè)元組 (參見  元組和序列) 。在可變參數(shù)之前,可能會(huì)出現(xiàn)零個(gè)或多個(gè)正常參數(shù)。

def write_multiple_items(file, separator, *args):
    file.write(separator.join(args))

分離參數(shù)列表

當(dāng)輸入的參數(shù)已經(jīng)是列表或元組形式而為了調(diào)用其中單獨(dú)的位置參數(shù)時(shí),將會(huì)出現(xiàn)與上面相反的情況。例如內(nèi)置函數(shù) range() 需要有獨(dú)立的 start 和 stop 參數(shù)。如果輸入的時(shí)候不是獨(dú)立的參數(shù),則需要用 * 操作符來將參數(shù)從列表或者元組里面提取出來:

>>> list(range(3, 6))            # 正常利用參數(shù)調(diào)用函數(shù)
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args))            # 從列表中提取參數(shù)來調(diào)用函數(shù)
[3, 4, 5]

 Lambda 表達(dá)式

我們可以使用 lambda關(guān)鍵字來創(chuàng)建小型匿名函數(shù)。此函數(shù)會(huì)返回其兩個(gè)參數(shù)的和:lambda a,b:a + b。可以在任何需要函數(shù)對(duì)象的場(chǎng)合使用 Lambda 函數(shù)。它們?cè)谡Z法上僅限于單個(gè)表達(dá)式。從語義上講,它們只是普通函數(shù)定義的語法糖。與嵌套函數(shù)定義類似,lambda 函數(shù)可以從包含它的上下文中引用變量:

>>> def make_incrementor(n):
...     return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
4

以上就是Python的函數(shù)是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI