函数对象补充
函数名字就是函数作为对象,函数名指向的是函数的内存地址
应用:
可以优雅地取代if分支
函数嵌套定义:
让内层函数封闭起来,不让外部直接调用
def func1():
def func2():
pass
return func2
#返回才能调用
func2()
函数的嵌套调用:
将复杂的并且小的功能,在函数内调用,解决代码结构清晰问题
def register():
pass
def login():
pass
def func():
register()
login()
func的逻辑代码块
。。。
一.闭包函数
1.什么是闭包函数
即封闭包裹着的函数
必须在函数内部定义
可以引用外层函数的名字
闭包传参
def outer(y):
def inner()
print(y)
return inner
直接传参
def func(x):
print(x)
闭包函数是函数嵌套,函数对象,名称空间和作用域的结合体
闭包函数的应用:
为了装饰器作准备
需求:爬取某个网站,打印获取数据的长度
import requests
方式一:直接传参
def spider func(url):
#往url地址发送请求,获取响应数据
reponse = requests.get(url)#必须接收url
#状态码:200
if response.status_code == 200:
print(len(response.text))
#获取当前url地址所有的文本
print(response.text)
方式二:通过闭包函数接收url地址,执行爬取函数
def spider_outer(url):
def spider_inner():
response = requests.get(url)
if response.status_code == 200:
print(len(response.text))
return spider_inner
二:装饰器
什么是装饰器:
即装饰的工具
装饰器必须要遵守‘开放封闭’的原则
开放:
对函数功能的添加是开放的
封闭:
对函数功能的修改是封闭的
作用:
在不修改被装饰对象源代码与调用方式的前提下,添加新的功能
装饰器必须遵循:
不修改被装饰对象的源代码
不修改调用方式
为什么要使用装饰器:
可以解决代码的冗余,提高代码的可扩展性
装饰器的应用:
统计时间
登录认证
编写装饰器:
通过闭包函数实现
需求:
统计下载电影的时间
装饰器的模板:
def wrapper(func):
def inner(*args,**kwargs):
#调用被装饰对象,得到返回值
res = func(*args,**kwargs)
return res
returen inner
def func():
pass
func = wrapper(func)
func()
装饰器的语法糖,是属于装饰器
@:装饰器的语法糖
ps:在使用装饰器语法糖时,装饰器必须写在被装饰对象之上
@ wrapper 相当于func = wrapper(func)
def func():
pass
func()
模拟输出下载时间
import time
#模拟输出下载时间
# 装饰器模板
def wrapper(func):
def inner(*args, **kwargs):
start_time = time.time()
res = func(*args, **kwargs)
end_time = time.time()
print(f'下载时间:{end_time - start_time}')
return res
return inner
@wrapper
def func():
time.sleep(3)
func()