欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解 Python中LEGB和閉包及裝飾器

 更新時(shí)間:2017年08月03日 10:16:52   投稿:lqh  
這篇文章主要介紹了詳解 Python中LEGB和閉包及裝飾器的相關(guān)資料,主要介紹了函數(shù)作用域和閉包的理解和使用方法及Python中的裝飾器,需要的朋友可以參考下

詳解 Python中LEGB和閉包及裝飾器

LEGB L>E>G?B

  • L:local函數(shù)內(nèi)部作用域
  • E:enclosing函數(shù)內(nèi)部與內(nèi)嵌函數(shù)之間
  • G:global全局作用域
  • B:build-in內(nèi)置作用域

python 閉包

1.Closure:內(nèi)部函數(shù)中對enclosing作用域變量的引用

2.函數(shù)實(shí)質(zhì)與屬性

  • 函數(shù)是一個(gè)對象
  • 函數(shù)執(zhí)行完成后內(nèi)部變量回收
  • 函數(shù)屬性
  • 函數(shù)返回值
passline = 60
def func(val):
  if val >= passline:
    print ('pass')
  else:
    print ('failed')
  def in_func():
    print (val)
  in_func()
  return in_func

f = func(89)
f()
print (f.__closure__)

一般情況

def f_100(val):
  passline = 60
  if val >= passline:
    print ('pass')
  else:
    print ('failed')

def f_150(val):
  passline = 90
  if val >= passline:
    print ('pass')
  else:
    print ('failed')

f_100(89)
f_150(89)

閉包

def set_passline(passline):
  def cmp(val):
    if val >= passline:
      print ('Pass')
    else:
      print ('failed')
  return cmp

f_100 = set_passline(60)
f_150 = set_passline(90)
f_100(89)
f_150(89)

Closure:內(nèi)部函數(shù)中對enclosing作用域變量的引用,它會(huì)將enclosing作用域變量傳遞到內(nèi)部函數(shù)的closure中

閉包的作用:

  • 封裝
  • 代碼復(fù)用

python閉包二

求和

def my_sum(*arg):
  if len(arg) == 0:
    return 0
  for val in arg:
    if not isinstance(val,int): # 有一個(gè)非int則返回0
      return 0
  return sum(arg)

def my_average(*arg):
  if len(arg) == 0:
    return 0
  for val in arg:
    if not isinstance(val,int): # 有一個(gè)非int則返回0
      return 0
  return sum(arg)/len(arg)

print (my_sum(1,2,3,4,5))
print (my_sum(1,2,3,4,5,'6'))
print (my_aveage(1,2,3,4,5))
print(my_average())

閉包的使用

def my_sum(*arg):
  return sum(arg)
def my_average(*arg):
  return sum(arg)/len(arg)

def dec(func):
  def in_dec(*arg): # my_sum
    print ('in dec arg= ',arg)
    if len(arg) ==0:
      return 0
    for val in arg:
      if not isinstance(val, int):
        return 0
    return func(*arg)  # 閉包,存在于in_dec函數(shù)中的__closure__中,所以可以調(diào)用
  return in_dec

my_sum = dec(my_sum)  # 傳參

print(my_sum (1,2,3,4,5))
print(my_sum (1,2,3,4,5,'6'))
# my_sum就是in_dec函數(shù),會(huì)先執(zhí)行參數(shù)類型判斷,然后執(zhí)行__closure__中的函數(shù)my_sum

python 裝飾器

  1. 裝飾器用來裝飾函數(shù)
  2. 返回一個(gè)函數(shù)對象
  3. 被裝飾函數(shù)標(biāo)識符指向返回的函數(shù)對象
  4. 語法糖 @deco

使用裝飾器的方式

def dec(func):
  def in_dec(*arg): # my_sum
    print ('in dec arg= ',arg)
    if len(arg) ==0:
      return 0
    for val in arg:
      if not isinstance(val, int):
        return 0
    return func(*arg)  # 閉包,存在于in_dec函數(shù)中的__closure__中,所以可以調(diào)用
  return in_dec  # 如果沒有返回值,則my_sum調(diào)用裝飾器后為None

