装饰器、迭代器、生成器

# 生成器和迭代器类似,都是用来提供遍历的一种特殊数据结构。
# 生成器不会占用大量的内存,只在遍历的时候会占用生成值的内存
# 生成器的特点是使用yield关键字来返回值。
def colors():
    """一个简单的生成器函数"""
    for color in ["black", "red", "green", "yellow", "blue"]:
        yield color
if __name__ == '__main__':
    # 生成器可以直接用for遍历
    for color in colors():
        print(color)
# 可迭代对象指的是可以通过for去遍历的对象。
# 迭代器就是一种可以被遍历的对象,通常需要实现iter和next两个基本方法。
# 需要注意的是,可迭代对象不一定是迭代器,但是迭代器一定是可迭代对象。
arr = [1, 2, 3]
iarr = iter(arr)
print(type(iarr), iarr)
# 取出数据
print(next(iarr))
print(next(iarr))
print(next(iarr))
# 装饰器是一种基于闭包的高级函数,一般是用来装饰函数或者类的方法,能够在函数的执行前后执行特殊的逻辑
import time
def spendtime(f):
    """一个统计方法执行时间的装饰器"""
    def inner():
        """接收外部的变量f,f本质上是一个函数"""
        print("方法执行之前")
        start = time.time()
        f()  # 执行方法
        print("方法执行之后,统计消耗时间:", time.time() - start)
    return inner
@spendtime  # 使用装饰器
def testf():
    """测试方法"""
    time.sleep(3)
    print("测试方法执行了。。。")
if __name__ == '__main__':
    # 调用被装饰的方法
    testf()
# 自定义迭代器类,必须要实现__iter__和__next__方法,
# 其中__next__方法是最重要的,用于指定每次迭代要返回的值
class A:
    def __init__(self, n):
        self.n = n
        self.count = -1  # 计数器
    def __iter__(self):
        """必须实现"""
        # 返回可迭代对象
        return self
    def __next__(self):
        """必须实现"""
        # 返回每一次迭代器计算出的结果
        # 调用next会自动执行此方法
        if self.count < self.n - 1:
            self.count += 1
            return self.count
        return None
if __name__ == '__main__':
    # 创建可迭代对象
    a = A(3)
    # while 遍历
    while True:
        v = next(a)
        if v is not None:
            print(v)
        else:
            break
    # for 遍历
    a = A(3)
    for i in a:
        if i is None:
            break
        print(i)

Python基础之高级函数

你可能感兴趣的:(python,开发语言)