zoukankan      html  css  js  c++  java
  • 函数对象补充,包函数与装饰器

    函数对象补充

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

    应用:

    可以优雅地取代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()
    
  • 相关阅读:
    弹窗多内容,灵活布局计算方式总结
    暖场广告设计方案
    UIStackView上手教程
    多弹窗排序总结
    常用的code snipper
    iOS开发常用技能点(持续更新中。。。)
    32位和64位系统区别及int字节数
    liunx环境,摄像头无法识别,解决方案
    TCP/IP 笔记 7 Ping
    TCP/IP 笔记 6 netstat -s 命令查看每个协议统计数据
  • 原文地址:https://www.cnblogs.com/godlover/p/11842361.html
Copyright © 2011-2022 走看看