一、函數 1、為什麼要用函數 a、避免代碼重用 b、提高代碼的可讀性 2、函數的調用 返回值=函數名(參數1,參數2) 函數定義 返回值 關鍵字:return 3、return的作用: a、結束函數的執行 b、返回要返回的值 4、返回值的兩種情況 a、返回值為None def mylen(): "" ...
一、函數
1、為什麼要用函數
a、避免代碼重用
b、提高代碼的可讀性
2、函數的調用
返回值=函數名(參數1,參數2)
函數定義---返回值
關鍵字:return
3、return的作用:
a、結束函數的執行
b、返回要返回的值
4、返回值的兩種情況
a、返回值為None
def mylen(): """計算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) str_len = mylen() print(str_len)不寫return
def ret(): print(111) return print(222) re = ret() print(re)只寫return
def ret(): print(111) return None print(222) re = ret() print(re)return None
b、返回值不為None
1、返回一個值
def mylen(): """計算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return length str_len = mylen() print(str_len)返回一個值
2、返回多個值
5、函數的調用----接受返回值
a、返回值為None 不接受
b、返回值不為None
1、返回一個值
用一個變數接受
2、返回多個值
a、用一個變數接受,接受的結果是一個元祖
b、有多少個返回值就用多少個值接受
6、參數
a、參數----站在定義函數的角度
1、位置參數
2、預設參數
3、動態參數
a、*args
b、**kwargs
順序:位置參數、*args、預設參數、**kwargs
b、參數----站在調用函數的角度上
1、按照位置傳參
2、按照關鍵字傳參
3、動態傳參*tup,**dic
7、參數分為形參和實參
a、實參:調用函數的時候傳入的參數
8、位置參數
a、位置參數必須傳值
def aaa(a,b): print(a,b) aaa(1,2)位置參數
9、預設參數
a、預設參數可以不傳值
def bbb(x=10): print(x) bbb() #x = 10 bbb(20) #x = 20預設參數
10、動態參數
def ccc(*args):#1,2,3,4,5 print(args) ccc(1,2,3,4,5)#按位置傳參數 t = (1,2,3,4,5) ccc(t) ((1, 2, 3, 4, 5),) ccc(*t) (1, 2, 3, 4, 5) 複製代碼動態參數
def ddd(**kwargs): print(kwargs) ddd(k = 'a',j = 'b')#按關鍵字傳參數動態參數+關鍵字參數
def eee(*args,**kwargs): print(args,kwargs) eee(12,123)動態,先按位置參數,再按關鍵字參數
11、命名空間
a、命名空間分為三種
1、全局命名空間
2、局部命名空間
3、內置命名空間
b、三種命名空間的順序:內置命名空間>全局命名空間>局部命名空間
c、取值
1、在局部調用:局部命名空間->全局命名空間->內置命名空間
x = 1 def f(x): print(x) print(10)View Code
2、在全局調用:全局命名空間->內置命名空間
x = 1 def f(x): print(x) f(10) print(x)View Code
12、作用域
a、 作用域就是作用範圍,按照生效範圍可以分為全局作用域和局部作用域。
b、 全局作用域:包含內置名稱空間、全局名稱空間,在整個文件的任意位置都能被引用、全局有效
c、局部作用域:局部名稱空間,只能在局部範圍內生效
作用域:
小範圍的可以用大範圍的
但是大範圍的不能用小範圍的
範圍從大到小(圖)
在小範圍內,如果要用一個變數,是當前這個小範圍有的,就用自己的
如果在小範圍內沒有,就用上一級的,上一級沒有就用上上一級的,以此類推。
如果都沒有,報錯
13、閉包
a、閉包分為:
1、閉:內部函數
2、包:包含對外部函數的作用域中變數的引用
b、閉包常用的的形式
def hei(): x = 20 def inner(): print(x) #局部的 return inner i = hei() i() #全局閉包常用形式
14、函數值裝飾器
a、裝飾器的本質:閉包函數
b、裝飾器的功能:就是在不改變原函數調用方式的情況下,在這個函數的前後加上擴展功能
def timer(func): def inner(a): start = time.time() func(a) print(time.time() - start) return inner @timer def func1(a): print(a) func1(1)帶參數的裝飾器
15、裝飾器的開放封閉原則:
a、對擴展是開放的
b、對修改是封閉的
def timer(func): def inner(*args,**kwargs): '''執行函數之前要做的''' re = func(*args,**kwargs) '''執行函數之後要做的''' return re return inner裝飾器的固定方式
16、裝飾器應用場景
a、計算func的執行時間
b、登錄認證
17、可迭代
a、字元串,列表,集合,字典,元祖這些度可以for迴圈,說明他們是可迭代的
b、迭代就是:將某個數據集內的數據一個挨一個的取出來,就 叫做可迭代
c、可迭代對應標誌:__iter__
18、迭代協議
a、希望這個數據類型里的東西也可以使用for被一個一個的取出來,那我們就必須滿足for的要求
b、可迭代協議——凡是可迭代的內部都有一個__iter__方法
19、迭代器協議
a、迭代器協議 : 內部實現了__iter__ __next__方法
可迭代和迭代器的不同點 : 迭代器多實現了一個__next__方法
可迭代和迭代器的相同點 : 都可以用for迴圈
20、判斷迭代器和可迭代的方法
a、第一種:判斷內部是不是實現了 __next__
'__next__' in dir(o)
b、第二種
from collections import Iterable #可迭代 from collections import Iterator #迭代器 isinstance(o,Iterable) isinstance(o,Iterator)
21、生成器
a、生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,
掛起函數的狀態,以便下次重它離開的地方繼續執行
b、生成器表達式:類似於列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表
生成器函數
def func(): print('aaaa') a = 1 yield a #返回第一個值 print('bbbb') yield 12 #返回第二個值 ret = func() #拿到一個生成器 print(ret) print(next(ret)) #取第一個值 print(next(ret)) #取第二個值 print(next(ret)) #取第三個值 會報錯 因為沒有第三個值生成器函數
22、列表推導式
平常:
for i in range(100): print(i*i)n*n
列表推到:
l =[i*i for i in range(100)] print(l)n*n
23、遞歸函數
a、在一個函數里調用自己
b、Python遞歸最大層數限制997
c、最大層數限制是python預設的,可以做修改,但是不建議你修改
d、遞歸實例
def age(n): if n == 1: return 40 else: ret = age(n-1) return ret + 2 age(5)算年齡
e、遞歸結束標誌:return
遞歸三級菜單
menu = { '北京': { '海澱': { '五道口': { 'soho': {}, '網易': {}, 'google': {} }, '中關村': { '愛奇藝': {}, '汽車之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龍觀': {}, }, '朝陽': {}, '東城': {}, }, '上海': { '閔行': { "人民廣場": { '炸雞店': {} } }, '閘北': { '火車戰': { '攜程': {} } }, '浦東': {}, }, '山東': {}, } def threeLM(menu): for key in menu: print(key) k = input(">>>") if k in menu: threeLM(menu[k]) threeLM(menu)三級菜單
24、匿名函數
a、 匿名函數 簡單的需要用函數去解決的問題 匿名函數的函數體 只有一行,也叫lambda
b、 函數名 = lambda 參數 :返回值
c、參數可以有多個,用逗號隔開,匿名函數不管邏輯多複雜,只能寫一行,且邏輯執行結束後的內容就是返回值。返回值和正常的函數一樣可以是任意數據類型
add2 = lambda x,y : x+y ret = add2(1,2) print(ret)View Code
l = [1,2,3,4] print(list(map(lambda x:x*x , l)))View Code
25、內置函數
a、isinstance 判斷變數的數據類型
temp = "asdfsdfs" r = isinstance(temp, list) print(r)
b、lambda用法:
def f1(): return 123 f2 = lambda :123 r1 = f1() r2 = f2() print(r1,r2)
def f3(a1,a2): return a1 + a2 f4 = lambda a1,a2: a1 + a2 r3 = f3(1,2) r4 = f4(3,4) print(r3,r4)
c、abs--取絕對值
i = abs(-123) print(123)
d、divmod 除商得餘數---例如分頁
a = 10 / 3 print(a) r = divmod(10,3) print(r) 結果: 3.33333335 (3,1)
e、eval -----強制不轉換輸入類型的格式
ret = eval("1 + 3") print(ret) 結果:4
f、filter (過濾)
ret = filter(lambda x: x >22, [11,22,33,44]) for i in ret: print(i)
g、map 無論是map還是filter,得到的結果都是可迭代的對象,迭代器的實例
def f1(x): if x % 2 == 1: return x + 100 else: return x ret = map(f1, [1,2,3,4,5]) ret2 = map(lambda x: x + 100if x % 2 == 1 else x ,[1,2,3,4,5]) print(ret) for i in ret : print(i)
h、max()最大數 min() 最小數
li = [11,22,123,1] r = max(li) print(r) a = min(li) print(a)
g、pow(x,y) ----就是求x的y次方
i = pow(2,100) print(i)
k、zip ---意思就是取兩個變數中索引相對應的值
li1 = [11,22,33,44] li2 =["a",'VV',"c","E"] r = zip(li1,li2) print(r) for i in r : print(i)
l、、open---打開,關閉,close
模式 描述 r 打開一個文件為只讀。文件指針被放置在文件的開頭。這是預設模式。 rb 打開一個文件只能以二進位格式讀取。文件指針被放置在文件的開頭。這是預設模式。 r+ 打開用於讀和寫文件。文件指針置於該文件的開頭。 rb+ 打開用於讀取和寫入二進位格式的文件。文件指針置於該文件的開頭。 w 打開一個文件只寫。如果文件存在覆蓋該文件。如果該文件不存在,則創建寫入新文件。 wb 打開一個文件只能以二進位格式寫入。如果文件存在覆蓋該文件。如果該文件不存在,則創建寫入新文件。 w+ 打開文件為寫入和讀取模式。如果文件存在覆蓋現有文件。如果該文件不存在,創建用於讀寫操作的新文件。 wb+ 打開用於以二進位格式寫入和讀出文件。如果文件存在覆蓋現有文件。如果該文件不存在,創建用於讀寫操作的新文件。 a 打開用於追加的文件。文件指針是在文件是否存在該文件的末尾。也就是說,該文件是在追加模式。如果該文件不存在,它會創建一個用於寫入的新文件。 ab 打開文件用於二進位格式追加。文件指針是在文件是否存在該文件的末尾。也就是說,文件是在追加模式。 如果該文件不存在,它會創建一個用於寫入的新文件。 a+ 打開文件為追加和讀取方式。文件指針是在文件是否存在該文件的末尾。該文件以追加模式打開。如果該文件不存在,它將創建用於讀寫操作的新文件。 ab+ 打開一個文件以附加和二進位格式讀取模式。如果該文件存在文件指針在該文件的末尾。該文件以追加模式打開。如果該文件不存在,它將創建讀寫操作的新文件。