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

2020-09-05  本文已影响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的异常


class Foo:
    def __getitem__(self,index):
        return ['a','b','c'][index]
    
foo = Foo()
for e in foo:
    print(e)

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 方法,因此迭代器也可以迭代。

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))
上一篇下一篇

猜你喜欢

热点阅读