您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Python的函數是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
定義函數
我們通過斐波那契數列來理解定義函數
>>> def fib(n): # 將斐波那契數列打印到 n ... """將斐波那契數列打印到 n""" ... a, b = 0, 1 ... while a < n: ... print(a, end=' ') ... a, b = b, a+b ... print() ... >>> # 調用上面定義的函數 ... fib(2000) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
關鍵字 def 引入了一個函數定義 。其后面必須跟隨有函數的名稱以及用括號包起來的一系列參數。構成函數體的語句從下一行開始,并且必須縮進。
函數體的第一個語句可以是一個字符串常量,這個字符串常量就是這個函數的文檔字符串,或者說是 docstring ,有很多工具可以用于在線或者可打印文檔的自動化生成,或者可以讓用戶交互地在代碼中瀏覽文檔;在代碼中寫文檔字符串是比較好的實踐,所以請養成寫文檔字符串的習慣。
函數的執行引入了一個新的符號表用于存儲函數的局部變量。更準確地說,在函數內的所有變量賦值都會被存儲到這張局部符號表中;所以在查找一個變量的引用時,會先查找局部符號表,然后查找閉包函數的局部符號表,接著是全局符號表,最后才是內置名稱表。因此,盡管可能在函數中引用全局變量,但在函數中無法對全局變量直接進行賦值(除非用 global 語句來定義一個變量)
當一個函數被調用時,函數參數被引入到局部符號表中;因此,參數是通過 按值傳遞 的方式來傳遞的(這個值表示一個對象的 引用 ,而不是該對象的值)。[1] 當在一個函數中調用另外一個函數時,將會為這次調用創建一個新的局部符號表。
一個函數定義將會在當前符號表中引入函數的名稱。這個函數的名稱對應的值的類型會被解釋器解釋為用戶定義的函數。這個值可以被賦值給另外一個名稱,并且將這名稱可以當作一個函數來使用。這是一種常用的重命名機制:
>>> fib <function fib at 10042ed0> >>> f = fib >>> f(100) 0 1 1 2 3 5 8 13 21 34 55 89
默認參數值
最常用的形式是為一個或多個參數指定默認值。這樣,函數可以以少于其定義的參數被調用。比如:
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)
該函數可以有幾種不同的調用方式:
只指定強制的參數
參數: ask_ok('Do you really want to quit?')
提供一個可選參數
參數: ask_ok('OK to overwrite the file?', 2)
或者給定全部的參數
參數: ask_ok('OK to overwrite the file?', 2, 'Come on, onlyyes or no!')
上述例子順便也提及了 in 關鍵字。它是用來測試某個特定值是否在一個序列中。
默認值是在定義函數時的 “定義過程中” (defining )的范圍內評估的(函數參數默認值是個變量的話,要根據函數定義前變量的值來確定參數默認值), 所以,
i = 5 def f(arg=i): print(arg) i = 6 f()
會打印 5.
關鍵字參數
形如 kwarg=value 形式的參數是 關鍵字參數。例如,以下函數:
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, "!")
接收一個必選參數 (voltage ) 和三個可選參數( state,action, 和 type )。這個函數下方式調用:
parrot(1000) # 一個位置參數 parrot(voltage=1000) # 一個關鍵字參數 parrot(voltage=1000000, action='VOOOOOM') # 2個關鍵字參數 parrot(action='VOOOOOM', voltage=1000000) # 2個關鍵字參數 parrot('a million', 'bereft of life', 'jump') # 3個位置參數 parrot('a thousand', state='pushing up the daisies') # 一個位置參數,一個關鍵字參數
但是下列的所有調用方式都是無效的:
parrot() # 必選參數缺失 parrot(voltage=5.0, 'dead') # 非關鍵字參數在關鍵字參數后面 parrot(110, voltage=220) # 同一參數重復賦值 parrot(actor='John Cleese') # 未知關鍵字參數
在函數調用中,關鍵字參數必須遵循參數位置。傳遞的所有關鍵字參數必須跟函數接受的其中一個參數相匹配。(例如: actor 在函數 parrot 中不是一個有效的參數),并且它們的順序并不重要。這同樣也包括那些非必選參數 (例如 parrot(voltage=1000) 同樣有效)。沒有參數可能多次獲取一個值。下例就是因此而失敗的:
>>> 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'
當最后存在 **name 形式的參數時,它最后會接收一個字典,(參見 Mapping Types --- dict) 包含所有除了和形式參數相對應的關鍵字參數。這可以與 * name 形式的形式參數(在下一小節中描述)結合,該參數接收包含正式參數列表之外的位置參數的元組。 (*name 必須出現在 **name 之前。) 例如,我們如果定義一個如下函數:
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])
它可以像這樣調用:
cheeseshop("Limburger", "It's very runny, sir.", "It's really very, VERY runny, sir.", shopkeeper="Michael Palin", client="John Cleese", sketch="Cheese Shop Sketch")
可變參數
最后,最不常用的指定參數的選項是可變數量的參數。這些參數將被組裝成一個元組 (參見 元組和序列) 。在可變參數之前,可能會出現零個或多個正常參數。
def write_multiple_items(file, separator, *args): file.write(separator.join(args))
分離參數列表
當輸入的參數已經是列表或元組形式而為了調用其中單獨的位置參數時,將會出現與上面相反的情況。例如內置函數 range() 需要有獨立的 start 和 stop 參數。如果輸入的時候不是獨立的參數,則需要用 * 操作符來將參數從列表或者元組里面提取出來:
>>> list(range(3, 6)) # 正常利用參數調用函數 [3, 4, 5] >>> args = [3, 6] >>> list(range(*args)) # 從列表中提取參數來調用函數 [3, 4, 5]
Lambda 表達式
我們可以使用 lambda關鍵字來創建小型匿名函數。此函數會返回其兩個參數的和:lambda a,b:a + b。可以在任何需要函數對象的場合使用 Lambda 函數。它們在語法上僅限于單個表達式。從語義上講,它們只是普通函數定義的語法糖。與嵌套函數定義類似,lambda 函數可以從包含它的上下文中引用變量:
>>> def make_incrementor(n): ... return lambda x: x + n ... >>> f = make_incrementor(42) >>> f(0) 42 >>> f(1) 4
以上就是Python的函數是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。