一、函数的嵌套
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))