本篇文章給大家分享的是有關(guān)Python的函數(shù)是什么,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括芙蓉網(wǎng)站建設(shè)、芙蓉網(wǎng)站制作、芙蓉網(wǎng)頁(yè)制作以及芙蓉網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,芙蓉網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到芙蓉省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(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ù)體的語(yǔ)句從下一行開始,并且必須縮進(jìn)。
函數(shù)體的第一個(gè)語(yǔ)句可以是一個(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ù)中無(wú)法對(duì)全局變量直接進(jìn)行賦值(除非用 global 語(yǔ)句來定義一個(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)用方式都是無(wú)效的:
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(yǔ)法上僅限于單個(gè)表達(dá)式。從語(yǔ)義上講,它們只是普通函數(shù)定義的語(yǔ)法糖。與嵌套函數(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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享名稱:Python的函數(shù)是什么
分享URL:http://jinyejixie.com/article12/pospdc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)