函数对象与闭包
函数对象指的是函数可以被当做""数据""来处理
1.函数可以被引用
>>> def add(x, y):
... return x+y
...
>>> func = add
>>> func(1, 2)
3
2.函数可以当做参数传递
>>> def foo(x,y,func):
... return func(x,y)
...
>>> foo(1,2,add)
3
3.函数可以当做返回值使用
(传参的时候一定不能加括号,加括号当场就执行了)
def index():
print("from index")
def func(a):
return a
a = func(index)
a()
4.函数可以被当做容器类型的元素
def func():
print('from func')
l1 = [1, '2', func, func()]
f = l1[2]
print(f)
from func
<function func at 0x000001F6BD7F3E18>
函数的嵌套
函数的嵌套调用:在函数内调用函数
定义:
让内层函数封闭起来,不让外部直接调用
作用:
将复杂并且小的功能,在函数内部调用,解决代码结构清晰问题
def index():
def home():
print("from home")
home()
index()
from home
例子:
def func1(x, y):
if x > y:
return x
else:
return y
print(func1(1,2))
def func2(x, y, z, a):
result = func1(x, y)
result = func1(result, z)
result = func1(result, a)
return result
print(func2(1, 200000, 3, 1000
2
200000
闭包函数
闭:代表函数内部
包:代表函数外“包裹”着对外层作用域的引用
是函数嵌套、函数对象、名称空间与作用域的结合体
1.闭包函数必须在函数内部定义
2.闭包函数可以引用外层函数的名字
闭包函数是为了装饰器做准备
x = 1
def f1():
def f2():
print(x)
return f2
def f3():
x = 3
f2 = f1() #调用f1()返回函数f2
f2() #需要按照函数定义时的作用关系去执行,与调用位置无关
f3()
1
有两种为函数体传值的方式,一种是直接将值以参数的形式传入,另外一种就是将值包给函数
import requests
def get(url): #第一种方式
return requests.get(url).text
print(len(get('https://www.baidu.com')))
print(len(get('https://www.python.org')))
2443
49559
方式一在下载同一页面时需要重复传入url
import requests
def page(url): #第二种方式
def get():
return requests.get(url).text
return get
python = page('https://www.python.org')
python()
方式二只需要传入一次值,就会得到一个包含指定url的闭包函数,以后调用该闭包函数无需再传url