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

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

作者: 刘烟火 | 来源:发表于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))

相关文章

  • Python基础-16生成器-迭代器

    16.生成器-迭代器     可循环迭代的对象称为可迭代对象,迭代器和生成器函数是可迭代对象,在Python中提供...

  • Python可迭代对象,迭代器,生成器关系

    列表,元组,字符串,迭代器,生成器都是可迭代对象。所以,可迭代对象不一定是迭代器,生成器。 将一个可迭代对象传递给...

  • Python中的迭代器和生成器

    今天我们来学习下Python中的迭代器和生成器。 迭代和可迭代对象 在学习迭代器之前,我们需要了解下迭代和可迭代对...

  • 迭代器

    可迭代对象(Iterable): for迭代器(Iterator): for + next生成器属于迭代器。 验...

  • 可迭代对象、迭代器、生成器

    可迭代对象 --> 迭代器 --> 生成器; 可迭代对象:实现了__iter__()方法的对象,该方法返回迭代对象...

  • yield and Iterator

    Generator(生成器) 生成器是特殊的迭代器,迭代器不一定是生成器。 生成器与迭代器均是可迭代对象。 目前学...

  • 迭代机制

    可迭代对象、迭代器、生成器、生成式区别 a. 可迭代对象: 一个对象能够被迭代的使用,这个对象就是可迭代对象 b....

  • python生成器、迭代器、可迭代对象

    可迭代对象 迭代器 生成器 1.可迭代对象 可以被for循环遍历的对象成为可迭代对象,其中包括list、str、t...

  • 2-1迭代对象、迭代器、生成器

    可迭代对象、迭代器和生成器的关系 可迭代对象 可迭代对象实现某种接口,对与列表内部实现了__iter__()方法,...

  • Python迭代器和生成器

    所有的生成器都是迭代器;从可迭代的对象中获取迭代器 一、序列可迭代的原因:iter函数 迭代对象x时,自动调用it...

网友评论

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

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