裝飾器
它允許你修改函數或類的行為,而不更改其源代碼。實質上,裝飾器是接受另一個函數作為參數并返回一個包裝原始函數的新函數。這樣,你可以在不修改原始函數的情況下,添加一些額外的功能或邏輯。
def time_cost(func):""":return:"""def wrapper(*args, **kwargs):""":param args::param kwargs::return:"""start = int(time.time() * 1000)func(*args, **kwargs)end = int(time.time() * 1000)print("call api time cost:%s ms" %(end - start))return wrapper
def ntimes(n):def inner(f):def wrapper(*args, **kwargs):for _ in range(n):rv = f(*args, **kwargs)return rvreturn wrapper
return inner#然后你可以使用上述函數包裝另一個函數,例如前文中的 add 函數:
@ntimes(3)
def add(x, y):print(x + y)
return x + y
Python中有許多內置的裝飾器
例如@staticmethod、@classmethod、@property、@functools.lru_cache、@functools.singledispatch等。你還可以為不同的目的創建自己的自定義裝飾器。
閉包函數?
閉包函數就是定義在函數內部的函數,也就是函數的嵌套定義,根據字面意思理解,閉包函數有兩個關鍵字閉和包分別是的封閉和包裹。需要注意的重點是:閉包函數的作用域關系在函數定義階段就固定死了,與調用位置無關。
1.什么是閉包函數:一個函數的返回值是另外一個函數,返回的函數調用父函數內部的變量,如果返回的函數在外部被執行,就產生了閉包
2.閉包函數的作用:使函數外部能夠調用函數內部放入屬性和方法
3.閉包函數的優缺點:
? ? 優點:使函數外部能夠調用函數內部放入屬性和方法
? ? 缺點:閉包操作導致整個函數的內部環境被長久保存,占用大量內存
__closure__屬性。Python給內部函數添加了這個屬性來攜帶內部函數用到的外部函數中的變量。
閉包作用
數據隱藏
DRY 原則
閉包
閉包函數使用場景
- 封裝:這種場景叫做封裝。?
- 內部函數可以方便的生成新的函數
- 裝飾器:對Python至關重要。這也是內部函數的主要使用場景。