python函數語言程式設計二
一、函式的巢狀
1、函式巢狀的程式碼示例
def f1():
print('我是函式1')
def f2():
print('我是函式2')
f2()
if __name__ == "__main__":
f1()
堅持一個原則:在作用域小地方可以訪問比它作用域大里面的變數,在作用域大地方不能訪問比它更小作用域裡面的變數
1、如果在函式外面要使用函式內部的函式的方式
1.使用global修飾變數
2.函式將變數返回
1、一個函式作為引數傳遞給另外一個函式
2、一個函式的返回值是一個函式
1、一個函式作為引數傳遞給另外一個函式
def foo(func):
print('foo函式')
func()
def bar():
print('bar函式')
if __name__ == "__main__":
print(type(bar))
2、一個函式中返回另外一個函式
def foo():
print('foo函式')
def bar():
print('bar函式')
return bar
if __name__ == "__main__":
foo()()
3、柯理化函式(典型的高階函式)
def foo(x):
def bar(y):
return x + y
return bar
if __name__ == "__main__":
print(foo(1)(2))
1、閉包的概念總結:閉包=函式+環境變數
2、形成閉包的幾個條件
1.函式(外函式)中定義了內函式
2.內函式使用了外函式的非全域性變數
3.外函式最終返回是內函式的引用
1、最基本的閉包程式碼
def f1(): # 外部函式中定義內函式
a = 10
def f2():
return a # 內函式中引用外函式非全域性變數(只要使用了就可以)
return f2 # 返回內函式的引用
if __name__ == "__main__":
f = f1()
# 如果是閉包就會輸出內容
print(f.__closure__)
2、外部函式中的變數是傳遞進去的
def f1(a):
def f2():
c = a ** 2
return a
return f2
if __name__ == "__main__":
f = f1(5)
# 如果是閉包就會輸出內容
print(f.__closure__)
1、直接修改全域性變數來實現
origin = 0
def go(step):
global origin
# 當前行走的位置
new_pos = origin + step
# 直接修改全域性變數
origin = new_pos
return new_pos
if __name__ == "__main__":
print(go(2))
print(go(3))
print(go(6))
2、使用閉包會記住上一次呼叫的狀態
origin = 0
def factory(pos):
def go(step):
# 強制申明不是使用本地變數
nonlocal pos
new_pos = pos + step
pos = new_pos
return new_pos
return go
if __name__ == "__main__":
factory1 = factory(origin)
print(factory1(2))
print(factory1(3))