python 關於 函式物件與閉包

ckxllf發表於2020-05-07

  一、函式物件

  在 Python 中萬物皆為物件,函式也不例外,函式作為物件可以賦值給一個變數、可以作為元素新增到集合物件中、可作為引數值傳遞給其它函式,還可以當做函式的返回值,這些特性就是第一類物件所特有的。

  1、函式可以被引用

  >>> def add(x,y):

  ... return x+y

  ...

  >>> func=add

  >>> func(1,2)

  3

  2、函式可以作為容器型別的元素

  >>> dic={'add':add,'max':max}

  >>> dic

  {'add': , 'max': }

  >>> dic['add'](1,2)

  3

  3、函式可以作為引數傳入另外一個函式

  >>> def foo(x,y,func):

  ... return func(x,y)

  ...

  >>> foo(1,2,add)

  3

  4、函式的返回值可以是一個函式

  def bar():

  return add

  func=bar()

  func(1,2)

  3

  5、應用案例

  (1)最簡單的寫法

  def login():

  '''登入'''

  print('登入成功')

  def registry():

  '''註冊'''

  print('註冊成功')

  def check_balance():

  '''查詢餘額'''

  print('餘額查詢成功')

  def withdraw():

  '''提現'''

  print('提現成功')

  print('''

  1 登入

  2 註冊

  3 查詢餘額

  4 提現

  ''')

  choice = input('請輸入您要執行的操作編號:').strip()

  if choice == '1':

  login()

  elif choice == '2':

  registry()

  elif choice == '3':

  check_balance()

  else:

  withdraw()

  缺點:如果函式很多,那麼冗餘太大,後期增加功能也不方便

  (2)最佳化後的程式碼

  def login():

  '''登入'''

  print('登入成功')

  def registry():

  '''註冊'''

  print('註冊成功')

  def check_balance():

  '''查詢餘額'''

  print('餘額查詢成功')

  def withdraw():

  '''提現'''

  print('提現成功')

  func = {

  '0':('退出',None),

  '1':('登入',login),

  '2':('註冊',registry),

  '3':('查詢餘額',check_balance),

  '4':('提現',withdraw)

  }

  while True:

  for i in func:

  print(i,func[i][0])

  choice = input('請輸入您要執行的操作編號:').strip()

  if choice == '0':

  break

  elif choice not in func:

  print('尊敬的使用者,您好!你需要執行的操作不存在,請重新選擇操作編號!')

  continue 鄭州專業人流醫院

  else:

  func[choice][1]()

  二、函式巢狀

  再一個函式的函式體中又定義一個新函式。稱之為函式巢狀

  1、應用案例一

  對圓的所有操作函式我們都放進circle函式中去,透過指定action引數的值,從而來確定呼叫那個函式,執行那個操作(類似檔案處理中的指定r,w,a模式)。

  2、閉包函式

  (1)閉與包

  函式被當做資料處理時,始終以本地的作用域為準。若內嵌函式包含對外部函式作用域(而非全域性作用域)中變數的引用,那麼該’內嵌函式’就是閉包函式,簡稱閉包(Closures)

  x=1

  def outer():

  x=2

  def inner():

  print(x) #此處的x就是外部函式的變數x,因此inner為閉包函式

  return inner

  func=outer()

  func() # 結果為2

  可以透過函式的closure屬性,檢視到閉包函式所包裹的外部變數

  >>> func.__closure__

  (,)

  >>> func.__closure__[0].cell_contents

  2

  “閉”代表函式是內部的,“包”代表函式外’包裹’著對外層作用域的引用。因而無論在何處呼叫閉包函式,使用的仍然是包裹在其外層的變數。

  3、閉包函式的用途

  目前為止,我們得到了兩種為函式體傳值的方式,一種是直接將值以引數的形式傳入,另外一種就是將值間接傳給閉包函式

  import requests

  #方式一:

  def get(url):

  return requests.get(url).text

  #方式二:

  def page(url):

  def get():

  return requests.get(url).text #url是外部函式的變數,因此get是閉包函式

  return get

  提示:requests模組是用來模擬瀏覽器向網站傳送請求並將頁面內容下載到本地,需要事先安裝:pip3 install requests

  對比兩種方式,方式一在下載同一頁面時需要重複傳入url,而方式二隻需要傳一次值,就會得到一個包含指定url的閉包函式,以後呼叫該閉包函式無需再傳url

  ……

  閉包函式的這種特性有時又稱為惰性計算。使用將值包給函式的方式,在接下來的裝飾器中也將大有用處。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2690410/,如需轉載,請註明出處,否則將追究法律責任。

相關文章