day13_闭包函数、装饰器、迭代器、表达式

闭包函数

意义:将函数和函数需要用到的参数包裹到一起,这样当调用函数时,该参数的第一查找作用域为被包在一起参数

def func1(x):
    print(x)

def outer(x):
    def inner():
        print(x)
	return inder

func = outer(x)
func()  # 此时不需要再传参数,以后调用直接使用即可

装饰器

用闭包的思想,将被装饰的函数与装饰的功能包在一起

要求:

1、不能使得被装饰函数的源代码改变

2、不得更改被装饰函数的调用方式

无参装饰器

即被装饰的函数无参

def index():
    print('A')

def deco(func):
    def wrapper():
        # 在wrapper中对真正的func函数做功能添加
        res = func()  # 调用被装饰函数
        
       	return res
    return wrapper

# 调用
index = deco(index)  # 参数为函数对象,重命名装饰之后的wrapper 为原来的函数名,左到以假乱真,实现不改变调用方式的作用
index()
        

有参装饰器

即被装饰的函数有参

def index(x):
    print(x)

def deco(func):
    #  无论原来的func有多少参数,都能接收
    def wrapper(*args,**kwargs):
        # 在wrapper中对真正的func函数做功能添加
        res = func(*args,**kwargs)  # 调用被装饰函数
        
       	return res
    return wrapper

# 调用
index = deco(func)
index(x)

多层装饰器

当内层装饰器需要参数时,仍然使用闭包思想,将装饰器函数与参数包在一起

def index(x):
    print(x)

def sanceng(x):
    def deco(func):
        def wrapper(*args,**kwargs):
            # 在wrapper中对真正的func函数做功能添加
        	res = func(*args,**kwargs)  # 调用被装饰函数
        
       		return res
        return wrapper
    return deco

# 调用
index = sanceng(x)(func)
index()

装饰器语法糖

在定义被装饰函数时,在它的上面一行使用格式@装饰器名字

@deco
def index(x):
    print(x)

如果是多层装饰器,则使用格式@装饰器名字(x),注意传参(实参)

@sanceng(19)
def index(x):
    print(x)

迭代器

迭代的工具,基于上一次的结果,重复进行某种操作

可迭代对象

python中一切为对象(数据类型)

其中含有__iter__内置方法的,叫做可迭代对象

str,list,tuple,dict,set,file都是可迭代对象

调用__iter__方法后得到的返回值,拥有__next__方法,即为迭代器对象

迭代器对象

其中含有__iter____next__内置方法的,叫做迭代器对象

目前所学,只有file是同时含有__iter____next__方法,是迭代器对象

迭代器的用法

调用一次__next__方法,遍历一个元素


for循环原理

lt = [1,2,3]
lt_iter = lt.__iter__
while True:
    try:
        print(lt.iter.__next__)
	except Expection:
        break

生成器

使用定义函数的方式,自定义一个迭代器,即为生成器

def g():
    yield 1
    yield 2
    yield 3
print(g)
g = g()
print(g)
'''
<function g at 0x00000248B8872F78>
<generator object g at 0x00000248BFACBA48>
'''

#  迭代循环
for i in g:
    print(i)
'''
1
2
3'''

定义一个range()方法

'''
1、参数可能是关键字实参
2、可能有位置实参和关键字实参组合
'''

起始结束全部为位置实参,步长默认1,起始默认0

def range(stop,start=0,end=2):
    i = 0
    while True:
        if i < start:
            i += 1
            continue
        if i >= stop:
            break
        yield i
        i += end


for i in range(1,5):
    print(i)

起始结束不全是位置实参,步长默认1(大于等于三参数版本,小于三参数的未写)

def range(*args, **kwargs):
    
    start = 0
    stop = 1
    end = 1

    if len(args) + len(kwargs) > 3:
        return
    if len(args) == 0:
        for k, v in kwargs.items():
            if k not in ['start', 'stop', 'end']:
                break
            if k == 'start':
                start = v
            if k == 'stop':
                stop = v
            if k == 'end':
                end = v
        # 拿到start,stop,end之后
        i = 0
        while True:
            if i < start:
                i += 1
                continue
            if i >= stop:
                break
            yield i
            i += end

    elif len(args) == 1:
        start = args[0]

        for k, v in kwargs.items():
            if k not in ['stop', 'end']:
                break
            if k == 'stop':
                stop = v
            if k == 'end':
                end = v
        # 拿到start,stop,end
        i = 0
        while True:
            if i < start:
                i += 1
                continue
            if i >= stop:
                break
            yield i
            i += end

    elif len(args) == 2:
        if 'end' not in kwargs:
            return
        end = kwargs['end']
        start, stop = args

        # 拿到start,stop,end
        i = 0
        while True:
            if i < start:
                i += 1
                continue
            if i >= stop:
                break
            yield i
            i += end

    elif len(args) == 3:
        start, stop, end = args
        i = 0
        while True:
            if i < start:
                i += 1
                continue
            if i >= stop:
                break
            yield i
            i += end
    

花里胡哨表达式

三元表达式

条件成立时的返回值 if 条件 else 条件不成立时的返回值

# 函数版
def (x,y):
    if x > y:
        return x
    return y
# 表达式版
res = x if x > y else y

列表推导式

按照某种规律生成一个列表

lis = [i**2 for i in range(10)]
print(lis)
'''
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
'''

字典生成式

按照某种规律生成一个字典

dic = {'a'*i:i**2 for i in range(10)}
print(dic)
'''
{'': 0, 'a': 1, 'aa': 4, 'aaa': 9, 'aaaa': 16, 'aaaaa': 25, 'aaaaaa': 36, 'aaaaaaa': 49, 'aaaaaaaa': 64, 'aaaaaaaaa': 81}'''
posted @ 2019-09-24 18:41  W文敏W  阅读(126)  评论(0)    收藏  举报