函數基礎 函數簡介 定義:就是具有特定功能的一段代碼 優點: 解決代碼的重覆書寫 可以將功能的實現著和使用者分開,提高開發效率 分類: 庫函數:print、input、abs等 自定義:用戶自己封裝的函數 定義:就是具有特定功能的一段代碼 優點: 解決代碼的重覆書寫 可以將功能的實現著和使用者分開, ...
函數基礎
函數簡介
-
定義:就是具有特定功能的一段代碼
-
優點:
-
解決代碼的重覆書寫
-
可以將功能的實現著和使用者分開,提高開發效率
-
-
分類:
-
庫函數: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|吉林省長春市|吉林移動大眾卡'''