• python之三神器


      在Python里有三种器,被称之为三神器,他们分别是:装饰器、迭代器,生成器。

      下面就简单的说一下这三神器。

    一、装饰器

      问:什么是装饰器?

      答:在不改变源代码和调用方式的基础之上给函数增加新的功能,就是装饰器

    def deco(func):             
        def wrapper():        
                func()                  
        print('新功能')          
    return wrapper           
                              
    def test():                 
        print('thisis')        
    test = deco(test)
    test() 
    无参装饰器
    import time
    
    def timer(func):
        def deco(*args,**kwargs):
            start_time = time.time()
            res = func(*args,**kwargs)
            end_time = time.time()
            print('cost', end_time-start_time)
            return res
        return deco
    
    @timer
    def bar(a, b):
        time.sleep(2)
        print('这是bar')
        print(a)
        print(b)
    bar(1,2)
    
    有参装饰器
    有参装饰器
    def default_engine(engine=None):
        def auth(func):
            def deco(*args, **kwargs):
                user = input('user:')
                password = input('password:')
                if engine == 'mysql':
                    if user == 'root' and password == 'root':
                        res = func(*args, **kwargs)
                        return res
                    else:
                        print('用户名或密码错误')
                else:
                    print('没有这个引擎')
            return deco
        return auth
    
    @default_engine(engine='mysql')
    def index():
        print('welcome to home page')
    
    # res = default_engine(engine='mysql')
    # index = res(index)
    index()
    
    带参数的装饰器
    带参数的装饰器

    二、迭代器

      问:什么是迭代器?

      答:迭代器是一个重复的过程,即每一次重复为一次迭代,并且每一次迭代的结果都是下一次迭代的初始值

      问:为什么要有迭代器?什么是迭代对象?什么是迭代器对象?

    答:1、为何要有迭代器?
        对于字符串,列表,元组,我们可以使用索引的方式迭代取出其包含的元素
    但是对于字典,集合,文件等类型是没有索引的,若还想取出内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器。
          2、为什么叫做可迭代对象?
    有.__iter__方法的都叫做可迭代对象
    有字符串,元组,列表,集合,字典,文件等
    'world'.__iter__
    (4,5,6).__iter__
    [1,2,3].__iter__
    {'a':1}.__iter__
    {'a','b'}.__iter__
    open('a.txt').__iter__
          3、什么叫做迭代器对象?
    有.__iter__和.__next__方法的叫做迭代器对象
    只有文件
    open('a.txt').__iter__()
    open('a.txt').__next__()
        
           4、总结
    迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象
    View Code

    三、生成器

       问:什么是生成器?

       答:只有函数里有yield关键字,那么函数名()得到的结果就是生成器。

         其实生成器就是迭代器,并不会执行函数内部的代码。

       生成器优点:同一时间只能储存一个值,节省内存空间

       生成器缺点:只能不断的向后取值,不能向前取值

    def test():#全部打出来占用内存空间
        for I in range(100):
        yield i
    res=test()
    for k in res:
    print(k)
    代码示例
    def test():                           #一个一个打出来不占空间
        for i in range(100):
        yield i
    res=test()
    res.__iter__()                      #不要用底线开头的词,那是一隐藏信息
    print(res.__next__())
    print(next(res))
    print(next(res))
    print(next(res))
    yield示例
  • 相关阅读:
    设计模式之单例模式
    Java的8种基本数据类型的内存占用字节数和取值范围
    如何解析本地和线上XML文件获取相应的内容
    Android性能优化(一)之启动加速35%
    自定义控件?试试300行代码实现QQ侧滑菜单
    菜单开源库装逼大全
    View动画和属性动画
    第三方分享
    Android 谈谈封装那些事 --BaseActivity 和 BaseFragment(二)
    转:工具类之SpannableStringUtils(相信你会爱上它)
  • 原文地址:https://www.cnblogs.com/Amrice/p/10794285.html
Copyright © 2020-2023  润新知