我的Python分析成長之路5
阿新 • • 發佈:2019-01-05
一、裝飾器:
本質是函式,裝飾其他函式,為其他函式新增附加功能。
原則:
1.不能修改被裝飾函式的原始碼。
2.不能修改被裝飾函式的呼叫方式。
裝飾器用到的知識:
1.函式即變數 (把函式體賦值給函式名)
2.高階函式 (1.一個函式接受另一個函式名作為實參2.返回值中含有函式名)
3.巢狀函式(一個函式巢狀這另一個函式)
先看高階函式 :
1。要實現不修改被裝飾函式的原始碼,就要使用一個函式接受另一個函式名作為實參
2.要實現不修改原始碼的呼叫方式,使用返回值中包含函式名
巢狀函式:
def test1(): print("in the test1") def test2(): print("in the test2") test2() test1() #一個函式中包含另一個函式,而且內部的函式只能在內部呼叫
裝飾器的實現
#給計算test的執行時間 def timer(func): def wrapper(): start_time= time.time() func() end_time = time.time() print("函式執行時間:%s"%(end_time-start_time)) return wrapper @timer def test(): time.sleep(1) # test = timer(test) test()
import time def timer(func): def wrapper(n): start_time = time.time() func(n) end_time= time.time() print("函式執行時間:%s"%(end_time-start_time)) return wrapper @timer def test(n): #當函式中含有引數時 time.sleep(1) print("列印的值為:%s"%n) # test = timer(test) test(5)
1 import time 2 def timer(func): 3 def wrapper(*args,**kwargs): #當函式中含有任意多個引數引數時 4 start_time = time.time() 5 func(*args,**kwargs) 6 end_time = time.time() 7 print("函式執行時間:%s"%(end_time-start_time)) 8 return wrapper 9 @timer 10 def test(age,name): 11 time.sleep(1) 12 # print("列印的值為:%s") 13 print("年齡是%s,名字是%s"%(name,age)) 14 # test = timer(test) 15 test(24,name='小明')
二、迭代器與生成器
列表生成式 [i *2 for i in range(10)]
生成器 1.只有在呼叫的時候才會生成資料。2.只記錄當前位置。3.只有next方法,直到最後丟擲stopiteration才終止
第一種形式
1 [i *2 for i in range(10)] #列表生成式 2 x = (i *2 for i in range(10)) #生成器 3 print(x.__next__()) 4 print(x.__next__()) 5 print(next(x))
第二種形式
1 def f(maxiter): 2 n,a,b = 0,0,1 3 while n<maxiter: 4 yield b #用函式形成生成器 含有 yield 5 a,b = b,a+b 6 n += 1 7 x = f(10) 8 print(x.__next__()) #要想生成資料,需要呼叫next方法 9 print(x.__next__())
如果要獲取生成器的值,就要捕獲stopiteration異常
1 def f(maxiter): 2 n,a,b = 0,0,1 3 while n<maxiter: 4 yield b 5 a,b = b,a+b 6 n += 1 7 return "done" #如果要獲取函式的返回值,就要捕獲stopiteration異常 8 x = f(3) 9 while True: 10 try: 11 print("x:",x.__next__()) 12 except StopIteration as e: 13 print("生成器返回值:",e.value) 14 break
1 #最簡單的生產者消費者模型 2 import time 3 def consumer(name): 4 print("%s要準備吃包子了"%name) 5 while True: 6 baozi = yield 7 print("%s包子被%s吃了"%(baozi,name)) 8 def produser(name): 9 c1 = consumer('A') 10 c2 = consumer('B') 11 c1.__next__() 12 c2.__next__() 13 for i in range(10): 14 time.sleep(1) 15 print("%s做了2個包子"%name) 16 c1.send(i) 17 c2.send(i) 18 produser('xiaoming')可迭帶物件iterable:可以直接用for迴圈的物件稱為可迭代物件 可以用isinstance()函式判斷是不是可迭代物件
迭代器iterator:可以呼叫next方法,並不斷返回下一個值的物件 生成器都是迭代器,list、dict、str 都是可迭代物件,但不是迭代器。可用iter方法使之稱為迭代器
三、map、filter、reduce函式
1 print(map(lambda x:x*2,range(10))) 2 print(list(map(lambda x:x*2,range(10)))) 3 #map(func,iterable)對iterable呼叫func 得到的是 4 print(list(filter(lambda x:x>5,range(10)))) 5 #filter(func,iterable) #對可迭代物件進行篩選 6 print(list(filter(lambda x:x.startswith('m'),['mn','mb','b']))) 7 from functools import reduce 8 print(reduce(lambda x,y:x+y,range(10))) #進行累加操作 9 # reduce(func,iterable)
四、json和pickle模組
1 data ={'name':'zqq','age':8,'sex':"boy"} 2 f = open("file.json","r") 3 # f.write(str(data)) 4 import json 5 x = json.dumps(data) #序列化 或 json.dump(data,f) dump可以多次,load只能一次 6 f.write(x) 7 data = json.loads(f.read()) #反序列化 或json.load(f) 8 print(data) 9 f.close() 10 11 f = open("ddd.txt","wb") 12 import pickle 13 x = pickle.dumps(data) #序列化 pickle.dump(data,f) 14 f.write(x) 15 f.close() 16 f = open("ddd.txt","rb") 17 import pickle 18 data = pickle.loads(f.read()) #反序列化 pickle.load(f) 19 print(data)