国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python閉包裝飾器使用方法匯總

Python閉包裝飾器使用方法匯總

2020-06-30 10:10xbhog Python

這篇文章主要介紹了Python閉包裝飾器使用方法匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

閉包內容:

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

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

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

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

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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結果。

裝飾器內容:

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
# 裝飾器的作用:為了對原來的代碼上進行擴展
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()

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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. 沒有參數,沒有返回值的函數進行裝飾:

?
1
2
3
4
5
6
7
8
9
10
def set_func(func):
  def call_func():
    print(‘———test2——-')
    print(‘———-test3——')
    func()
  return call_func
 
@set_func
def test1():
  print(‘——test1——-  ')

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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. 不定長參數的函數裝飾:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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.對應的返回值參數進行裝飾、通用裝飾器:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#通用裝飾器
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. 多個裝飾器對同一個函數進行裝飾:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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><h1>haha</h1></td>

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def set_func_1(func):
  def call_func():
    return ‘<h1>' + func() + '</h1>'
  return call_func
 
?
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())
最后執行的效果: <h1><td>haha</td></h1>

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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())

以上就是裝飾器與閉包的全部內容

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/xbhog/p/13194954.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美精品一区二区三区四区 | 黄色免费在线视频 | 欧美亚洲三级 | 激情网页 | av黄色在线播放 | h在线观看视频 | 欧美一区二区三区视频 | 美女一区| 日一区二区 | 久久这里有精品视频 | 日韩欧美在线观看视频 | 在线国产一区 | 91国内免费视频 | 日韩国产精品一区二区 | 中文字幕第一页在线 | 久久久久a| 亚洲视频在线观看 | 国产精品美女久久久久久久久久久 | 国产中文在线 | www.91看片| 二区视频| 91中文字幕在线观看 | 一级色视频 | 亚洲天堂免费在线 | 日韩在线精品 | 久久精品国产一区二区电影 | 国产高清免费视频 | 九九福利 | 欧美成人综合在线 | 中文字幕 亚洲一区 | 一本大道av伊人久久综合 | 亚洲精品视频在线观看免费视频 | 国产亚洲精品一区二区 | 亚洲国产一级 | 99在线观看 | 午夜影院在线播放 | 亚洲精品网址 | 天天色成人综合网 | 在线观看免费视频黄 | 国产亚洲欧美一区 | 视频在线一区二区 |