1. 程式人生 > >Python全棧(第一期)Day11

Python全棧(第一期)Day11

今日重點:
初識裝飾器

一,昨日重點複習

作用域鏈 :

小範圍用變數的時候,先從自己的名字空間找,
找不到就一層一層向外層找,知道找到為止。
找不到就報錯。

函式名的本質:

就是一串記憶體地址 可以賦值、可以作為容器型別的元素、函式的引數和返回值 —— 第一類物件

閉包:

內部函式使用外部函式的變數

def outer():
    a = 1
    def inner():
        print(a)
    return inner

i = outer()
i()

二,作業講解

#寫函式,接收n個數字,求這些引數數字的和。
def sum_func(*args):
    print(args)
    print(type(args))
    total = 0

    for i in args:
        total += i
    return total

print(sum_func(1,2,3,8,23,6))

輸出結果:
(1, 2, 3, 8, 23, 6)
<class ‘tuple’>
43

三,裝飾器

1,基本知識點

裝飾器形成的過程 : 最簡單的裝飾器---->有返回值的---->有一個引數---->萬能引數
裝飾器的作用:不想修改函式的呼叫方式 但是還想在原來的函式前後新增功能
原則 :開放封閉原則
語法糖 :@

補充一點小知識:

import time
print(time.time())  # 獲取當前時間
time.sleep(10)  #讓程式在執行到這個位置的時候停一會兒
print('停留十秒之後~')

輸出結果:
1543042834.1915605
停留十秒之後~

2,case:計算程式執行時間

import time
def fun():
    print('老闆同事大家好!')
    print('老闆同事大家好!')
    time.sleep(5)
    print('老闆同事大家好!')
    print('老闆同事大家好!')

def timmer(func):  #裝飾器函式
    start = time.time()
    func()       #被裝飾的函式
    end = time.time()
    return (end - start)

time = timmer(fun)
print(time)

輸出結果:
老闆同事大家好!
老闆同事大家好!
老闆同事大家好!
老闆同事大家好!
5.000150442123413

存在問題:
但是這樣呼叫很麻煩,而且別人不知道,我們應該還是想辦法呼叫func,而不是timmer。

3,改進

語法糖:
緊靠著被裝飾函式,可以去掉:func = timmer(func)

import time
def timmer(f):    #裝飾器函式
    '''
    Note:這裡返回:reture inner  不能返回:return inner()
    :param f:
    :return:
    '''
    def inner():
        start = time.time()
        ret = f()       #被裝飾的函式
        end = time.time()
        print(end - start)
        return ret
    return inner



@timmer
def func():     #被裝飾的函式
    time.sleep(0.01)
    print('老闆好同事好大家好')
    return '新年好'

#func = timmer(func)

ret = func()  #其實這裡的func(),根本就不是我們上面的func()
              #這裡的func本質是inner
print(ret)

輸出結果:
老闆好同事好大家好
0.010993719100952148
新年好

4,一個完美裝飾器

import time
def timmer(f):    #裝飾器函式
    def inner(*args, **kwargs):

        start = time.time()
        ret = f(*args, **kwargs)  #f(1,2)       #被裝飾的函式
        end = time.time()
        print(end - start)
        return ret
    return inner

@timmer         #語法糖 @裝飾器函式名
def func(a, b):     #被裝飾的函式
    time.sleep(0.01)
    print('老闆好同事好大家好', a, b)
    return '新年好!'

@timmer         #語法糖 @裝飾器函式名
def func1(a):     #被裝飾的函式
    time.sleep(0.01)
    print('老闆好同事好大家好', a)
    return '過年好!'



ret = func(1, 2)   #inner()
print(ret)
print('**************************')
ret = func1(1)   #inner()
print(ret)

輸出結果:
老闆好同事好大家好 1 2
0.010993242263793945
新年好!
Hello python
老闆好同事好大家好 1
0.010993719100952148
過年好!