函数对象补充,包函数与装饰器

函数对象补充

函数名字就是函数作为对象,函数名指向的是函数的内存地址

应用:

可以优雅地取代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()
原文地址:https://www.cnblogs.com/godlover/p/11842361.html