函式基礎
函式簡介
-
定義:就是具有特定功能的一段程式碼
-
優點:
-
解決程式碼的重複書寫
-
可以將功能的實現著和使用者分開,提高開發效率
-
-
分類:
-
庫函式:print、input、abs等
-
自定義:使用者自己封裝的函式
-
函式使用
-
定義函式格式
def 函式名([引數列表]): 函式體
[]表示可選,引數可以有,也可以沒有,也可以是多個。
-
函式名:
-
與變數一樣,只要遵循識別符號的命名規範即可。
-
-
函式呼叫:
-
函式定以後不會執行,需要呼叫才會執行
-
呼叫格式:
函式名([引數])
-
函式分類(引數與返回值)
-
# 無參無返回值 def print_hello(): for i in range(10): print(`Hello world!`) # print_hello() # 帶引數無返回值 def print_n_hello(n): for i in range(n): print(`Hello world!`) # print_n_hello(5) # 帶參有返回值 def add(m, n): c = m + n # 使用return返回需要返回的值,不返回預設為None return c print(add(3, 5))
分類的標準是按照有無引數,以及有無返回值。
函式引數
-
形參:形式引數,就是寫在函式定義出的引數
-
實參:實際引數,就是在函式呼叫時傳遞的引數
-
位置引數:也叫必傳引數,沒有預設值的引數
-
預設引數:定義時有預設值,呼叫時可以不傳,必須寫在最後
-
關鍵字引數:在函式呼叫時指定引數名字,引數的位置就無所謂。
-
可變長度引數:函式呼叫時可以傳遞比定義處更多的引數,多出來的引數會儲存在args和kwargs中
def var_len_args(a, b, name=`goudan`, *args, **kwargs): print(a, b) print(name) # 是一個元組,儲存多傳的位置引數 print(args) # 是一個字典,儲存多傳的關鍵字引數 print(kwargs) var_len_args(1, 2, 3, 4, age=10)
-
*的使用:
def show(a, b): print(a, b) lt = [1, 2] # 需要從列表根據下表獲取元素,然後作為引數傳遞 # show(lt[0], lt[1]) show(*lt) def show2(aa=11, bb=22): print(aa, bb) d = {`aa`: 123, `bb`: 456} # show2(aa=d[`aa`], bb=d[`bb`]) # 上下等價 show2(**d)
函式進階
-
函式的定義位置是隨意的?
-
不是,一定是先定義後呼叫,函式的呼叫一定要放在定義之後。
-
-
函式的名字可以相同嗎?
-
不可以,若出現同名函式,後者會覆蓋前者。
-
-
函式內容能否再定義函式?
-
可以,定義在函式內部的函式叫內部函式,它是很多高階功能實現的基礎。
-
變數的作用域
-
塊級作用域
if True: name = `ergou` # 能夠在塊的外部使用,說明沒有塊級作用域 print(name)
-
區域性作用域
-
區域性變數:定義在函式內部的變數叫區域性變數,只能在函式內部使用。
def test(): a = 10 # 不能再函式外部使用,此處會報錯 print(a)
-
-
全域性作用域
-
全域性變數:定義在函式外部的變數叫全域性變數,哪裡都可以使用
num = 10 def show(): # 宣告使用的時外部的同名變數 global num # 只能使用,不能修改,若想修改協議進行全域性宣告 num = 20 print(num) show() print(num)
-
函式內部可以使用外部變數,但是不能修改
-
若修改需要使用
global
進行全域性宣告 -
當函式內部與外部出現同名變數,預設使用的時內部變數
-
-
nonlocal使用
-
說明:內部函式使用外部函式的區域性變數,需要使用nonlocal進行宣告
def wai(): n = 10 def nei(): # 宣告使用非本地變數,外部函式的區域性變數 nonlocal n n = 20 print(n) nei() print(n) wai()
-
遞迴函式(瞭解)
-
定義:函式內部呼叫函式本身的函式叫遞迴函式。
-
組成:
-
函式內部呼叫自己
-
終止條件(停止呼叫自己的條件)
-
核心演算法(具體功能)
-
-
特點:
-
程式碼簡潔
-
可讀性差(不易理解)
-
瞬間佔用記憶體較大,沒有終止條件立即崩潰
-
有些領域是禁止使用的(安全領域:汽車電子)
-
只有在不得不使用的時候才使用(遍歷目錄)
-
-
練習:
-
求n的階乘
-
斐波那契數列的第n項
-
前兩項都為1,從第三項開始,每一項都等於前兩項的和
-
如:
1,1,2,3,5,8,13,21,...
-
-
常用函式
-
內建函式(無需匯入)
print:列印,輸出 input:輸入 abs:求絕對值 type:獲取變數的型別 chr:將ASCII數值轉換為字元 ord:將字元轉換為對應的ASCII id:獲取變數地址 len:統計元素個數 range:產生連續整數的可迭代物件 enumerate:列舉可迭代物件 強制型別轉換: int float str list tuple set dict max:求多個引數的最大值,或可迭代物件中的最大元素 min:最小值 sum:求和,可迭代物件元素求和 pow:求冪,pow(2, 3)等價於2 ** 3 round:四捨五入,可以指定保留位數 hex:16進位制 oct:8進位制 bin:2進位制
-
模組函式(需要匯入)
time: sleep:休眠指定的秒數,可以是小數 math: e:自然對數 pi:圓周率 ceil:向上取整 floor:向下取整 sqrt:開方(請平方根) degrees:弧度轉換為度 radians:度轉換為弧度 sys: argv:執行程式時所有的命令列引數列表,第一個是程式檔名
練習:完成一個計算器,支援加、減、乘、除運算
練習:
-
前面練習全部以函式形式進行封裝
-
終端計算器
-
刪除列表中的重複元素
-
統計一個字串中字母、數字及其他字元的個數,返回一個元組即可
-
返回一個列表中第二大的數
-
完整列表的排序函式(sort),支援逆序
-
號碼歸屬地查詢:
```5582|1860101|010|北京市|北京聯通GSM卡 5583|1860100|010|北京市|北京聯通GSM卡 5584|1368141|010|北京市|北京移動神州行卡 5585|1860111|010|北京市|北京聯通GSM卡 5586|1358198|010|北京市|北京移動動感地帶卡 5587|1361139|010|北京市|北京移動預付費卡 5588|1361138|010|北京市|北京移動神州行卡 5591|1360110|010|北京市|北京移動全球通卡 5748|1364110|010|北京市|北京移動神州行卡 10186|1581584|020|廣東省廣州市|廣東移動全球通卡 15046|1391897|021|上海市|上海移動全球通卡 17250|1502207|022|天津市|天津移動全球通卡 21137|1345272|023|重慶市萬州|重慶移動大眾卡 22700|1347812|024|遼寧省瀋陽市|遼寧移動大眾卡 24256|1377065|025|江蘇省南京市|江蘇移動全球通卡 26360|1898606|027|湖北省武漢市|湖北電信CDMA卡 28709|1860802|028|四川省成都市|四川聯通GSM卡 30641|1552961|029|陝西省西安市|陝西聯通GSM卡 31700|1563007|0310|河北省邯鄲市|河北聯通GSM卡 33360|1583396|0311|河北省石家莊市|河北移動全球通卡 34825|1508122|0312|河北省保定市|河北移動全球通卡 35363|1551235|0313|河北省張家口|河北聯通GSM卡 37700|1331326|0316|河北省廊坊市|河北電信CDMA卡 43500|1350358|0358|山西省呂梁市|山西移動全球通卡 43908|1553625|0359|山西省運城市|山西聯通GSM卡 44521|1335360|0370|河南省商丘市|河南電信CDMA卡 50078|1509369|0378|河南省開封市|河南移動全球通卡 53603|1583981|0398|河南省三門峽|河南移動全球通卡 53916|1335897|0410|遼寧省鐵嶺市|遼寧電信CDMA卡 55248|1554254|0411|遼寧省大連市|遼寧聯通GSM卡 58618|1374272|0427|遼寧省盤錦市|遼寧移動全球通卡 58932|1554183|0429|遼寧省葫蘆島|遼寧聯通GSM卡 60268|1340475|0431|吉林省長春市|吉林移動大眾卡```