繼續上篇python
函數閉包
多參數:函數
>>> def foo(x,y,z,*args,**kargs): ... print(x) ... print(y) ... print(z) ... print(args) ... print(kargs) ... >>> foo('qiwsir',2,"python") #多參數各類類型調用適用各類場景 qiwsir 2 python () {} >>> foo(1,2,3,4,5) 1 2 3 (4, 5) {} >>> foo(1,2,3,4,5,name="qiwsir") 1 2 3 (4, 5) {'name': 'qiwsir'}
二、函數對象spa
遞歸code
傳遞函數對象
>>> def bar(): ... print("I am in bar()") ... >>> def foo(func): #使用func傳遞函數 ... func() ... >>> foo(bar) I am in bar()
def power_seq(func,seq): return [func(i) for i in seq] def pingfang(x): return str(x) #return x ** 2求平方 if __name__ == "__main__": num_seq = [111,3.14,2.91] r = power_seq(pingfang, num_seq) print(num_seq) print(r)
嵌套函數blog
def foo(): def bar(): print("bar() is running") bar() print("foo() is running") print(foo())
>>> def foo(): ... a = 1 ... def bar(): ... b = a + 1 ... print("b=",b) ... bar() ... print("a=",a) ... >>> foo() b= 2 a= 1 >>> def foo(): #另一種定義方法就會出錯Python解析器認定該變量應在bar()內部創建,而不是引用外部對象,因此報錯 ... a = 1 ... def bar(): ... a = a + 1 ... print("bar()a=",a) ... bar() ... print("foo()a=",a) ... >>> foo() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 6, in foo File "<stdin>", line 4, in bar UnboundLocalError: local variable 'a' referenced before assignment
使用nonlocal解決!遞歸
>>> def foo(): ... a = 1 ... def bar(): ... nonlocal a ... a = a + 1 ... print("bar()a=",a) ... bar() ... print("foo()a=",a) ... >>> foo() bar()a= 2 foo()a= 2
閉包utf-8
#!/usr/bin/env python3 # encoding: utf-8 """ @version: ?? @author: tajzhang @license: Apache Licence @file: zhongli.py @time: 2018/2/28 15:50 """ def weight(g): def cal_mg(m): return m * g return cal_mg w = weight(10) #函數對象多層引用,動態函數對象,閉包 mg = w(10) print(mg) g0 = 9.78046 w0 = weight(g0) mg0 = w0(10) print(mg0)