闭包
函数对象
- 可以把函数当成变量去用,函数名的本质就是函数的内存地址
# 把函数当成参数传递给另一个函数
def func1(x):
print(x)
print(func1)
# 可以把函数当成另一个函数的返回值
def func2(x):
return x
print(func2)
# 可以当成容器类型的一个元素
dict = {'k1':func1}
print(dict.values())
运行结果:
<function func1 at 0x00000157DD5C60D0>
<function func2 at 0x00000157DD950C80>
dict_values([<function func1 at 0x00000157DD5C60D0>])
函数嵌套
- 在调用一个函数的过程中又调用其他函数
def max2(x,y):
if x > y:
return x
else:
return y
def max4(a, b, c, d):
res1 = max2(a, b)
res2 = max2(res1, c)
res3 = max2(res2, d)
print(res3)
max4(5, 2, 6, 8)
运行结果:
8
- 函数嵌套:在函数内定义其他函数
闭包函数
- 定义:
# 什么是闭包函数
# “闭”:指的是该函数是内嵌函数
# “包”:指的是该函数包含对外层函数(非全局)作用域名字的引用
# 这里f2即为闭包函数
def f1():
x = 3
def f2():
print(x)
f2()
x = 1
f1()
运行结果:
3
- 应用场景
# 在全局调用闭包函数
def f1():
x = 3
def f2():
print(x)
return f2
f = f1()
print(f)
f()
运行结果:
<function f1..f2 at 0x0000020262C10C80>
3
函数传参的方式:
- 直接把函数需要的参数定义成形参
- 把函数变成闭包函数,在包函数的命名空间为其传参
# 实现下载功能
# 通过传参实现
import requests
def get(url):
response = requests.get(url)
print(response)
get('https://www.baidu.com/')
# 实现下载功能
# 通过闭包实现
import requests
def outter(url):
url
def get():
response = requests.get(url)
print(response)
return get
get = outter('https://www.baidu.com/')
get()