亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

關于Python閉包裝飾器的簡介

發布時間:2020-06-30 09:22:45 來源:億速云 閱讀:122 作者:清晨 欄目:開發技術

小編給大家分享一下關于Python閉包裝飾器的簡介,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!

閉包內容:

匿名函數:能夠完成簡單的功能,傳遞這個函數的引用,只有功能

普通函數:能夠完成復雜的功能,傳遞這個函數的引用,只有功能

閉包:能夠完成較為復雜的功能,傳遞這個閉包中的函數以及數據,因此傳遞是功能+數據

對象:能夠完成最復雜的功能,傳遞很多數據+很多功能,因此傳遞的是數據+功能

———————————————————

對全局函數進行修改:在函數當中加global,在閉包中外邊中的變量加nonlocal

閉包定義:有兩個函數嵌套使用,里面的函數可以使用外面函數所傳輸的參數,最后可傳遞的是里面函數的結構與數據(個人理解)。

最后閉包可以在python中引申出裝飾器 ———————————————————

def closure():
  # 在函數內部再定義一個函數,
  # 并且這個函數用到了外邊函數的變量,那么將這個函數以及用到的一些變量稱之為閉包
  def closure_in(x):
    print('---------我是打不死的%s--------' %x)
  return closure_in
​
x = closure()
x('小強')
​
print('*'*20)
# -----加餐---------
def closure_1(a,b,c):
  def closure_on(x):
    print('-----%s加餐-------' %b)
    print(a*x + c)
  return closure_on
​
demo = closure_1(2,'小強',3) #傳closure_1函數
demo(4) #傳clsure_on函數
​
#注:函數不加括號,調用的是函數本身【function】;函數加括號,調用的是函數的return結果。

裝飾器內容:

代碼要遵守‘開放封閉'原則;對已經寫好的函數遵守封閉,對功能擴展遵守開放;

# 裝飾器的作用:為了對原來的代碼上進行擴展
def decoration(func):
  def call_func():
    print('-------正在裝飾 -------' )
    func()
  return call_func
​
#@decoration   #--->demo_new = decoration(demo)
def demo():
  print('demo----')
​
demo_new = decoration(demo)
demo_new()

使用裝飾器來測試一個函數的運行時:

import time
def set_func(func):
  def call_func():
    start_time = time.time()
    func()
    stop_func = time.time()
    print(‘alltimes is %f' %(stop_func-start_fun))
  return call_func
@set_func
def test1():
  print(‘——-test1———')
test1()
​
#等價于:
@set_func==test1 = set_func(test1)

1. 沒有參數,沒有返回值的函數進行裝飾:

def set_func(func):
  def call_func():
    print(‘———test2——-')
    print(‘———-test3——')
    func()
  return call_func

@set_func
def test1():
  print(‘——test1——-  ')

2. 對有參數無返回值的函數進行裝飾:

def set_func(func):
  def call_func(a): #變
    print(‘———test2——-')
    print(‘———-test3——')
    func(a) #變
  return call_func

@set_func
def test1(num):
  print(‘——test1——- %d  ' %num)
​
test1(100) —->call_func(100)
test1(200)——>call_func(200)

復現裝飾器原理:

————————————————————————-

只要遇到@函數 裝飾器(這句話),在程序中就已經執行了!!

3. 不定長參數的函數裝飾:

def set_func(func):
  def call_func(*args,**kwargs): #變
    print(‘———test2——-')
    print(‘———-test3——')
    func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;
    #func(args,kwargs)—>不行,相當于傳遞了兩個參數:一個元祖,一個字典。
  return call_func
@set_func
def test1(num,*args,**kwargs):
  print(‘——test1——- %d  ' %num)
  print(‘——test1——-  ' , args)
  print(‘——test1——- ' ,kwargs )
test1(100)
test1(100,200)
test1(100,200,300,mm=100)

注意:*args保存不定長參數,以元祖保存,**kwargs保存字典形式(mm=...)

4.對應的返回值參數進行裝飾、通用裝飾器:

#通用裝飾器
def set_func(func):
  print(“開始進行裝飾———-”)
  def call_func(*args,**kwargs): #變
    print(‘———test2——-')
    print(‘———-test3——')
    return func(*args,**kwargs) #(拆包)將元祖拆開,每個進行傳輸;如果沒有return ret返回none。
    #func(args,kwargs)—>不行,相當于傳遞了兩個參數:一個元祖,一個字典。
  return call_func

@set_func
def test1(num,*args,**kwargs):
  print(‘——test1——- %d  ' %num)
  print(‘——test1——-  ' , args)
  print(‘——test1——- ' ,kwargs )
  return ‘ok'  #—-返回給上面的func(),然后return func—ret
ret = test1(100)

5. 多個裝飾器對同一個函數進行裝飾:

def add_qx(func):
  print(“——開始進行裝飾權限1———-”)
  def call_func(*args,**kwargs): #變
    print(‘這是權限驗證1')
    return func(*args,**kwargs)
  return call_func

​
def add_xx(func):
  print(“——開始進行裝飾xx功能———-”)
  def call_func(*args,**kwargs): #變
    print(‘這是xx權限驗證')
    return func(*args,**kwargs)
  return call_func
@add_qx
@add_xx
def test1():
  print(‘——test1——-')
test1()

首先執行第一個,但是第一個裝飾器下面不是函數(裝飾器原則:下面必須是函數,否則不執行),所以第一個函數先等待,等第二個裝飾器執行后形成函數在交給第一個裝飾器;所以運行結果是:

開始進行裝飾xx的功能,

開始進行裝飾權限1,

這是權限驗證1,

這是xx權限驗證,

——-test1——-,

——————裝飾器練習—————- 輸出格式:<td><h2>haha</h2></td>

def set_func_1(func):
  def call_func():
    return ‘<h2>' + func() + '</h2>'
  return call_func

&#8203;
def set_func_2(func):
  def call_func():
    return ‘<td>' + func() + '</td>'
  return call_func

@set_func_1()
@set_func_2()
def get_str():
  return ‘haha'

print(get_str())
最后執行的效果: <h2><td>haha</td></h2>

6. 用類對函數進行裝飾(了解):

class Test(object):
  def __init__(self,func):
    self.func = fun

  def __call__(self):
    print(‘這里是裝飾器的功能。。。。')
    return self.func()

@Test
def get_str():
  return ‘haha'

print(get_str())

看完了這篇文章,相信你對關于Python閉包裝飾器的簡介有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐陵市| 德惠市| 黄大仙区| 新丰县| 泸定县| 柳州市| 珠海市| 平邑县| 阿拉善盟| 正镶白旗| 安龙县| 盖州市| 徐闻县| 科尔| 甘孜县| 浦江县| 凯里市| 阿拉尔市| 古田县| 三台县| 吉林市| 赣州市| 德江县| 九龙城区| 论坛| 闻喜县| 财经| 南投县| 白朗县| 聂拉木县| 揭阳市| 勃利县| 芜湖县| 平凉市| 章丘市| 格尔木市| 祁东县| 信丰县| 垣曲县| 深圳市| 临洮县|