啦啦啦啦

装饰器的主要功能和装饰器的固定结构

def timer(func):
    def inner(*arg,**kwargs):
        "调用函数前执行的代码"
        re=func(*arg,**kwargs)
        "调用函数后执行的代码"
        return re
    return inner

@timer
"被装饰器装饰的函数"
装饰器的固定格式
被装饰器装饰的函数,不能查看该函数的一些信息,所以使用wraps模块,加在最内层函数正上方


from functools import wraps

def deco(func):
    @wraps(func) #加在最内层函数正上方
    def wrapper(*args,**kwargs):
        return func(*args,**kwargs)
    return wrapper


@deco
''被装饰函数''
装饰器的固定格式——wraps版
#频繁的调用装饰器或不调用装饰器,可以用带参数装饰器解决


def outer(flag):
    def timer(func):
        def inner(*args,**kwargs):
            if flag:
                print('''执行函数之前要做的''')
            re = func(*args,**kwargs)
            if flag:
                print('''执行函数之后要做的''')
            return re
        return inner
    return timer

@outer(False)
def func():
    print(111)

func()
带参数的装饰器

 

可迭代对象与迭代器

可迭代对象遵循可迭代协议,内部实现了__iter__方法。

迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。
区别

可迭代对象通过执行iter方法得到迭代器

 

 

生成器Generator

1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)
特点:惰性运算,开发者自定义
定义
生成器=生成器函数()      激活生成器只能用next
next:  生成器.next()    执行到下一个yield之前的代码,不赋值给yield任何值,激活生成器必须用next
send:    生成器.send(参数)    从上一个yield开始,并赋值给上一个yield参数,执行到下一个yield之前的代码
next 与 send
1.把列表解析的[]换成()得到的就是生成器表达式
2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
        
#列表解析式
li=[i for i in range(100000000)]#内存占用大,机器容易卡死    返回一个列表
#生成器表达式
li=(i for i in range(100000000))#几乎不占内存     返回一个生成器对象
生成器表达式 与 列表表达式

激活生成器的方法:for循环  list()

#列表推导式
    #找到嵌套列表中名字含有两个‘e’的所有名字
    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    print([name for lst in names for name in lst if name.count('e') >= 2])  # 注意遍历顺序,这是实现的关键
#字典推导式
    #合并大小写对应的value值,将k统一成小写
    mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
      mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys()}
    print(mcase_frequency)
#集合推导式
    #计算列表中每个值的平方,自带去重功能
    squared = {x**2 for x in [1, -1, 2]}
      print(squared)    
列表推导式 字典推导式 集合推导式

 

posted @ 2018-01-16 09:39  JAYWX  阅读(93)  评论(0编辑  收藏  举报