老齊python-基礎9(函數)

 

繼續上篇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)
相關文章
相關標籤/搜索