若是在一個內部函數裏,對在外部做用域(但不是在全局做用域)的變量進行引用,那麼內部函數就被認爲是閉包(closure)python
def getSum(*args): def add(): result = 0 for i in args: result = result + i return result return add myFun = getSum(1, 2, 3) print(myFun()) # 6
裝飾器是對函數的一種包裝,它使函數的功能獲得擴展,但又不用修改函數內部的代碼;通常用於增長函數執行先後的行爲。
下面的例子演示了在一個函數執行前打印當前時間,執行後打印執行完成的提示:閉包
import time def myDecorator(func): def myWrapper(*args, **kw): print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))) f = func(*args, **kw) print(func.__name__, "function is called.") return f return myWrapper @myDecorator def hello(): print("hello world") hello() # 2019-04-09 11:38:29 # hello world # hello function is called.
下面的例子演示了在一個函數返回字符串後,在該字符串先後加上HTML標籤:app
def setTag(tag): def myDecorator(func): def myWrapper(*args, **kw): beginTag = "<" + tag + ">" endTag = "</" + tag + ">" return beginTag + func(*args, **kw) + endTag return myWrapper return myDecorator @setTag("div") def hello(name): return "hello, " + name print(hello("wayne")) # <div>hello, wayne</div>
偏函數是經過將一個函數的部分參數預先綁定爲特定值,從而獲得一個新的具備較少可變參數的函數。
下面的例子用偏函數實現了一個轉換二進制的函數int2函數
import functools int2 = functools.partial(int, base=2) print("%d %d" % (int("1010101"), int2("1010101"))) # 1010101 85
partial接收三個參數,形式爲:partial(func, *args, **keywords)
,上面演示了只提供**keywords
的狀況,下面的例子演示了只提供*args
的狀況:命令行
import functools max2 = functools.partial(max, 10) print(max2(5, 6, 7)) # 等效於max(10, 5, 6, 7) # 10
編寫模塊的通常格式以下:
test1.pycode
#!/usr/bin/env python3 # -*- coding: utf-8 -*- 'my test1 module' __author__ = "Wayne" import sys def init(): print(sys.argv) if __name__ == '__main__': init()
當經過命令行的方式運行該模塊文件時,Python解釋器把一個特殊變量__name__
置爲__main__。
sys.argv返回的是一個list,執行python3 test1.py
,那麼sys.argv獲得的list是['test1.py']
;執行python3 test1.py A B
,那麼sys.argv獲得的list是['test1.py', 'A', 'B']
。utf-8