# my_sum = dec(my_sum)  # 不手動(dòng)傳參
@dec     # 裝飾器將my_sum作為參數(shù)傳入dec,并返回一個(gè)新的函數(shù)賦值給my_sum
def my_sum(*arg):
  return sum(arg)
def my_average(*arg):
  return sum(arg)/len(arg)

print(my_sum (1,2,3,4,5))
print(my_sum (1,2,3,4,5,'6'))

另一個(gè)例子

def deco(func):
  def in_deco(x,y):
    print ('in deco')
    func(x,y)
  print ('call deco')
  return in_deco

@deco
def bar(x, y):
  print ('in bar',x+y)

bar(1,2)

以上就是Python中LEGB和閉包及裝飾器的介紹,如有疑問請留言或者到本站社區(qū)交流討論,本站關(guān)于Python 的文章還有很多,還希望大家搜索查閱,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • python與pycharm有何區(qū)別

    python與pycharm有何區(qū)別

    在本篇文章里小編給大家整理了關(guān)于pycharm與python的區(qū)別相關(guān)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • 詳解Python計(jì)算機(jī)視覺 圖像扭曲(仿射扭曲)

    詳解Python計(jì)算機(jī)視覺 圖像扭曲(仿射扭曲)

    這篇文章主要介紹了Python計(jì)算機(jī)視覺 圖像扭曲(仿射扭曲),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • python 實(shí)現(xiàn)mysql增刪查改示例代碼

    python 實(shí)現(xiàn)mysql增刪查改示例代碼

    python中可以通過pymysql實(shí)現(xiàn)MySQL數(shù)據(jù)庫的連接,并實(shí)現(xiàn)數(shù)據(jù)庫的各種操作,這篇文章主要給大家介紹了關(guān)于pymsql實(shí)現(xiàn)增刪改查的示例代碼,需要的朋友可以參考下
    2021-11-11
  • Pycharm中配置Jupyter環(huán)境的圖文教程

    Pycharm中配置Jupyter環(huán)境的圖文教程

    本文主要介紹了Pycharm中配置Jupyter環(huán)境的圖文教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • python實(shí)現(xiàn)將一維列表轉(zhuǎn)換為多維列表(numpy+reshape)

    python實(shí)現(xiàn)將一維列表轉(zhuǎn)換為多維列表(numpy+reshape)

    今天小編就為大家分享一篇python實(shí)現(xiàn)將一維列表轉(zhuǎn)換為多維列表(numpy+reshape),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python使用協(xié)程實(shí)現(xiàn)并發(fā)操作的方法詳解

    python使用協(xié)程實(shí)現(xiàn)并發(fā)操作的方法詳解

    這篇文章主要介紹了python使用協(xié)程實(shí)現(xiàn)并發(fā)操作的方法,結(jié)合實(shí)例形式詳細(xì)分析了Python協(xié)程的原理及使用Gevent實(shí)現(xiàn)協(xié)程操作的相關(guān)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • 關(guān)于Python中的空值問題及解決

    關(guān)于Python中的空值問題及解決

    這篇文章主要介紹了關(guān)于Python中的空值問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 在Sublime Editor中配置Python環(huán)境的詳細(xì)教程

    在Sublime Editor中配置Python環(huán)境的詳細(xì)教程

    這篇文章主要介紹在sublime編輯器中安裝python軟件包,以 實(shí)現(xiàn)自動(dòng)完成等功能,并在sublime編輯器本身中運(yùn)行build,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2020-05-05
  • Python 使用 PyMysql、DBUtils 創(chuàng)建連接池提升性能

    Python 使用 PyMysql、DBUtils 創(chuàng)建連接池提升性能

    DBUtils 是一套 Python 數(shù)據(jù)庫連接池包,并允許對非線程安全的數(shù)據(jù)庫接口進(jìn)行線程安全包裝。這篇文章主要介紹了Python 使用 PyMysql、DBUtils 創(chuàng)建連接池,提升性能,需要的朋友可以參考下
    2019-08-08
  • Django實(shí)現(xiàn)跨域的2種方法

    Django實(shí)現(xiàn)跨域的2種方法

    這篇文章主要介紹了Django實(shí)現(xiàn)跨域的2中方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07

最新評論