py14.函数对象和闭包函数

一、函数对象

函数的名字就是函数对象,它在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()
……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琴声浮或沉__听懂只一人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值