python中的生成器、迭代器、装饰器

  • by

最近简化以及优化代码,也会用到相关知识,就结合个人的情况做个比较

# 生成器
# 能通过某一种方式或者公式计算出下一步;节约内存开销,每次都是一个单位的概念
# 1.
def test1():
    return [i * i for i in range(1000)]


def test2():
    return (i * i for i in range(1000))


print("test1")
print(test1())
s = test2()
print("test2")
print(s.__next__())


# 2.
# yield
# send 送出数据
def test3():
    for i in range(100):
        print(i)
        yield
        print(i)


print("test3")
test3().__next__()


# 迭代器

def test4():
    a = [1, 2, 3, 4]
    b = iter(a)
    print(b.__next__())


print("test4")
test4()

# send 用法

# from collections import Iterable
# https://www.cnblogs.com/dreamer-lin/p/11588261.html
# python中的for机制
# (字符串str,列表list,元组tunple,字典dict,,集合set,文件对象)这些都不是可迭代对象,只不过在for循环,调用了他们的内部的__iter__()方法 把他们变成了可迭代对象
# for循环把他们变成了可迭代对象后,就调用可迭代对象的_next()_方法去取值,而且for循环会捕获StopIteration异常,以终止迭代!!!


# 装饰器

# 1.闭包
test6 = lambda x, y: x + y
print("test6")
print(test6(1, 2))

# https://www.cnblogs.com/delav/p/9840307.html
# 如果在一个内部函数里,对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认定是闭包。
lst = [lambda x, i=i: x * i for i in range(4)]  # x是外部变量
res = [m(2) for m in lst]
print(res)


def func():
    fun_list = []
    for i in range(4):
        def foo(x):
            return x * i

        fun_list.append(foo)
    return fun_list


for m in func():
    print(m(2))

# 2.
# 即用test8 返回结果作为test9参数
# https://www.runoob.com/w3cnote/python-func-decorators.html
print("test8")
from functools import wraps


def test8(func):
    @wraps(func)  # 可以让我们在装饰器里面访问在装饰之前的函数的属性
    def createFile(*args, **kwargs):
        print(*args)
        print(args[0])
        return func(*args, **kwargs)

    return createFile


@test8
def test9(fileName, second):
    pass


test9("aaa", 121)

# 先做部分事 集中起来 校验权限、日志记录等
# 补充例子1
def test10(func):
    @wraps(func)
    def inner(*args, **kwargs):
        return func(args[0]*2,args[1]+3)
    print("b")
    return inner

def test11(x, y):
    return x + y
print(test11(4, 6))

@test10
def test12(x, y):
    print("a")
    return x + y

print(test12(4, 6))


2020.2.27

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注