1. 程式人生 > >Python基礎(7)閉包函數、裝飾器

Python基礎(7)閉包函數、裝飾器

是我 ron 源代碼 開放封閉原則 不能 函數嵌套 嵌套 源碼 cnblogs

一、閉包函數

閉包函數:1、函數內部定義函數,成為內部函數,      2、改內部函數包含對外部作用域,而不是對全局作用域名字的引用 那麽該內部函數成為閉包函數
#最簡單的無參閉包函數
def func1()
    name=ares
    def func2()
        print(name)
#有參和返回值的閉包函數
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        res=func(*args,**kwargs)
        stop_time
=time.time() print(run time is %s %(stop_time-start_time)) return res return wrapper

二、高階函數

  1)函數接收的參數是一個函數名   2)函數的返回值是一個函數名   3)滿足上述條件任意一個,都可稱之為高階函數
#高階函數應用1:把函數當做參數傳給高階函數
import time
def foo():
    print(from the foo)
def timmer(func):
    start_time=time.time()
    func()
    stop_time
=time.time() print(函數%s 運行時間是%s %(func,stop_time-start_time)) timmer(foo) #總結:我們確實為函數foo增加了foo運行時間的功能,但是foo原來的執行方式是foo(),現在我們需要調用高階函數timmer(foo),改變了函數的調用方式 #高階函數應用2:把函數名當做參數傳給高階函數,高階函數直接返回函數名 import time def foo(): print(from the foo) def timmer(func): start_time=time.time() return
func stop_time=time.time() print(函數%s 運行時間是%s %(func,stop_time-start_time)) foo=timmer(foo) foo() #總結:我們確實沒有改變foo的調用方式,但是我們也沒有為foo增加任何新功能
高階函數總結 1.函數接收的參數是一個函數名   作用:在不修改函數源代碼的前提下,為函數添加新功能,   不足:會改變函數的調用方式 2.函數的返回值是一個函數名   作用:不修改函數的調用方式   不足:不能添加新功能 三、函數嵌套
#函數的嵌套定義
def f1():
    def f2():
        def f3():
            print(from f3)
        print(from f2)
        f3()
    print(from f1)
    f2()
# print(f1)
f1()
‘‘‘
from f1
from f2
from f3
‘‘‘

四、裝飾器

1、定義: 器即函數 裝飾即修飾,意指為其他函數添加新功能 裝飾器定義:本質就是函數,功能是為其他函數添加新功能 2、裝飾器遵循的原則:開放封閉原則(對擴展是開放的,對源碼修改是封閉的)   即、1)不修改被裝飾函數的源代碼     2)為被裝飾函數添加新功能後,不修改被裝飾函數的調用方式 3、裝飾器,裝飾器本質可以是任意可調用對象,被裝飾的對象也可以是任意可調用對象,   裝飾器的功能是:在不修改被裝飾對象源代碼以及調用方式的前提下為期添加新功能 裝飾器=高階函數+函數嵌套+閉包 基本框架
#這就是一個實現一個裝飾器最基本的架子
 def timer(func):
 def wrapper():
 func()
 return wrapper

統計一個函數運行時間的裝飾器

# import time
# import random
# #裝飾器
# def timmer(func):
#     # func=index
#     def wrapper():
#         start_time = time.time()
#         func() #index()
#         stop_time=time.time()
#         print(‘run time is %s‘ %(stop_time-start_time))
#     return wrapper
# #被裝飾函數
# def index():
#     time.sleep(random.randrange(1,5))
#     print(‘welecome to index page‘)
#
# def home():
#     time.sleep(random.randrange(1,3))
#     print(‘welecome to HOME page‘)
#
# index=timmer(index) #index=wrapper
# home=timmer(home)
#
# index() #wrapper()
# home()

裝飾器的語法:在被裝飾對象的正上方的單獨一行,@裝飾器名字,[email protected]=timmer(index)

import time
import random
#裝飾器
def timmer(func):
    def wrapper():
        start_time = time.time()
        func()
        stop_time=time.time()
        print(run time is %s %(stop_time-start_time))
    return wrapper
#被裝飾函數
@timmer             #index=timmer(index)
def index():
    time.sleep(random.randrange(1,5))
    print(welecome to index page)
# @timmer #home=timmer(home)
# def home():
#     time.sleep(random.randrange(1,3))
#     print(‘welecome to HOME page‘)
index() #wrapper()
# home()

加多個裝飾器:

#加多個裝飾器
import time
import random
#裝飾器
def timmer(func):
    def wrapper():
        start_time = time.time()
        func()
        stop_time=time.time()
        print(run time is %s %(stop_time-start_time))
    return wrapper
def auth(func):
    def deco():
        name=input(name: )
        password=input(password: )
        if name == egon and password == 123:
            print(login successful)
            func() #wrapper()
        else:
            print(login err)
    return deco
#被裝飾函數  #多個裝飾函數,從上往下添加,調用時從下往上
@auth                 #index=auth(wrapper) #index=deco                                   #index=auth(wrapper) #index=deco
@timmer                #index=timmer(index) #index=wrapper
def index():
    # time.sleep(random.randrange(1,5))
    time.sleep(3)
    print(welecome to index page)
def home():
    time.sleep(random.randrange(1,3))
    print(welecome to HOME page)
# index() #deco()
# home()

裝飾器修訂:

#裝飾器修訂
import time
import random
#裝飾器
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        res=func(*args,**kwargs)  #接收參數
        stop_time=time.time()
        print(run time is %s %(stop_time-start_time))
        return res    #增加返回值
    return wrapper
#被裝飾函數
@timmer
def index():
    time.sleep(random.randrange(1,5))
    print(welecome to index page)
@timmer
def home(name):
    time.sleep(random.randrange(1,3))
    print(welecome to %s HOME page %name)
    return 123123123123123123123123123123123123123123
index()
res1=index()
print(index return %s %res1)
res2=home(egon) #wraper()
print(home return %s %res2)

Python基礎(7)閉包函數、裝飾器