文章目录
一、函数对象
函数的名字就是函数对象,它在python中是第一类对象,函数名指向的是函数的内存地址。
1.1 函数对象的作用
1、函数名可以被引用
def bar():
print('from bar')
f=bar
f()
2、函数名可以当作参数传入
def bar():
print('from bar)
def wrapper(func): #func=bar
func()
wrapper(bar)
3、可以当函数的返回值
def bar():
print('from bar')
def foo(func):
return func
#print(bar)
f = foo(bar) # f ---> bar
#print(f)
f()
4、函数名可以作为容器类型的元素
def get():
print('from get')
def put():
print('from put')
l = [get,put]
#print(l)
l[0]()
1.2 函数对象的应用
可以优雅地取代if分支
二、函数嵌套
作用:让内层函数封闭起来,不让外部直接调用
2.1 函数的嵌套调用
在函数内又调用其他函数,将复杂并且小的功能,在函数内部调用,解决代码结构清晰问题
def max1(x,y):
if x > y:
return x
else:
return y
def max2(x,y,z):
res1 = max1(x,y)
res2 = max1(res1,z)
return res2
print(max2(11,199,2))
2.2 函数的嵌套定义
在函数内又定义了其他函数
例1:
def func1():
print('from func1')
def func2():
print('from func2')
func2()
func1()
例2:
def f1():
print('f1')
def f2():
print('f2')
def f3():
print('f3')
f3()
f2()
f1()
三、闭包函数
闭:指的是定义在函数内部的函数
“包”:代表函数外’包裹’着对外层作用域的引用
比如手机是闭包函数(内层函数),被手机包装盒 (外层函数) 包裹起来,
手机可以使用包装盒中的东西,内层函数可以引用外层函数的名字。
闭包函数:定义在函数内部的函数,并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数。
闭包函数是 函数嵌套、函数对象、名称空间与作用域 结合体。
基本形式:
def outer():
name ='egon'
def inner():
print('my name is %s' %name)
return inner
# print(outer())
inner=outer() #实现了外部调用内部的函数
inner()
注意:作用域关系在函数定义阶段就定死了,与调用位置无关
闭包函数外面最多套两层函数就够了
3.1 闭包的用途
目前为止 我们得到了两种为函数体传值的方式
1 :直接将值以参数的形式传入
2 :将值包给函数
import requests
#方式一:
def get(url):
return requests.get(url).text
#方式二:
def page(url):
def get():
return requests.get(url).text
return get
提示:requests模块是用来模拟浏览器向网站发送请求并将页面内容下载到本地,需要事先安装:pip3 install requests
对比两种方式:
# 方式一:在下载同一页面时需要重复传入url
# 方式二:只需要传一次值,就会得到一个包含指定url的闭包函数,以后调用该闭包函数则无需再传url
# 方式一下载同一页面
get('https://www.python.org')
get('https://www.python.org')
get('https://www.python.org')
……
# 方式二下载同一页面
python=page('https://www.python.org')
python()
python()
python()
……