1. 程式人生 > >Python 基礎第十一天(閉包和裝飾器初識)

Python 基礎第十一天(閉包和裝飾器初識)

過程 理解 繼續 記錄 turn 格式 -s pos 變量賦值

今日內容:

函數名的應用

閉包

裝飾器的初識

裝飾器的傳參

1.函數名的應用

函數名是函數的名字.

本質:變量,特殊的變量。是函數的內存地址

函數名() 可以執行此函數

(1)單獨打印函數名,可以得到函數的內存地址:

print(func1) # <function func1 at 0x0000000000872378>

(2)函數名可以賦值

例:

def func2():
print(666)
#
f = func2
print(f())

(3)函數名可以作為容器類數據的元素。

例:

def f1():
print(‘f1‘)


def f2():
print(‘f2‘)


def f3():
print(‘f3‘)

l = [f1,f2,f3]
d = {‘f1‘:f1,‘f2‘:f2,‘f3‘:f3}
#調用
l[0]()
d[‘f2‘]()

(4)函數可以作為參數

def f1():
print(666)
def f2(x): # x = f1
x() # f1()
f2(f1)


(5)函數名可以作為函數的返回值

def wraaper():
  def inner():
    print(666)
  return inner

ret = wraaper() # inner
ret() # inner()

#此代碼的流程分析

代碼由 上而下,def 設置了一個wraaper的變量名,由於沒有引用變量,一直向下,到達,ret = wraaper(),看到變量賦值,優先計算等號右邊的,即wraaper(),引用wraaper()函數,然後進入下一層, def inner(),記錄變量名稱,不走變量體,return返回inner,函數結束.return將inner返回給函數調用者,wraaper(),即ret = inner

然後運行代碼inner(),然後找到局部空間內的inner函數,繼續執行inner下面的內容.直到代碼結束.

2.閉包

就是內層函數對外層函數(非全局)變量的引用。

python遇到閉包,有一個機制,會開辟一個空間,將閉包中的所有的變量等存儲起來,不隨著函數的結束而關閉。
閉包的完美體現:裝飾器。

如何判斷:內層函數名.__closure__ cell 就是=閉包

例題

def wraaper1():
  name = ‘老男孩‘
  def inner():
    print(name)
  inner()
  print(inner.__closure__)

wraaper1()

# cell返回,則是閉包

name = ‘老男孩‘
def wraaper2():
  name1 = ‘alex‘
  inner()

   print(name)

   print(name1)
print(inner.__closure__) # None
wraaper2()
變量name為全局變量,不屬於外層函數的,所以不是閉包

裝飾器初識:

什麽是裝飾器:

裝飾器是在不改變現有函數的調用方式的情況下,對函數功能改變或者添加新的功能的新函數叫做裝飾器.

也可以描述為在不改變原函數的執行的情況下,為原函數增加額外的功能

裝飾器的固定格式:(被裝飾函數帶參數的裝飾器)

def wrapper(funcl):

  def inner(*args,**kwargs):

    ‘‘‘被裝飾函數運行之前‘‘

    retsalt = funcl(*args,**kwargs)

    ‘‘‘被裝飾函數運行之後‘‘‘

    return retsalt

  return inner

@wrapper #funcl = wrapper(funcl) 可以理解為這個等式這種形式 @wrapper 叫做語法糖

def funcl(a,b)

  pass

funcl()

例題:(不帶參數版本)

def timmer(f): # f = func1
  def inner():
    start_time = time.time()
    f() # func1()
    time.sleep(0.3)
    end_time = time.time()
    print(‘此函數的執行效率%s‘ % (end_time - start_time))
  return inner
# 語法糖@

@timmer # func1 = timmer(func1)
def func1():
  print(‘你有病呀,領導,測試我的執行效率幹甚。‘)

func1() # inner()

例題(被裝飾函數帶參數的版本)

def timmer(f): # f = func1 函數名
  def inner(*args,**kwargs):
    start_time = time.time()
    f(*args,**kwargs)
    time.sleep(0.3)
    end_time = time.time()
    print(‘此函數的執行效率%s‘ % (end_time - start_time))
  return inner

@timmer # func1 = timmer(func1) # inner
def func1(a,b):
  print(a,b)
  print(‘你有病呀,領導,測試我的執行效率幹甚。‘)

func1(a,b)

如果能把這個過程理解了就明白了,裝飾器的基本流程.

Python 基礎第十一天(閉包和裝飾器初識)