色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

《python核心編程》中高級閉包和裝飾器理解?

瀏覽:66日期:2022-07-30 14:10:23

問題描述

1.《python核心編程》的這段程序怎么理解?對于這個函數,書上說兩個wraaped是閉包,但是不知道誰是自由變量。

2.代碼:

from time import timedef logged(when): def log(f, *args, **kwargs):print ’’’Called: function: %s args: %r kwargs %r’’’ % (f, args, kwargs) def pre_logged(f):def wraper(*args, **kwargs):log(f, *args, **kwargs)return f(*args, **kwargs)return wraper def post_logged(f):def wrapped(*args, **kwargs): now = time() try:return f(*args, **kwargs) finally:log(f, *args, **kwargs)print 'time delta: %s' % (time()-now)return wrapped try:return {'pre': pre_logged, 'post': post_logged}[when] except KeyError, e:raise ValueError(e), ’must bre 'pre' or 'post'’@logged('post')def hello(name): print 'Hello, ', namehello(’World!’)

問題解答

回答1:

所謂閉包,就是指在函數中定義的函數。其實嚴格的說,你上面的函數logged下面的所有函數定義都是閉包

回答2:

關于閉包:當一個內嵌函數引用外部作用域的變量,我們就會得到一個閉包。創建一個閉包必須同時滿足以下幾點:1、必須要有一個內嵌函數。題目中外部函數是pre_logged,post_logged,對應的內嵌函數為wraper,wrapped。2、內嵌函數中必須要引用外部函數的變量。題目中是引用來外部的args, *kwargs參數。3、外部函數返回值必須是內嵌函數。題目中是用return wraper, return wrapped加以返回。

關于裝飾器:簡單的說裝飾器就是修改其他函數功能的函數。題中logged就是一個裝飾器,他用來裝飾你定義的hello函數。

@logged('post')def hello(name): print 'Hello, ', namehello(’World!’)

裝飾器參數你傳入了“post”,根據:return {'pre': pre_logged, 'post': post_logged}[when]調用了post_logged函數,post_logged的功能是打印花費的時間(time()-now)

關于裝飾器的詳細解釋,可以參見《Python進階》:裝飾器詳解

這整本書都翻譯的不錯,推薦樓主看看。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 黄色激情网站 | 国产成人麻豆精品 | 二区三区在线 | 美女很黄免费 | 成人国产免费 | 国产精品拍拍拍福利在线观看 | 九九热视频精品在线观看 | 久久精品国产免费看久久精品 | 欧美成人亚洲综合精品欧美激情 | 国产精品成人一区二区 | avav男人天堂 | 在线日韩三级 | 日韩国产精品99久久久久久 | 中文字幕精品视频 | 国产亚洲人成网站在线观看不卡 | 国产综合在线播放 | 日韩一级片免费 | 亚洲精品国产第一区二区三区 | 成人免费xxx色视频 成人免费大片a毛片 | 欧美视频一区二区在线观看 | 国产精品免费视频一区 | 免费看三级毛片 | 国产综合视频在线观看一区 | 99国产精品久久久久久久成人热 | 久久精品国产99精品最新 | 在线播放亚洲美女视频网站 | 亚洲精品在线播放 | 国产99视频在线观看 | 精品伊人久久久久7777人 | 美女张开大腿让男人捅 | 欧美日韩高清 | 欧美日韩一区二区综合在线视频 | 波多野结衣在线观看高清免费资源 | 美国一级片免费 | 亚洲午夜久久 | 狠狠综合久久 | 久久亚洲国产最新网站 | 午夜爽 | 久在线观看 | 天天拍拍夜夜出水 | a级毛片毛片免费观看永久 a级毛片毛片免费很很综合 |