Python函数对象与闭包函数

本文详细介绍了Python中的函数对象,包括其作为变量赋值、实参、返回值、容器元素以及在ATM框架中的应用。同时,探讨了闭包函数的概念、使用场景和用途,如数据传递和爬虫中的请求处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


书接上回,上次我们讲到了函数名称空间与作用域,这次我们来详细讲解函数对象与闭包

一、函数对象

函数对象就是函数的名字,函数对象可以像普通对象一样被传递、赋值、作为返回值等等。

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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值