目录
书接上回,上次我们讲到了函数名称空间与作用域,这次我们来详细讲解函数对象与闭包
一、函数对象
函数对象就是函数的名字,函数对象可以像普通对象一样被传递、赋值、作为返回值等等。
1.1函数可以当成变量赋值
def index():
print('index')
return 1, 2, 3
print(index()) # (1, 2, 3)
print(index) # <function index at 0x000001CE30DEA8B0>
a = index
res = a() #index()
print(res) #(1, 2, 3)
1.2 函数名可以当成函数的实参
def index():
print('index')
return None
def func(a):
# a:index
print(a)
res=a() # index()
print(res) # res的结果? None
# index:index函数所在的内存地址
func(index)
1.3函数名可以当成函数的返回值
def index():
print('index')
return 'index2'
def func():
print('func')
# return index() # 'index'
return index # 'index'
res = func() #
print(res)
res1=res() # index()
print(res1)
1.4 函数名可以当成容器类型的元素
def index():
print('index')
return None
ll = [11, 22, 33, index]
# ll = [11, 22, 33, index()]
# print(ll[3])
res=ll[3]() # index()
print(res)
1.5 函数对象案例
搭建一个ATM的框架
注册功能 登录功能 转账功能 提现功能 充值功能 等
def register():
pass
def login():
pass
def transfer():
pass
def withdraw():
pass
def pay():
pass
def shopping():
pass
def shopping1():
pass
func_dict = {
'1': register,
'2': login,
'3': transfer,
'4': pay,
'5': withdraw,
'6': shopping,
'7': shopping1,
}
### 代码启动,展示所有的功能编号
while True:
print("""
1. 注册功能
2. 登录功能
3. 转账功能
4. 充值功能
5. 提现功能
6. 购物功能
7. 购物功能
""")
# 让用户输入对应的功能编号
cmd = input('请输入你要执行的功能编号:').strip()
if not cmd.isdigit():continue
if cmd in func_dict:
func_dict.get(cmd)()
else:
print('请好好输入')
1.6函数的嵌套调用
嵌套:函数套函数
# 案例:给你四个数,比较大小,返回最大的
# 两个数的比较大小,返回大的
def my_max(a, b):
if a >b:
return a
return b
# res=my_max(1, 2)
# print(res)
##
def many_max(a, b, c, d, e):
'''四个数的比较大小其实还是要两两比较!'''
res=my_max(a, b) # res得到a和b中得大的那个
# 怎么样比较res和剩余的大小, 只需要拿res和c或者d中得一个进行比较
res1=my_max(res, c) # res1:a,b,c中得最大的那个
res2=my_max(res1, d)
res3=my_max(res2, e)
return res3
res=many_max(11, 12, 3, 24)
print(res)
二、闭包函数
闭包函数指的是在函数内部定义了另一个函数,并且这个内部函数可以访问到外部函数的变量,即使外部函数已经执行完毕,内部函数仍然可以访问到这些变量。这个内部函数就被称为闭包函数。
闭包函数通常用于在函数内部创建一些私有变量或私有方法,或者用于在多个函数之间共享变量。
1.1什么是闭包函数?
闭:就是函数内部定义的参数,至少要有两层函数
包:内部函数要使用外部函数名称空间中的名字
只有同时满足两个或以上才能称之为闭包函数
def index():
x=123
def index1():
print('gg', 123)
return
index()
1.2闭包函数的使用场景
闭包函数其实也是一种传参方式
第一种传参:
def index(username):
print(username)
index('张三')
第二种传参
比较两个数的大小
def my_max(a, b):
if a > b:
return a
return b
my_max(10, 20)
用闭包函数实现两个数比较大小:一次传值,多次使用
def index(a, b):
# a = 10
# b = 20
def index1():
if a > b:
return a
return b
return index1()
res = index(20, 30)
print(res)
print(res)
print(res)
print(res)
print(res)
print(res)
print(res)
print(res)
1.3 闭包函数的用途
爬虫:爬取百度首页的数据
import requests
def outer(url):
# url = 'https://www.jd.com/'
def get_content():
# url = 'https://www.jd.com/'
res=requests.get(url)
res.encoding='utf-8'
# print(res.text) # 返回的是文本
print(res.content) # 返回的是文本
with open('baidu.html', 'wb') as f:
f.write(res.content)
return get_content
res=outer('https://www.jd.com/') # res:get_content
res()
res()
res()
res()
res()
res1=outer('https://www.taobao.com/')
res1()
res1()
res1()
res1()
res1()
res1()
res1()