函数的进阶
Posted hj59988326
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的进阶相关的知识,希望对你有一定的参考价值。
闭包函数
什么是闭包
闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量引用)
闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。
两种为函数传参的方式
为函数传参的方式一:使用参数的形式
def func(x):
print(x)
func(1)
func(1)
func(1)
为函数传参的方式二:包给函数
def outter(x):
x = 1
def inner():
print(x)
return inner
f = outter(1)
f()
f()
f()
# 查看闭包的元素
print(F"f.__closure__[0].cell_contents: f.__closure__[0].cell_contents")
闭包函数的应用
闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。
应用领域:延迟计算(原来我们是传参,现在我们是包起来)、爬虫领域。
装饰器
什么是装饰器
器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能。因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能。
要注意的是:
- 装饰器本身其实是可以任意可调用的对象
- 被装饰的对象也可以是任意可调用的对象
为什么要用装饰器
对原来的功能进行扩展另外功能但使其源代码不变
装饰器的实现必须遵循两大原则:
- 不修改被装饰对象的源代码
- 不修改被装饰对象的调用方式
怎么使用装饰器
第一种传参方式:改变调用方式
import time
def index():
print('welcome to index')
tinme.sleep(1)
def time_count(func):
star=time.time()
func()
end=time.time()
print(f'func time is start-end')
time_count(index)
第二种传参方式:包给函数-外包
import time
def index():
print('welcome to index')
time.sleep(1)
def time_count(func)
def wrapper():
star = time.time()
func()
end = time.time()
return wrapper
index = time_count(index)
index()
完善装饰器
上述的装饰器,最后调用index()的时候,其实是在调用wrapper(),因此如果原始的index()有返回值的时候,wrapper()函数的返回值应该和index()的返回值相同,也就是说,我们需要同步原始的index()和wrapper()方法的返回值。
import time
def index():
print('welcome to index')
time.sleep(1)
return 123
def time_count(func):
# func = 最原始的index
def wrapper():
start = time.time()
res = func()
end = time.time()
print(f"func time is start-end")
return res
return wrapper
index = time_count(index)
res = index()
print(f"res: res")
装饰器语法糖
在被装饰函数正上方,并且是单独一行写上@装饰器名
装饰器模板
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
以上是关于函数的进阶的主要内容,如果未能解决你的问题,请参考以下文章