扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
本篇内容介绍了“怎么理解关于python函数对象与闭包”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
创新互联主要从事成都做网站、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务措美,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
一、函数对象
在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量、可以作为元素添加到集合对象中、可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的。
1、函数可以被引用
>>> def add(x,y):
... return x+y
...
>>> func=add
>>> func(1,2)
3
2、函数可以作为容器类型的元素
>>> dic={'add':add,'max':max}
>>> dic
{'add': , 'max': }
>>> dic['add'](1,2)
3
3、函数可以作为参数传入另外一个函数
>>> def foo(x,y,func):
... return func(x,y)
...
>>> foo(1,2,add)
3
4、函数的返回值可以是一个函数
def bar():
return add
func=bar()
func(1,2)
3
5、应用案例
(1)最简单的写法
def login():
'''登录'''
print('登录成功')
def registry():
'''注册'''
print('注册成功')
def check_balance():
'''查询余额'''
print('余额查询成功')
def withdraw():
'''提现'''
print('提现成功')
print('''
1 登录
2 注册
3 查询余额
4 提现
''')
choice = input('请输入您要执行的操作编号:').strip()
if choice == '1':
login()
elif choice == '2':
registry()
elif choice == '3':
check_balance()
else:
withdraw()
缺点:如果函数很多,那么冗余太大,后期增加功能也不方便
(2)优化后的代码
def login():
'''登录'''
print('登录成功')
def registry():
'''注册'''
print('注册成功')
def check_balance():
'''查询余额'''
print('余额查询成功')
def withdraw():
'''提现'''
print('提现成功')
func = {
'0':('退出',None),
'1':('登录',login),
'2':('注册',registry),
'3':('查询余额',check_balance),
'4':('提现',withdraw)
}
while True:
for i in func:
print(i,func[i][0])
choice = input('请输入您要执行的操作编号:').strip()
if choice == '0':
break
elif choice not in func:
print('尊敬的用户,您好!你需要执行的操作不存在,请重新选择操作编号!')
continue郑州专业人流医院 http://4g.zyfuke.com/
else:
func[choice][1]()
二、函数嵌套
再一个函数的函数体中又定义一个新函数。称之为函数嵌套
1、应用案例一
对圆的所有操作函数我们都放进circle函数中去,通过指定action参数的值,从而来确定调用那个函数,执行那个操作(类似文件处理中的指定r,w,a模式)。
2、闭包函数
(1)闭与包
函数被当做数据处理时,始终以本地的作用域为准。若内嵌函数包含对外部函数作用域(而非全局作用域)中变量的引用,那么该’内嵌函数’就是闭包函数,简称闭包(Closures)
x=1
def outer():
x=2
def inner():
print(x) #此处的x就是外部函数的变量x,因此inner为闭包函数
return inner
func=outer()
func() # 结果为2
可以通过函数的closure属性,查看到闭包函数所包裹的外部变量
>>> func.__closure__
(,)
>>> func.__closure__[0].cell_contents
2
“闭”代表函数是内部的,“包”代表函数外’包裹’着对外层作用域的引用。因而无论在何处调用闭包函数,使用的仍然是包裹在其外层的变量。
3、闭包函数的用途
目前为止,我们得到了两种为函数体传值的方式,一种是直接将值以参数的形式传入,另外一种就是将值间接传给闭包函数
import requests
#方式一:
def get(url):
return requests.get(url).text
#方式二:
def page(url):
def get():
return requests.get(url).text #url是外部函数的变量,因此get是闭包函数
return get
提示:requests模块是用来模拟浏览器向网站发送请求并将页面内容下载到本地,需要事先安装:pip3 install requests
对比两种方式,方式一在下载同一页面时需要重复传入url,而方式二只需要传一次值,就会得到一个包含指定url的闭包函数,以后调用该闭包函数无需再传url
……
闭包函数的这种特性有时又称为惰性计算。使用将值包给函数的方式,在接下来的装饰器中也将大有用处。
“怎么理解关于python函数对象与闭包”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流