python函式裝飾器,重點必須掌握(二)

扒點剛貨發表於2020-11-07

繼續說

4.未知型別,未知個數引數

(*args)可以表示整型,浮點型,字串,列表,元組等引數。例子①:

def func_1(*args):
    print(args)
    print(*args)
func_1(1,4.44444,'abc',[1,'扒點剛貨'],(2,'badianganghuo'))

執行結果:

(1, 4.44444, 'abc', [1, '扒點剛貨'], (2, 'badianganghuo'))
1 4.44444 abc [1, '扒點剛貨'] (2, 'badianganghuo')

(**args)表示字典型別引數。呼叫函式傳遞引數的時候,表示方法為(鍵 = 值)。例子②:

def func_2(a,b,**kwargs):
    print(a)
    print(b)
    print(kwargs)
​
func_2(a = '扒點剛貨',b ='badianganghuo',c = '扒點剛貨',d ='badianganghuo')

執行結果:

扒點剛貨
badianganghuo
{'c': '扒點剛貨', 'd': 'badianganghuo'}

綜上:當引數都是未知的時候,一般寫成(*args, **kwargs)。

綜合例子:

def func_3(*args, **kwargs):
    print(args)
    print(kwargs)
​
func_3(1,4.44444,'abc',[1,'扒點剛貨'],(2,'badianganghuo'),a='扒點剛貨', b='badianganghuo')

執行結果:

(1, 4.44444, 'abc', [1, '扒點剛貨'], (2, 'badianganghuo'))
{'a': '扒點剛貨', 'b': 'badianganghuo'}

三、內嵌函式

在函式體內建立另外一個函式(物件)是合法的,這種函式叫內部/內嵌函式。

1.普通內嵌

例子:

def foo():
  def bar():
    print('bar() called')
  print('foo() called')
  bar()
​
foo()

執行結果:

foo() called
bar() called

2.閉包

如果內部函式引用了函式外定義的物件,此時把這個特別的內部函式叫做閉包。例子:

num_1 = 1
def func_1():
    num_2 = 2
    def func_2():
        num_3 = num_1 + num_2
        print('{}加上{}等於{}'.format(num_1,num_2,num_3))
    return func_2
​
fun = func_1()
fun()

執行結果:

1加上2等於3

注意:fun = func_1()是呼叫外部函式,並且複製給fun,因為func_1返回值為func_2(類似於一個變數名),隨意fun等同於func_2,func_2()就是呼叫內部函式。

四、函式裝飾器

裝飾器是在函式呼叫之上的裝飾。當不想改變已經定義好的函式名稱,且要對該函式進行加工的時候,可以使用函式裝飾器。

比如當一個函式func1在很多地方被呼叫,現在要呼叫它,可是又得需要對它進行一些改變,就可以使用函式裝飾器。

1.函式裝飾器語法

@decorator(dec_opt_args)
def fun2Bdecorated(func_opt_args):
  ...

裝飾器的語法是用@開頭,接著是裝飾器的函式的名字和可選的引數,緊跟著裝飾器宣告的是被修飾的函式和裝飾器函式的可選引數。

例子:

def decor(func):
    print('start')
    func()
    print('有10000粉絲')
    print('是個成熟的公眾號')
    print('end')
    #return wrapper
​
@decor
def func_2():
    #已知函式,不建議更改
    print('我是扒點剛貨')

執行結果:

start
我是扒點剛貨
有10000粉絲
是個成熟的公眾號
end

時間有限,明天詳細展開多個函式裝飾器共同使用,裝飾器規範寫法,以及多個裝飾器的引數傳遞,多層返回值等。

在這裡插入圖片描述

相關文章