函數(shù)
定義:完成特定功能的語句組榜旦,可以給這組語句取一個名字,作為一個單位使用景殷。
函數(shù)優(yōu)點
???????? 實現(xiàn)代碼復用溅呢,提高開發(fā)效率澡屡,減少重復編碼。
???????? 簡化程序結(jié)構(gòu)咐旧,將復雜的編程問題分解為若干簡單的子問題驶鹉,每個子問題由函數(shù)來解決。????
???????? 使用函數(shù)可以使程序更容易閱讀休偶;使調(diào)試測試更容易梁厉。
???????? 信息封裝與隱藏。
函數(shù)定義
def funcname(params):
???????? xxx
???????? xxx
???????? return? xxx
函數(shù)名踏兜、參數(shù)、函數(shù)體
匿名函數(shù)
f = lambda 參數(shù)1, 參數(shù)2, ... :表達式
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
帶默認參數(shù)值的匿名函數(shù)
f = lambda x,y=3 : x**y
f(2,2) = 4
f(2) = 8
參數(shù)傳遞
1 按照位置傳參數(shù)
2 按照關鍵字傳參數(shù)
3 按照默認值傳參數(shù)
函數(shù)定義時如果指定默認值參數(shù)八秃,這類參數(shù)必須放在無默認值參數(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ù)是以形參名為標志符的元組,元組中的元素個數(shù)可以是零個骤肛、一個或多個纳本。
參數(shù)名前加兩個'*'表示參數(shù)數(shù)據(jù)類型是字典,其中參數(shù)名為“key”腋颠,參數(shù)值為“value”
定義函數(shù)時繁成,可以混合使用多種參數(shù)傳遞方式,要遵循如下規(guī)則:
1 關鍵字參數(shù)放在位置參數(shù)后面
2 元組參數(shù)放在關鍵字參數(shù)后面
3 字典參數(shù)放在元組參數(shù)后面
調(diào)用函數(shù)時淑玫,首先按位置順序傳遞參數(shù)巾腕,其次按關鍵字傳遞參數(shù)。多余的非關鍵字參數(shù)傳遞給元組絮蒿,多余的關鍵字參數(shù)傳遞給字典尊搬。
函數(shù)返回值
函數(shù)定義中,return語句是可選項土涝,主要功能是返回函數(shù)執(zhí)行結(jié)果佛寿。
返回的數(shù)據(jù)類型除常見的數(shù)值,字符串但壮,還可以是布爾值冀泻、列表對象等。
當有多條return語句時茵肃,執(zhí)行第一條return語句就會退出函數(shù)验残,不再執(zhí)行return后面的語句。
如果函數(shù)沒有return語句鸟召,自動返回None欧募,表示沒有返回值。
return語句可以返回多個值种冬,此時實際上返回的是一個元組對象娱两。
變量作用域
函數(shù)內(nèi)部創(chuàng)建的對象只能在函數(shù)內(nèi)部訪問十兢,這種變量稱為局部變量摇庙。
函數(shù)外部定義的變量可以被程序的任何部分訪問,這種變量稱為全局變量宵呛。
Python3中全局變量在函數(shù)內(nèi)訪問時需要用global指明是訪問全局變量玛臂。
常用內(nèi)建函數(shù)
dir函數(shù)
???????? 返回由給定模塊迹冤、類、實例橱鹏,或其他類型的所有成員組成的列表莉兰,在交互式python解釋器下很有用糖荒,也可以用在其他地方模捂。
help函數(shù)
???????? 啟動內(nèi)置的幫助系統(tǒng)(此函數(shù)主要在交互式中使用)。如果沒有實參综看,解釋器控制臺里會啟動交互式幫助系統(tǒng)红碑。如果實參是一個字符串,則在模塊羡鸥、函數(shù)兄春、類、方法哑姚、關鍵字或文檔主題中搜索該字符串叙量,并在控制臺上打印幫助信息。如果實參是其他任意對象寺鸥,則會生成該對象的幫助頁胆建。
open函數(shù)
???????? 打開file 并返回對應的file object笆载。如果該文件不能打開涯呻,則觸發(fā)OSError复罐。
len函數(shù)
???????? 返回對象的長度(元素個數(shù))。實參可以是序列(如 string胀滚、bytes、tuple咙好、list 或 range 等)或集合(如 dictionary勾效、set 或 frozen set 等)层宫。
sum(iterable[,start])
???????? 從start 開始自左向右對iterable 中的項求和并返回總計值其监。start 默認為0抖苦。iterable 的項通常為數(shù)字,開始值則不允許為字符串贮庞。
sorted(iterable,*,key=None,reverse=False)
???????? 根據(jù)iterable 中的項返回一個新的已排序列表窗慎。
???????? 具有兩個可選參數(shù)遮斥,它們都必須指定為關鍵字參數(shù)术吗。
???????? key 指定帶有單個參數(shù)的函數(shù)晕拆,用于從iterable 的每個元素中提取用于比較的鍵 (例如key=str.lower)实幕。默認值為None (直接比較元素)。
???????? reverse 為一個布爾值末贾。如果設為True拱撵,則每個列表元素將按反向順序比較進行排序。
???????? 使用functools.cmp_to_key()可將老式的cmp 函數(shù)轉(zhuǎn)換為key 函數(shù)乓旗。
???????? 內(nèi)置的sorted()確保是穩(wěn)定的屿愚。如果一個排序確保不會改變比較結(jié)果相等的元素的相對順序就稱其為穩(wěn)定的 --- 這有利于進行多重排序(例如先按部門裹纳、再按薪級排序)函匕。
filter(function,iterable)
???????? 用iterable 中函數(shù)function 返回真的那些元素,構(gòu)建一個新的迭代器盅惜。iterable 可以是一個序列抒寂,一個支持迭代的容器蓬推,或一個迭代器沸伏。如果function 是None 毅糟,則會假設它是一個身份函數(shù)澜公,即iterable 中所有返回假的元素會被移除坟乾。
max(iterable,*[,key,default])
max(arg1,arg2,*args[,key])
???????? 返回可迭代對象中最大的元素,或者返回兩個及以上實參中最大的明吩。
???????? 如果只提供了一個位置參數(shù)印荔,它必須是非空iterable,返回可迭代對象中最大的元素嘿悬;如果提供了兩個及以上的位置參數(shù)善涨,則返回最大的位置參數(shù)茶行。
???????? 有兩個可選只能用關鍵字的實參畔师。key 實參指定排序函數(shù)用的參數(shù),如傳給list.sort()的姿锭。default 實參是當可迭代對象為空時返回的值呻此。如果可迭代對象為空焚鲜,并且沒有給default 放前,則會觸發(fā)ValueError凭语。
???????? 如果有多個最大元素,則此函數(shù)將返回第一個找到的吨些。
map(function,iterable,...)
???????? 返回一個將function 應用于iterable 中每一項并輸出其結(jié)果的迭代器豪墅。如果傳入了額外的iterable 參數(shù)但校,function 必須接受相同個數(shù)的實參并被應用于從所有可迭代對象中并行獲取的項啡氢。當有多個可迭代對象時,最短的可迭代對象耗盡則整個迭代就將結(jié)束亭枷。
range(stop)
range(start,stop[,step])
???????? 雖然被稱為函數(shù)叨粘,但range實際上是一個不可變的序列類型,通常用于在for循環(huán)中循環(huán)指定的次數(shù)答倡。
???????? range構(gòu)造器的參數(shù)必須為整數(shù)(可以是內(nèi)置的int或任何實現(xiàn)了__index__ 特殊方法的對象)瘪撇。如果省略step 參數(shù)倔既,其默認值為1鹏氧。如果省略start 參數(shù),其默認值為0实蓬,?????? 如果step 為零則會引發(fā)ValueError瞳秽。
???????? 如果step 為正值率翅,確定 range r 內(nèi)容的公式為r[i] = start + step*i 其中i >= 0 且r[i] < stop冕臭。
???????? 如果step 為負值辜贵,確定 range 內(nèi)容的公式仍然為r[i] = start + step*i,但限制條件改為i >= 0 且r[i] >stop.
???????? range類型相比常規(guī)list或tuple的優(yōu)勢在于一個range對象總是占用固定數(shù)量的(較型锌)內(nèi)存厚棵,不論其所表示的范圍有多大(因為它只保存了start,stop和step 值,并會根據(jù)需要計算具體單項或子范圍的值)狠轻。
enumerate(iterable,start=0)
???????? 返回一個枚舉對象彬犯。iterable 必須是一個序列谐区,或iterator,或其他支持迭代的對象昭抒。enumerate()返回的迭代器的__next__()方法返回一個元組虚茶,里面包含一個計數(shù)值(從start 開始,默認為 0)和通過迭代iterable 獲得的值婆殿。
input([prompt])
???????? 如果存在prompt 實參婆芦,則將其寫入標準輸出喂饥,末尾不帶換行符员帮。接下來,該函數(shù)從輸入中讀取一行氯材,將其轉(zhuǎn)換為字符串(除了末尾的換行符)并返回氢哮。
print(*objects,sep=' ',end='\n',file=sys.stdout,flush=False)
???????? 將objects 打印到file 指定的文本流冗尤,以sep 分隔并在末尾加上end。sep,end,file和flush 如果存在皆看,它們必須以關鍵字參數(shù)的形式給出悬蔽。
???????? 所有非關鍵字參數(shù)都會被轉(zhuǎn)換為字符串捉兴,就像是執(zhí)行了 str() 一樣倍啥,并會被寫入到流,以sep 且在末尾加上end始藕。sep 和end 都必須為字符串伍派;它們也可以為None剩胁,這意味著使用默認值。如果沒有給出objects晾腔,則 print() 將只寫入end啊犬。
???????? file 參數(shù)必須是一個具有write(string) 方法的對象;如果參數(shù)不存在或為None剔应,則將使用 sys.stdout峻贮。 由于要打印的參數(shù)會被轉(zhuǎn)換為文本字符串,因此 print() 不能用于二進制模式的文件對象何恶。對于這些對象,應改用file.write(...)唬涧。
???????? 輸出是否被緩存通常決定于file碎节,但如果flush 關鍵字參數(shù)為真值狮荔,流會被強制刷新殖氏。