1. 程式人生 > >我的Python分析成長之路5

我的Python分析成長之路5

一、裝飾器:

  本質是函式,裝飾其他函式,為其他函式新增附加功能。

  原則:

    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)