欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學堂Python培訓淺析Python閉包思想與用法

2019-09-25 11:05:53 5427瀏覽

關于Python的閉包思想與用法又多少小伙伴知道或者是了解呢?不了解的小伙伴也沒有關系,本篇文章扣丁學堂Python培訓小編給大家簡單介紹了Python閉包思想與用法,結合實例形式簡單分析了Python閉包的概念、原理、使用方法與相關操作注意事項,對Python閉包思想與用法感興趣的小伙伴可以參考下。




淺談python的閉包思想:


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


這樣,通過調用方法A 返回的是一個function對象,如demo=方法A可以直接使用demo(參數(shù)) 將調用方法B 這里不用關注方法B的方法名,只需要關注參數(shù)就可以了,demo(參數(shù)) 這里的參數(shù)其實就是閉包的方法B的參數(shù),可以多個參數(shù)或者元祖一起使用。



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


閉包函數(shù)必須有內(nèi)嵌函數(shù)

內(nèi)嵌函數(shù)需要引用該嵌套函數(shù)上一級namespace中的變量

閉包函數(shù)必須返回內(nèi)嵌函數(shù)


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



好吧,最后再舉個栗子:


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')


打印結果:

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


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


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


如:


# 偽代碼示意
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返回的結果并不是函數(shù),而是具有函數(shù)功能的類。有興趣的可以去看看Django的queryset的實現(xiàn),原理類似。


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


如:


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和人工智能方面內(nèi)容的小伙伴,請關注扣丁學堂Python培訓官網(wǎng)、微信等平臺,扣丁學堂IT職業(yè)在線學習教育平臺為您提供權威的Python開發(fā)環(huán)境搭建視頻,Python培訓后的前景無限,行業(yè)薪資和未來的發(fā)展會越來越好的,扣丁學堂老師精心推出的Python視頻教程定能讓你快速掌握Python從入門到精通開發(fā)實戰(zhàn)技能??鄱W堂Python技術交流群:279521237。



扣丁學堂微信公眾號                          Python全棧開發(fā)爬蟲人工智能機器學習數(shù)據(jù)分析免費公開課直播間


      【關注微信公眾號獲取更多學習資料】         【掃碼進入Python全棧開發(fā)免費公開課】



查看更多關于"Python開發(fā)資訊"的相關文章>


標簽: Python培訓 Python視頻教程 Python在線視頻 Python學習視頻 Python培訓班

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部