【6】裝飾器、閉包、偏函數、變數範圍問題

來源:互聯網
上載者:User

標籤:函數名   ret   實現   inner   bubuko   變數範圍   class   rgs   info   

 

 

 

 

【一】、裝飾器思想裝飾器是其實想增加一個函數的功能,但是又不想變動原來函數的代碼,就用裝飾器。比如:我們用別人的一個函數,又不是很滿意,所以用裝飾器裝飾一下即可。

 

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=010         say(age)11     return inner12 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@outer2def 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】裝飾器、閉包、偏函數、變數範圍問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.