裝飾器:python
從名字上來看,裝飾器就是用來裝飾內容的一個工具.本質上是一個閉包數組
在開發中,裝飾器必需要遵照開放封閉原則:對擴展開放,對修改源代碼封閉.閉包
在裝飾器中,有一個很重要的工具就是@,稱之爲語法糖,語法糖的本質就是:被裝飾的函數名 = 裝飾器的名字(被裝飾的函數名)app
在裝飾器的應用上,有一個很簡單的例子函數
計算簡易的函數運行時間工具
import time # 導入time模塊 print(time.time()) # 獲取時間戳 start_time = time.time() # 開始時間 def foo(): # 定義函數foo time.sleep() # 能夠本身定義睡眠時間 print(100) foo() # 調用函數foo end_time = time.time() # 結束時間 在這時,函數的運行時間爲end_time-start_time
接一個比較規範的寫法:學習
import time 1,導入time模塊 def func(x): 2,定義func函數,此時必須有形參 def wapper(): 5,定義wapper函數 start_time = time.time() 9, x() 10,這兒的x是foo的內存地址,加括號是調用foo函數 end_time = time.time() 12, print(start_time - end_time) 13, return wapper 6,將wapper函數的內存地址返回給調用者func def foo(): 3,定義foo函數 print("今天週二") 11,執行print foo = func(foo) 4,等號右邊,將foo的內存地址傳給了func函數的x 7,等號左邊,將wapper的內存地址賦給了foo,
foo() 8,調用wapper函數
如今用一個裝飾器來寫:測試
def func(x): def wapper(*args,**kwargs): x(*args,kwargs) return wapper @func @加裝飾器的名字,就至關於:inner = func(inner) def inner(*args,**kwargs): print(*args) inner() ps:這是最簡單的一種裝飾器
內置函數,編碼
python中提供的一些工具,咱們能夠直接拿過來用,咱們知道,在python中有68個內置函數.在以前已經接觸過input,print,id,globals,locals等幾個函數;spa
今天來繼續學習一些內置函數,在目前所學的知識中,比較重要的函數,主要有enumerate,lambda,sorted,filter,map,zip,reduce
enumerate,枚舉
for i in enumerate(): 括號中第一個參數必須是可迭代對象,第二個參數是起始值,能夠本身定義,默認爲0 print(i)
for i in enumerate("166",1)
print(i)
輸出結果爲(1,'1'),(2,'6'),(3,'6')
lambda,匿名函數
匿名函數定義時,沒有def,沒有函數名,它有形參,能夠接收多個形參,查名字能夠用:函數.__name__
格式爲: lambda 參數:返回值
f = lambda x:x+x print(f(3)) 輸出內容爲:6
能夠直接寫:print((lambda x:x+x)(3)),調用時要傳參
sorted,排序
print(sorted(可迭代對象)) 默認是升序 print(sorted(可迭代對象),reverse=True) 降序
例1:
sorted('可迭代對象',key='函數名',reverse=True) 函數名裏寫排序的規則,能夠指定升序或者降序 lst = ['光年以外','bgm','這個世界太瘋狂','accord'] print(sorted(lst,key=lambda x:len(x),reverse=True))
輸出結果爲:['這個世界太瘋狂','accord','光年以外','bgm']
filter 篩選過濾
filter('寫好過濾規則的函數','可迭代對象')
篩選列表:
lst = [1,2,3,4,5,6] print(list(filter(lambda x:x>3,lst))) 結果爲:[4,5,6]
篩選字典: dic = [{'name':'依依','age':18},{'name':'小五子','age':20}] print(list(filter(lambda x:x['age']>18,dic))) 結果爲:{'name':'小五子',''age':20}
map,映射函數
1,能夠快速實現列表內每一個元素的基礎運算,加,乘...
2,能夠快速的將多個可迭代對象,元素位置相同的進行上下累加
lst = [1,2,3,4,5,6] lst1 = [2,3,4,5,6,7] print(list(map(lambda x,y:x+y,lst,lst1))) 結果爲[3,5,7,9,11,13]
zip函數
它的返回值是多個,若是是多個可迭代對象,按照最短的進行輸出,能夠將它戲稱爲拉鍊函數
lst = [1,2,3] lst1= [2,3,4,5,6] lst2 = [5,6,7,8] for i in zip(lst,lst1,lst2): print(i) 結果爲:(1,2,5),(2,3,6),(3,4,7)
reduce,實現累計算
python3中,導入reduce函數:from functools import reduce
lst = [1,2,3,4,5,6] print(reduce(lambda x,y:x**2,lst)) 結果爲:120
其餘函數:
檢測可迭代對象:
all( ),都爲真時,輸出True,有一個假就爲False
any( ),有一個真即爲True
進制轉換:
bin( ),把參數轉化成二進制
otc( ),把參數轉化成八進制
hex( ),把參數轉化成十六進制
和ascii碼相關:
acsii( ),若是括號中元素在ascii碼中,就原生顯示;若是不在,就返回\u...
chr( ),對應ascii碼,輸入位置字符找出對應字符
ord( ),找帶字符位置的編碼
和數字運算相關:
abs( ),求數字的絕對值
round( ),四捨五入;第一個參數爲浮點數,第二個參數爲保留的位數
pow( ),兩個參數是求冪運算,三個參數是求冪後再取餘
max( ),求最大值;若是是字典,比較的是鍵
min( ),求最小值
float( ),浮點;
和字節相關:
memoryview( ),求字節的內存地址
bytes( ),查字節;第一個參數是要查詢的內容,第二個參數是編碼集
bytearray( ),返回一個新字節數組,每一個元素的值的範圍是0~256對應的是ascii碼錶;第一個參數放內容,第二個參數是編碼集
callable( ),判斷是否可調用
repr( ),顯示數據的原生形態
如下兩個函數禁用:
eval( ),它能夠執行字符串中的部份內容,容易出問題
exec( ),不論字符串輸入什麼,均可以運行,更容易出問題
遞歸
要知足的條件是:本身調用本身,是一個無止境的遞歸,必須得有明確的終止條件
def func(): print("你好") func() func() 會報錯,內存溢出
官方聲明遞歸的最大深度爲1000,修改遞歸最大深度的方式是:sys.setrecursionlimit('修改的數量')
def func(n): print(n) n += 1 func(n) func(1) 實際測試在996-998之間
遞歸主要應用在os模塊中,能夠遞歸建立文件夾,也能夠刪除,也能夠查看文件