1. 程式人生 > >【6】裝飾器、閉包、偏函數、變量作用域問題

【6】裝飾器、閉包、偏函數、變量作用域問題

int div 如何 func 語句塊 通用 什麽 分享 加強

技術分享圖片

技術分享圖片

【一】、裝飾器思想

裝飾器是其實想增加一個函數的功能,但是又不想變動原來函數的代碼,就用裝飾器。

比如:我們用別人的一個函數,又不是很滿意,所以用裝飾器裝飾一下即可。

def fun1():
    print("嘉嘉 is a good man !")

def outer():
    print("****")
    fun1()

outer()

【二】閉包

什麽是閉包?

閉包:把一個函數當做一個參數傳入另一個函數。本質上是一個返回函數的函數

案例1:簡單的閉包實現裝飾器代碼

# 簡單的裝飾器
# 即以上起到了裝飾器的作用,但是是寫死了的,如何才能用一個調用來實現呢
# 閉包:把一個函數當做一個參數傳入另一個函數。本質上是一個返回函數的函數
print(
------------------------我是分割線-------------------------) def fun2(): print("嘉嘉 is a good man !") def outer2(fun): def inner(): print("****") fun() return inner # f代表是裝飾後的返回的加強版的一個函數,並且是要裝飾誰,把誰傳進去。那麽傳入進去的東西被 # inner函數中的內容修飾了。 f=outer2(fun2) print(type(f)) f() ‘‘‘ 輸出: **** 嘉嘉
is a good man ! ‘‘‘

其中:

f代表是裝飾後的返回的加強版的一個函數,並且要裝飾誰,把誰傳進去。那麽傳入進去的東西被 # inner函數中的內容修飾了。

案例2:復雜一點的裝飾器

 1 # 案例2 :復雜一點的裝飾器
 2 def say(age):
 3     print("she is %d years old " %(age) )
 4 
 5 # 寫一個裝飾器
 6 def outer(func):
 7     def inner(age):
 8         if age<0:
 9             age=0
10         say(age)
11 return inner 12 13 say2=outer(say) 14 # 此時調用的say2 其實就是outer函數返回的一個inner函數,say2他本身是函數 15 # 此時傳入age=-5,執行say2函數,其實就是執行內存inner這個函數,
 16 say2(-5) 17 say2(89) 18 ‘‘‘ 19 輸出是: 20 she is 0 years old 21 she is 89 years old 22 ‘‘‘

總結:

4 # 此時調用的say2 其實就是outer函數返回的一個inner函數,say2他本身是函數 15

# 此時傳入age=-5,執行say2函數,其實就是執行內存inner這個函數,

案例2-改進 :用標準的裝飾器語法來寫的話如下代碼

# 案例2 改進 標準的裝飾器
@outer     #其實這個是等價 say2=outer(say)
def say3(age):
    print("she is %d years old " %(age) )

# 寫一個裝飾器
def outer(func):
    def inner(age):
        if age<0:
            age=0
        say(age)
    return inner

# say2=outer(say)      上邊給需要裝飾的函數寫了@  這句話是可以直接省略的。

say3(-3)     #註意:用@裝飾完之後的函數名是不變的。
‘‘‘
輸出是:
she is 0 years old 
‘‘‘

案例3-通用裝飾器

此裝飾器是通用版本,就不用擔心傳遞的形參的個數問題啦

# 案例3 改進 通用裝飾器
# 寫一個裝飾器
def outer2(func):
    def inner2(*args, **kwargs):
        ‘‘‘
        # 添加需要控制功能的語句塊
        if age<0:
            age=0
        ‘‘‘
        print("我是裝飾的代碼塊")
        return func(*args,**kwargs)

    return inner2

@outer2
def say4(age,name):
    print("she is %d years old ,Her name is %s "%(age,name) )


print("通用裝飾器!")
say4(-3,"佳佳")     #註意:用@裝飾完之後的函數名是不變的。
‘‘‘
輸出是:

  我是裝飾的代碼塊
  she is -3 years old ,Her name is 佳佳

‘‘‘

技術分享圖片

案例1 簡單的偏函數

# 偏函數:其實就是對形參的一個默認值的控制

def int_(str,base=2):
    return int(str,base)

print(int_("1010"))

# 輸出:10
# 方法2  引入模塊法

import functools
int3=functools.partial(int,base=2)

print(int3("1010"))

# 輸出:10
 

技術分享圖片

作用域:

1、局部作用域

2、全局作用域

3、內建作用域

<未完待補充!>

技術分享圖片

【6】裝飾器、閉包、偏函數、變量作用域問題