迭代器

#判断是否为可迭代(Iterable)对象:
isinstance(***, Iterable)

#判断是否为迭代器(Iterator)对象:
isinstance(***, Iterator)

1. 什么是迭代?
迭代是访问集合元素的一种方式。

可迭代对象有哪些?
==> 可以直接作用于 for 循环的数据类型:

  • 一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
  • 一类是 generator ,包括生成器和带 yield 的generator function。

==> 这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。


2. 什么是迭代器(iterator)?

  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
  • 迭代器只能往前不会后退。
  • 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

迭代器有哪些?

  • 生成器都是 Iterator 对象。
  • 生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。
  • 但是,除了生成器,其他 list 、 dict 、 str 虽然是 Iterable ,却都不是 Iterator
(i for i in range(7))是一个生成器对象
#<generator object <genexpr> at 0x7f7e471ed550>

[i for i in range(7)]是一个列表
#[0, 1, 2, 3, 4, 5, 6]

那如何将可迭代对象变成迭代器对

象呢?
==> 使用 iter() 函数

iter([])

总结:

  • 凡是可作用于 for 循环的对象都是 Iterable 类型;
  • 凡是可作用于 next() 函数的对象都是 Iterator 类型
  • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。

使用迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

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

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和new()

1. 创建迭代器:

#1. 将 list 、 dict 、 str 等是 Iterable的数据类型编程迭代器对象:
iter() 

#2. 通过创建一个类来创建一个迭代器,把这个类作为迭代器使用。
#怎么创建这个类:需要在类里实现两个方法 __iter__() 与 __next__() :
#(如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。)
__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。

创建一个返回数字的迭代器,初始值为 1,逐步递增 1:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 #无论何时创建迭代器都将调用_iter_()方法。这是用初始值对迭代器进行初始化的绝佳之处。
#以后创建并使用这个迭代器对象的时候,iter(seq)就是等同于seq._iter_()

  def __next__(self):
    x = self.a
    self.a += 1
    return x
#无论何时从迭代器中获取下一个值,都将调用_next_()方法。
#以后出去,next(seq)就是等同于seq._next_()
#相对于_next_()函数,_reversed_()按逆序创建一个迭代器。它以一个现有序列为参数,并将该序列中所有元素从尾到头以逆序排列生成一个新的迭代器。

 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
# 1
# 2
# 3
# 4
# 5

2. 访问迭代器对象里的数据,有两种方式 :

  • next(iterator_object):
  • for循环:for x in (iterator_object)
一、使用new函数一个一个迭代访问
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
print (next(it))   # 输出迭代器的下一个元素
#1
print (next(it))
#2


二、迭代器遍历:
(1)迭代器对象可以使用常规for语句进行遍历:
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")
#1 2 3 4

(2)也可以使用next()进行遍历:
import sys         # 引入 sys 模块
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
 
while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()

# 1
# 2
# 3
# 4
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。