一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python閉包思想與用法淺析

Python閉包思想與用法淺析

2021-05-08 00:39今天老子來巡山 Python

這篇文章主要介紹了Python閉包思想與用法,結(jié)合實例形式簡單分析了Python閉包的概念、原理、使用方法與相關(guān)操作注意事項,需要的朋友可以參考下

本文實例講述了Python閉包思想與用法。分享給大家供大家參考,具體如下:

淺談 python 的閉包思想

首先 python的閉包使用方法是:在方法A內(nèi)添加方法B,然后return 方法B 注意,return的時候不要添加任何參數(shù),包括()

這樣,通過調(diào)用方法A 返回的是一個function 對象,如 demo=方法A 可以直接使用 demo(參數(shù)) 將調(diào)用方法B 這里不用關(guān)注方法B的方法名,

只需要關(guān)注參數(shù)就可以了,demo(參數(shù)) 這里的參數(shù)其實就是閉包的方法B的參數(shù),可以多個參數(shù)或者元祖一起使用。

其次 在Python中創(chuàng)建一個閉包可以歸結(jié)為以下三點:

  • 閉包函數(shù)必須有內(nèi)嵌函數(shù)
  • 內(nèi)嵌函數(shù)需要引用該嵌套函數(shù)上一級namespace中的變量
  • 閉包函數(shù)必須返回內(nèi)嵌函數(shù)

對,沒錯,python的裝飾器就是使用了閉包。

好吧,最后再舉個栗子:

?
1
2
3
4
5
6
7
8
def test1(prefix):
  def test2(name):
    print('test2閉包內(nèi):',name)
  def test3(*name1):
    print('test3 閉包內(nèi):',name1)
  return test3
m = test1('prefix')
m("haha",'heihei')

打印結(jié)果:

D:\python\python.exe D:/Python_day/day1.py
test3 閉包內(nèi): ('haha', 'heihei')

這個例子說明,當函數(shù) test1 的生命周期結(jié)束之后,test1('prefix') 中的參數(shù) prefix 這個變量依然存在,生命周期不會隨著函數(shù)調(diào)用結(jié)束而消失。

為啥要用閉包呢? 感覺這個功能一般啊,畢竟回調(diào)函數(shù)是死的,只能回調(diào)一個,但是有個函數(shù)就是能生成無數(shù)個對象,嗯,是的,這玩意和類的功能有點相似。閉包可以被理解為一個只讀的對象,你可以給他傳遞一個屬性,但它只能提供給你一個執(zhí)行的接口,這就牽扯到的另一個特性:惰性求值

如:

?
1
2
3
4
5
6
7
8
9
10
11
12
# 偽代碼示意
class QuerySet(object):
  def __init__(self, sql):
    self.sql = sql
    self.db = Mysql.connect().corsor() # 偽代碼
  def __call__(self):
    return db.execute(self.sql)
  def query(sql):
    return QuerySet(sql)
result = query("select name from user_app")
if time > now:
  print result # 這時才執(zhí)行數(shù)據(jù)庫訪問

上面這個不太恰當?shù)睦诱故玖送ㄟ^閉包完成惰性求值的功能,但是上面query返回的結(jié)果并不是函數(shù),而是具有函數(shù)功能的類。有興趣的可以去看看Django的queryset的實現(xiàn),原理類似。

還有另一種用處:需要對某個函數(shù)的參數(shù)提前賦值的情況,當然在Python中已經(jīng)有了很好的解決訪問 functools.parial,但是用閉包也能實現(xiàn)。

如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def partial(**outer_kwargs):
  def wrapper(func):
    def inner(*args, **kwargs):
      for k, v in outer_kwargs.items():
        kwargs[k] = v
      return func(*args, **kwargs)
    return inner
  return wrapper
@partial(age=15)
def say(name=None, age=None):
  print name, age
say(name="the5fire")
# 當然用functools比這個簡單多了
# 只需要: functools.partial(say, age=15)(name='the5fire')

對于工廠函數(shù)的理解,感覺和閉包類似,在創(chuàng)建主函數(shù)后返回的對象,可以直接傳參使用,其實這里返回的對象,就是一個類。

希望本文所述對大家Python程序設(shè)計有所幫助。

原文鏈接:https://blog.csdn.net/guoxinjie17/article/details/77838851

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青草福利视频 | 3d动漫美女物被遭强视频 | 四大美女思春艳史片 | 菠萝视频污 | 日本黄色录像视频 | 亚洲一二区视频 | 亚洲国产成人综合 | 99久久伊人一区二区yy5099 | luan小说 | 男人的天堂视频 | 国产免费成人在线视频 | 国产日韩欧美一区 | 国产综合久久久久 | 国产日产欧产精品精品软件 | 99色在线视频 | ysl千人千色t9t9t9 | 久久偷拍免费2017 | 鞋奴的视频VK | 国产福利自产拍在线观看 | 精品国产91久久久久 | 欧美猛男同志video在线 | 九九精品视频在线免费观看 | 久久九九亚洲精品 | 成人福利在线 | 日本公与妇中文在线 | 国产深夜视频 | 免费看日韩 | 国产精品网页 | a级片在线观看免费 | 国产成人一区二区三区视频免费蜜 | 成人小视频在线免费观看 | 国产欧美久久久精品影院 | 色综合久久98天天综合 | 亚洲mm色国产网站 | 国产91精品在线播放 | 亚洲第五色综合网啪啪 | 国产尤物精品视频 | 别停好爽好深好大好舒服视频 | 成人在线观看一区 | 日本加勒比在线精品视频 | 国产一级持黄大片99久久 |