zoukankan      html  css  js  c++  java
  • day 12

    闭包函数

    闭包:闭是封闭(函数内部函数)包(闭包函数内部的变量) 返回闭包函数内部的函数

    def f1():
        def f2():
            print('from f2')
            
        return f2
    
    f2 = f1()
    f2()			
    

    闭包函数的应用

    返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得该函数无论在何处调用,优先使用自己外层包裹的作用域

    def f1(url):
        
        def spider():
            print(url)
            
        return spider
    
    taobao = f1('http:\www.taobao.com')
    taobao()
    

    装饰器

    无参装饰器

    什么是装饰器

    装饰器指的是为被装饰器对象添加额外功能,因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外功能

    注意

    • 装饰器本身其实是可以任意调用的对象
    • 被装饰的对象也可以是任意可调用的对象

    为什么要用装饰器

    装饰器的实现必须遵循两大原则:

    1.不修改被装饰对象的源代码

    2.不修改被装饰对象的调用方式

    装饰器其实就是在遵循以上两个原则的前提下为装饰对象添加新功能。

    语法糖

    装饰器必须放在被装饰函数的前面

    装饰器模板

    def deco(func):
        der wrapper(*args,**kwargs):
            # 功能
            res = func(*args,**kwargs)
            return res
        return wrapper
    

    三层装饰器

    添加额外的判断参数

    username_list = []
    
    
    def sanceng(role):
        def login_deco(func):
            def wrapper(*args,**kwargs):
                
                if username_list:
                    print('已经登录,请勿重复登录')
                    res = func(*args,**kwargs)
                    return res
                username_inp = input('请输入用户名:')
                pwd_inp = input('请输入密码:')
                
            with open(f'{role}_info.txt','r',encoding='utf8') as fr:
                for user_info in fr:
                    username.pwd = user_info.strip().split(':')
                    if username_inp == username and pwd_inp == pwd:
                        print('登录成功')
                        username_list.append(username)
                        
                        res = func(*args,**kwargs)
                        return res
                else:
                    print('登录失败')
        
            return wrapper
        
        return login_deco
                
    

    迭代器引入

    1.可迭代对象:具有__iter__方法

    除了数字类型和函数外都是可迭代对象

    2.迭代器对象:含有__iter____next__方法

    只有文件是迭代器对象

    迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象

  • 相关阅读:
    Redis的各种用途以及使用场景【转】
    Cron表达式
    容器绑固定物理核
    【转】Kubernetes和Docker到底有啥关系?
    memtier_benchmark安装
    压测工具
    Linux下traceroute的安装和使用
    计算机科学自学指南
    配置服务器SSH PAM防止暴力破解
    How to Enable or Disable Check for Windows Updates/Check For Updates Greyed Out
  • 原文地址:https://www.cnblogs.com/colacheng0930/p/11574414.html
Copyright © 2011-2022 走看看