函數(shù)
定義:完成特定功能的語句組,可以給這組語句取一個(gè)名字,作為一個(gè)單位使用。
函數(shù)優(yōu)點(diǎn)
???????? 實(shí)現(xiàn)代碼復(fù)用,提高開發(fā)效率,減少重復(fù)編碼。
???????? 簡(jiǎn)化程序結(jié)構(gòu),將復(fù)雜的編程問題分解為若干簡(jiǎn)單的子問題,每個(gè)子問題由函數(shù)來解決。????
???????? 使用函數(shù)可以使程序更容易閱讀;使調(diào)試測(cè)試更容易。
???????? 信息封裝與隱藏。
函數(shù)定義
def funcname(params):
???????? xxx
???????? xxx
???????? return? xxx
函數(shù)名、參數(shù)、函數(shù)體
匿名函數(shù)
f = lambda 參數(shù)1, 參數(shù)2, ... :表達(dá)式
f = lambda x,y,z : x+y+z
g = lambda x: lambda y : x+y
>>>f=lambda x,y,z:x+y+z
>>>f(5,10,15)
30
?
>>>g=lambda x:lambda y:x+y
>>>g(5)(10)
15
帶默認(rèn)參數(shù)值的匿名函數(shù)
f = lambda x,y=3 : x**y
f(2,2) = 4
f(2) = 8
參數(shù)傳遞
1 按照位置傳參數(shù)
2 按照關(guān)鍵字傳參數(shù)
3 按照默認(rèn)值傳參數(shù)
函數(shù)定義時(shí)如果指定默認(rèn)值參數(shù),這類參數(shù)必須放在無默認(rèn)值參數(shù)的后面。
def sum(a,b,c=10)
???????? return a+b+c
sum1 = sum(4,5,6)
sum2 = sum(a=4,c=8,b=6)
可變數(shù)量的參數(shù)定義
定義函數(shù)時(shí),如果參數(shù)數(shù)量不確定,可以定義可變數(shù)量的參數(shù)。
參數(shù)名前面加一個(gè)'*'表示參數(shù)是以形參名為標(biāo)志符的元組,元組中的元素個(gè)數(shù)可以是零個(gè)、一個(gè)或多個(gè)。
參數(shù)名前加兩個(gè)'*'表示參數(shù)數(shù)據(jù)類型是字典,其中參數(shù)名為“key”,參數(shù)值為“value”
定義函數(shù)時(shí),可以混合使用多種參數(shù)傳遞方式,要遵循如下規(guī)則:
1 關(guān)鍵字參數(shù)放在位置參數(shù)后面
2 元組參數(shù)放在關(guān)鍵字參數(shù)后面
3 字典參數(shù)放在元組參數(shù)后面
調(diào)用函數(shù)時(shí),首先按位置順序傳遞參數(shù),其次按關(guān)鍵字傳遞參數(shù)。多余的非關(guān)鍵字參數(shù)傳遞給元組,多余的關(guān)鍵字參數(shù)傳遞給字典。
函數(shù)返回值
函數(shù)定義中,return語句是可選項(xiàng),主要功能是返回函數(shù)執(zhí)行結(jié)果。
返回的數(shù)據(jù)類型除常見的數(shù)值,字符串,還可以是布爾值、列表對(duì)象等。
當(dāng)有多條return語句時(shí),執(zhí)行第一條return語句就會(huì)退出函數(shù),不再執(zhí)行return后面的語句。
如果函數(shù)沒有return語句,自動(dòng)返回None,表示沒有返回值。
return語句可以返回多個(gè)值,此時(shí)實(shí)際上返回的是一個(gè)元組對(duì)象。
變量作用域
函數(shù)內(nèi)部創(chuàng)建的對(duì)象只能在函數(shù)內(nèi)部訪問,這種變量稱為局部變量。
函數(shù)外部定義的變量可以被程序的任何部分訪問,這種變量稱為全局變量。
Python3中全局變量在函數(shù)內(nèi)訪問時(shí)需要用global指明是訪問全局變量。
常用內(nèi)建函數(shù)
dir函數(shù)
???????? 返回由給定模塊、類、實(shí)例,或其他類型的所有成員組成的列表,在交互式python解釋器下很有用,也可以用在其他地方。
help函數(shù)
???????? 啟動(dòng)內(nèi)置的幫助系統(tǒng)(此函數(shù)主要在交互式中使用)。如果沒有實(shí)參,解釋器控制臺(tái)里會(huì)啟動(dòng)交互式幫助系統(tǒng)。如果實(shí)參是一個(gè)字符串,則在模塊、函數(shù)、類、方法、關(guān)鍵字或文檔主題中搜索該字符串,并在控制臺(tái)上打印幫助信息。如果實(shí)參是其他任意對(duì)象,則會(huì)生成該對(duì)象的幫助頁。
open函數(shù)
???????? 打開file 并返回對(duì)應(yīng)的file object。如果該文件不能打開,則觸發(fā)OSError。
len函數(shù)
???????? 返回對(duì)象的長(zhǎng)度(元素個(gè)數(shù))。實(shí)參可以是序列(如 string、bytes、tuple、list 或 range 等)或集合(如 dictionary、set 或 frozen set 等)。
sum(iterable[,start])
???????? 從start 開始自左向右對(duì)iterable 中的項(xiàng)求和并返回總計(jì)值。start 默認(rèn)為0。iterable 的項(xiàng)通常為數(shù)字,開始值則不允許為字符串。
sorted(iterable,*,key=None,reverse=False)
???????? 根據(jù)iterable 中的項(xiàng)返回一個(gè)新的已排序列表。
???????? 具有兩個(gè)可選參數(shù),它們都必須指定為關(guān)鍵字參數(shù)。
???????? key 指定帶有單個(gè)參數(shù)的函數(shù),用于從iterable 的每個(gè)元素中提取用于比較的鍵 (例如key=str.lower)。默認(rèn)值為None (直接比較元素)。
???????? reverse 為一個(gè)布爾值。如果設(shè)為True,則每個(gè)列表元素將按反向順序比較進(jìn)行排序。
???????? 使用functools.cmp_to_key()可將老式的cmp 函數(shù)轉(zhuǎn)換為key 函數(shù)。
???????? 內(nèi)置的sorted()確保是穩(wěn)定的。如果一個(gè)排序確保不會(huì)改變比較結(jié)果相等的元素的相對(duì)順序就稱其為穩(wěn)定的 --- 這有利于進(jìn)行多重排序(例如先按部門、再按薪級(jí)排序)。
filter(function,iterable)
???????? 用iterable 中函數(shù)function 返回真的那些元素,構(gòu)建一個(gè)新的迭代器。iterable 可以是一個(gè)序列,一個(gè)支持迭代的容器,或一個(gè)迭代器。如果function 是None ,則會(huì)假設(shè)它是一個(gè)身份函數(shù),即iterable 中所有返回假的元素會(huì)被移除。
max(iterable,*[,key,default])
max(arg1,arg2,*args[,key])
???????? 返回可迭代對(duì)象中最大的元素,或者返回兩個(gè)及以上實(shí)參中最大的。
???????? 如果只提供了一個(gè)位置參數(shù),它必須是非空iterable,返回可迭代對(duì)象中最大的元素;如果提供了兩個(gè)及以上的位置參數(shù),則返回最大的位置參數(shù)。
???????? 有兩個(gè)可選只能用關(guān)鍵字的實(shí)參。key 實(shí)參指定排序函數(shù)用的參數(shù),如傳給list.sort()的。default 實(shí)參是當(dāng)可迭代對(duì)象為空時(shí)返回的值。如果可迭代對(duì)象為空,并且沒有給default ,則會(huì)觸發(fā)ValueError。
???????? 如果有多個(gè)最大元素,則此函數(shù)將返回第一個(gè)找到的。
map(function,iterable,...)
???????? 返回一個(gè)將function 應(yīng)用于iterable 中每一項(xiàng)并輸出其結(jié)果的迭代器。如果傳入了額外的iterable 參數(shù),function 必須接受相同個(gè)數(shù)的實(shí)參并被應(yīng)用于從所有可迭代對(duì)象中并行獲取的項(xiàng)。當(dāng)有多個(gè)可迭代對(duì)象時(shí),最短的可迭代對(duì)象耗盡則整個(gè)迭代就將結(jié)束。
range(stop)
range(start,stop[,step])
???????? 雖然被稱為函數(shù),但range實(shí)際上是一個(gè)不可變的序列類型,通常用于在for循環(huán)中循環(huán)指定的次數(shù)。
???????? range構(gòu)造器的參數(shù)必須為整數(shù)(可以是內(nèi)置的int或任何實(shí)現(xiàn)了__index__ 特殊方法的對(duì)象)。如果省略step 參數(shù),其默認(rèn)值為1。如果省略start 參數(shù),其默認(rèn)值為0,?????? 如果step 為零則會(huì)引發(fā)ValueError。
???????? 如果step 為正值,確定 range r 內(nèi)容的公式為r[i] = start + step*i 其中i >= 0 且r[i] < stop。
???????? 如果step 為負(fù)值,確定 range 內(nèi)容的公式仍然為r[i] = start + step*i,但限制條件改為i >= 0 且r[i] >stop.
???????? range類型相比常規(guī)list或tuple的優(yōu)勢(shì)在于一個(gè)range對(duì)象總是占用固定數(shù)量的(較?。﹥?nèi)存,不論其所表示的范圍有多大(因?yàn)樗槐4媪藄tart,stop和step 值,并會(huì)根據(jù)需要計(jì)算具體單項(xiàng)或子范圍的值)。
enumerate(iterable,start=0)
???????? 返回一個(gè)枚舉對(duì)象。iterable 必須是一個(gè)序列,或iterator,或其他支持迭代的對(duì)象。enumerate()返回的迭代器的__next__()方法返回一個(gè)元組,里面包含一個(gè)計(jì)數(shù)值(從start 開始,默認(rèn)為 0)和通過迭代iterable 獲得的值。
input([prompt])
???????? 如果存在prompt 實(shí)參,則將其寫入標(biāo)準(zhǔn)輸出,末尾不帶換行符。接下來,該函數(shù)從輸入中讀取一行,將其轉(zhuǎn)換為字符串(除了末尾的換行符)并返回。
print(*objects,sep=' ',end='\n',file=sys.stdout,flush=False)
???????? 將objects 打印到file 指定的文本流,以sep 分隔并在末尾加上end。sep,end,file和flush 如果存在,它們必須以關(guān)鍵字參數(shù)的形式給出。
???????? 所有非關(guān)鍵字參數(shù)都會(huì)被轉(zhuǎn)換為字符串,就像是執(zhí)行了 str() 一樣,并會(huì)被寫入到流,以sep 且在末尾加上end。sep 和end 都必須為字符串;它們也可以為None,這意味著使用默認(rèn)值。如果沒有給出objects,則 print() 將只寫入end。
???????? file 參數(shù)必須是一個(gè)具有write(string) 方法的對(duì)象;如果參數(shù)不存在或?yàn)镹one,則將使用 sys.stdout。 由于要打印的參數(shù)會(huì)被轉(zhuǎn)換為文本字符串,因此 print() 不能用于二進(jìn)制模式的文件對(duì)象。對(duì)于這些對(duì)象,應(yīng)改用file.write(...)。
???????? 輸出是否被緩存通常決定于file,但如果flush 關(guān)鍵字參數(shù)為真值,流會(huì)被強(qiáng)制刷新。