zoukankan      html  css  js  c++  java
  • 函数闭包,装饰器,迭代器

    函数闭包

    闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量引用),闭包指的是:函数内部函数对外部作用域而非全局作用域的引用

    import requests
    
    def func(url):
        def get_res():
            res=requests.get(url)
            res.encoding='utf8'
            print(res.text)
        return get_res
    # baidu=func('https://www.baidu.com')
    # baidu()
    taobao=func('https://www.taobao.com/')
    taobao()
    
    两种为函数传参的参数

    1、使用参数的形式

    def func(x):
        print(x)
    func(1)
    func(1)
    func(1)
    #1
    #1
    #1
    

    2、包给函数

    def outter(x):
        x=1
        def inner():
            print(x)
        return inner
    f=outter(1)
    f()
    f()
    f()
    #1
    #1
    #1
    

    装饰器

    器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰对象添加额外功能,因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能

    需要注意

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

    被装饰的对象也可以是任意可调用的对象

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

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

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

    import time
    def index():
        print('hello, world')
        # return index  ##再次返回调用一次
    # index()
    
    def dice(func):   ##装饰器
    
        def f1():     ##装饰的功能
            star=time.time()
            func()
            time.sleep(1)
            end=time.time()
            print(end-star)
        return f1
    index=dice(index)
    index()
    
    #加强版
    import time
    def index(x,a=1):
        print('x',x)
        print('a',a)
        print('hello wrold')
        return 123
    
    def deco(func):
        def f1(*args,**kwargs):
            print('args:',args)
            print('kwargs:',kwargs)
            start=time.time()
            res=func(*args,**kwargs)
            end=time.time()
            return res
        return f1
    
    index=deco(index)
    res=index(10)
    print(res)
    
    ##装饰器模板
    def login(func):
        def inner(*args,**kwargs):
            user=input('输入用户名')
            pwd=input('输入密码')
            if user=='lzs'and pwd=='1234':
                print('登陆成功')
                res = func(*args, **kwargs)
                return res
            else:
                print('登陆失败')
    
        return inner
    
    @login
    def shopping():
        print('欢迎购物')
    shopping()
    
    ##三层装饰器:给双层装饰器加参数
    def auth(engine):
        def login(func):
            def inner(*args, **kwargs):
                if engine == 'flie':
                    user = input('输入用户名')
                    pwd = input('密码')
                    if user == 'lzs' and pwd == '1234':
                        print('登陆成功')
                        res = func(*args, **kwargs)
                        return res
                    else:
                        print('登陆失败')
                elif engine == 'db':
                    print('账号来自数据库')
            return inner
    
        return login
    
    @auth('flie')
    def shopping():
        print('shopping')
        # login=auth('flie')
        # shopping=login(shopping)
    shopping()
    
    既然选择了远方,只能风雨兼程
  • 相关阅读:
    有价值的终会被人发现和承认
    Sql中存在斜杠“/”怎么办?
    JSONObject和JSONArray(json-lib-2.4)的基本用法
    如何设定linux系统时间
    动态创建的文本框想要加上jQuery的datepicker功能变成日期选择控件该怎么办?
    如果$.ajax函数迟迟得不到响应,那么最有可能出错的地方是请求参数写错了
    Notepad2替代系统自带的记事本Notepad
    css属性与js中style对象的属性对应表
    day02_js学习笔记_01_js的简介、js的基本语法
    Eclipse/MyEclipse的快捷键以及文档注释、多行注释的快捷键
  • 原文地址:https://www.cnblogs.com/lzss/p/11401990.html
Copyright © 2011-2022 走看看