欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-08 21:09:32
​ 当数据需要被使用时才会被生成,不会占用很多内存,需要用next()方法也可使用for循环获取,使用next()方法超出范围时会抛出Stopiteration异常,当函数中包含yield关键字,则函数就是一个生成器函数, ​ 列表推导式:L = [i*2 for i in range(10)] 生 ......
1. 生成器(generator):

​ 当数据需要被使用时才会被生成,不会占用很多内存,需要用next()方法也可使用for循环获取,使用next()方法超出范围时会抛出stopiteration异常,当函数中包含yield关键字,则函数就是一个生成器函数,

​ 列表推导式:l = [i*2 for i in range(10)]

生成器对象: l = (i*2 for i in range(10) )

 1 def fab(max):
 2     n,a,b = 0,0,1
 3     c = 0
 4     while n < max:
 5         yield b
 6         a,b = b, a+b
 7         n = n + 1
 8         
 9 # 使用for循环遍历结果
10 for n in fab(6):
11     print(n)
12     
13 # 使用next()方法获取结果,用 .send()方法给定修改yield的数值为2
14 f = fab(30)
15 for i in range(10):
16     print(f.__next__())
17     f.send(2)
18 
19 # 可以作为参数给函数传参array.extend(iterable)
20 array = []
21 array.extend(fab(8))
22 print(array)    

2. 装饰器:

​ 给函数添加新的功能,并不会改变原来函数的代码、调用方式和原有的返回结果。装饰器是利用函数嵌套的方法,实现在调用该函数之前进行一定的操作,装饰器一般返回以一个包装器(wrapper)

作用: 插入日志,性能测试,事务处理,缓存,权限效验等

3. 迭代器

  1. 迭代器的概念:

    1. 迭代器是访问集合元素的一种方式,

    2. 迭代器是一个可以记住遍历的位置的对象。

    3. 迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问结束

    4. 迭代器只能往前不能后退

    5. 迭代器有两个基本的方法:iter() 和next(), iter()为创建迭代器对象 

  2.  应用

    用迭代器实现 "斐波那锲数列"

class fibiterator(object):
    """斐波那契数列迭代器"""
    def __init__(self, n):
        """
        :param n: int, 指明生成数列的前n个数
        """
        self.n = n
        # current用来保存当前生成到数列中的第几个数了
        self.current = 0
        # num1用来保存前前一个数,初始值为数列中的第一个数0
        self.num1 = 0
        # num2用来保存前一个数,初始值为数列中的第二个数1
        self.num2 = 1

    def __next__(self):
        """被next()函数调用来获取下一个数"""
        if self.current < self.n:
            num = self.num1
            self.num1, self.num2 = self.num2, self.num1+self.num2
            self.current += 1
            return num
        else:
            raise stopiteration

    def __iter__(self):
        """迭代器的__iter__返回自身即可"""
        return self


if __name__ == '__main__':
    fib = fibiterator(10)
    for num in fib:
        print(num, end=" ")