国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-01-04 17:06:51
字體:
來源:轉載
供稿:網友

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

LEGB L>E>G?B

  • L:local函數內部作用域
  • E:enclosing函數內部與內嵌函數之間
  • G:global全局作用域
  • B:build-in內置作用域

python 閉包

1.Closure:內部函數中對enclosing作用域變量的引用

2.函數實質與屬性

  • 函數是一個對象
  • 函數執行完成后內部變量回收
  • 函數屬性
  • 函數返回值
passline = 60def func(val):  if val >= passline:    print ('pass')  else:    print ('failed')  def in_func():    print (val)  in_func()  return in_funcf = 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 cmpf_100 = set_passline(60)f_150 = set_passline(90)f_100(89)f_150(89)

Closure:內部函數中對enclosing作用域變量的引用,它會將enclosing作用域變量傳遞到內部函數的closure中

閉包的作用:

  • 封裝
  • 代碼復用

python閉包二

求和

def my_sum(*arg):  if len(arg) == 0:    return 0  for val in arg:    if not isinstance(val,int): # 有一個非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): # 有一個非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函數中的__closure__中,所以可以調用  return in_decmy_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函數,會先執行參數類型判斷,然后執行__closure__中的函數my_sum

python 裝飾器

  1. 裝飾器用來裝飾函數
  2. 返回一個函數對象
  3. 被裝飾函數標識符指向返回的函數對象
  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函數中的__closure__中,所以可以調用  return in_dec  # 如果沒有返回值,則my_sum調用裝飾器后為None# my_sum = dec(my_sum)  # 不手動傳參@dec     # 裝飾器將my_sum作為參數傳入dec,并返回一個新的函數賦值給my_sumdef 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'))

另一個例子

def deco(func):  def in_deco(x,y):    print ('in deco')    func(x,y)  print ('call deco')  return in_deco@decodef bar(x, y):  print ('in bar',x+y)bar(1,2)

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 旌德县| 德安县| 东山县| 荃湾区| 淮南市| 西平县| 广汉市| 鲁甸县| 洞口县| 商城县| 万载县| 工布江达县| 安乡县| 遂宁市| 巴塘县| 温宿县| 宣恩县| 金塔县| 轮台县| 嘉义市| 平武县| 灵川县| 罗江县| 闵行区| 合作市| 平安县| 双鸭山市| 罗田县| 嘉兴市| 朝阳县| 中卫市| 浦东新区| 石河子市| 堆龙德庆县| 徐汇区| 常德市| 寿宁县| 宁安市| 林口县| 班玛县| 尉氏县|