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示例

猜你喜欢

转载自www.cnblogs.com/Amrice/p/10794285.html