美文网首页
带你了解可迭代对象、迭代器、生成器

带你了解可迭代对象、迭代器、生成器

作者: 刘烟火 | 来源:发表于2020-09-05 10:34 被阅读0次

    可迭代的对象

    使用 iter 内置函数可以获取迭代器的对象。如果对象实现了能返
    回迭代器的 iter 方法,那么对象就是可迭代的。序列都可以迭
    代;实现了 getitem 方法,而且其参数是从零开始的索引,这种
    对象也可以迭代

    s = 'hello'
    lst = [3,4,5]
    dic = {'k':'v','key':'value'}
    st = set([8,9,10])
    
    for c in s:
        print(c)
    for e in lst:
        print(e)
    for e in st:
        print(e)
    for e in dic:
        print(e)
    
    

    我们可以通过 dir(lst)发现 这些对象 都具有 itergetitem 方法

    在python 中所有的集合都可以迭代
    字符串、列表、集合、字典等

    检查对象是否可迭代 使用 iter 函数

    iter([3,4,5])
    iter(3)
    

    不能迭代的对象 则会返回TypeError的异常

    • 使用 get_item 自动生成迭代器
    
    class Foo:
        def __getitem__(self,index):
            return ['a','b','c'][index]
        
    foo = Foo()
    for e in foo:
        print(e)
    
    • 使用 iter 调用迭代器
    
    import re
    import reprlib
    
    RE_WORD = re.compile('\w+')
    # 可迭代的类
    class Sentence:
        def __init__(self, text):
            self.text = text
            self.words = RE_WORD.findall(text)
        
        def __repr__(self):
            return 'Sentence(%s)' % reprlib.repr(self.text)
    
        def __iter__(self):
            return SentenceIterator(self.words)
    
    # 生成器
    class SentenceIterator:
        def __init__(self, words):
            self.words = words
            self.index = 0
    
        def __next__(self):
            try:
                word = self.words[self.index]
            except IndexError:
                raise StopIteration()
            self.index += 1
            return word
    
        def __iter__(self):
            return self
    
    s1 = Sentence('hello world , haha hey ya')
    for w in s1:
        print(w)
    

    迭代器

    迭代器是这样的对象:实现了无参数的 next 方法,返回序列
    中的下一个元素;如果没有元素了,那么抛出 StopIteration 异常。
    Python 中的迭代器还实现了 iter 方法,因此迭代器也可以迭代。

    • 可迭代对象必须实现 iter 方法, 但 不能实现 next方法
    • 迭代器的 iter方法应该返回自身

    next
      返回下一个可用的元素,如果没有元素了,抛出 StopIteration
    异常。
    iter
      返回 self,以便在应该使用可迭代对象的地方使用迭代器,例如
    在 for 循环中

    对于 迭代器或可迭代对象 我们可以对其使用 next() 方法 获取,下一个元素。

    siter = iter('雷好啊')
    print(siter)
    
    print(next(siter))
    print(next(siter))
    print(next(siter))
    
    # StopIteration
    print(next(siter))
    

    StopIteration 异常表明迭代器到头了。Python 语言内部会处理 for
    循环和其他迭代上下文(如列表推导、元组拆包,等等)中的
    StopIteration 异常。

    生成器

    一种特殊的迭代器, Python 函数的定义体中有 yield 关键字,该函数就是生成器函
    数。调用生成器函数时,会返回一个生成器对象。

    1. 使用 yield 关键字 的函数
    # 斐波拉奇
    def fib():
        pre,cur = 1,1
        while True:
            yield pre
            pre, cur =cur,pre + cur
        
    f = fib()
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
    
    1. 使用生成器表达式语法糖 构建生成器
    #  100 以内的偶数
    its = (i for i in range(2,100,2))
    print(next(its))
    print(next(its))
    print(next(its))
    

    相关文章

      网友评论

          本文标题:带你了解可迭代对象、迭代器、生成器

          本文链接:https://www.haomeiwen.com/subject/ivtisktx.html