Python中可迭代对象,迭代器和生成器的异同点

  参考:https://blog.csdn.net/SL_World/article/details/86507872

  解释之前,我们先来看一张概览图,下面是一张关于容器(container)、可迭代对象(Iterable)、迭代器(iterator)、生成器(generator)、生成器函数和生成器表达式的概览图。

   翻译一下

   它们的从属关系如下

   一,容器(container)

  【概述】:容器就是一个用来存储多个元素的数据结构

  【特点】:

  ①容器中的元素可通过迭代获取。

  ②所有容器中的元素被存储在内存中。

  【举例】:以下都是常见容器对象,他们都可以通过迭代获取,所以它们也是可迭代对象(Iterable),我们暂且理解可迭代对象就是可以被迭代获取的对象。(注:并非所有容器对象都是可迭代对象)

  首先引入如下模块

# 可迭代对象
from collections import Iterable
# 迭代器
from collections import Iterator

  1,列表(list)

# 列表list是可迭代对象,但是不是迭代器
title = ['Python','Java','C++']
for i in title:
    print(i)
# Python
# Java
# C++
print(isinstance(title,Iterable))
# True
print(isinstance(title,Iterator))
# False

  2,元组(tuple)

# 元组teple是可迭代对象,但是不是迭代器
title = ('Python','Java','C++')
for i in title:
    print(i)
# Python
# Java
# C++
print(isinstance(title,Iterable))
# True
print(isinstance(title,Iterator))
# False

  3,字典(dict)

  注:此处打印的字典中的key而不是value

# 字典是可迭代对象,但是不是迭代器
title = {'Python':3,'Java':1.9,'C++':2}
for key in title:
    print(key)
# Python
# Java
# C++
print(isinstance(title,Iterable))
# True
print(isinstance(title,Iterator))
# False

  4,集合(set)

# 集合set是可迭代对象,但是不是迭代器
title = {'Python','Java','C++'}
for i in title:
    print(i)
# Python
# Java
# C++
print(isinstance(title,Iterable))
# True
print(isinstance(title,Iterator))
# False

  5,字符串(str)

# 字符串str是可迭代对象,但是不是迭代器
title = 'abc'
for i in title:
    print(i)
# a
# b
# c
print(isinstance(title,Iterable))
# True
print(isinstance(title,Iterator))
# False

  二,可迭代对象(Iterable)

  【简述】:可迭代对象就是可以被迭代获取的对象。

  【特点】: Iterable定义了绝返回迭代器的__iter__()方法

  【举例】:

# list是可迭代对象
title = ['Python','Java','C++']
print(isinstance(title,Iterable))
# 可迭代对象的iter方法返回一个迭代器
a = iter(title)
print(next(a))
print(next(a))
print(next(a))
# next完毕再次next因为没有值所以抛出StopIteration异常
# print(next(a))
# StopIteration

  如果我们写出以下代码

for elem in [1,2,3]:
    print(elem)

  则实际内部运算过程是这样,列表x是一个可迭代对象,在for循环中进过iter()方法变为迭代器,然后遍历x实际就是内部调用elem = next(x)

   三,迭代器(Iterator)

  【简述】:迭代器是一个带状态的对象。之所以说是带状态的对象是因为迭代器内部持有一个状态,该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。迭代器可以通过next()方法来迭代获取下一个值。

  【特点】:

  ①Iterator实现了__iter__()和__next__()方法

  ②迭代器不会一次性把所有元素加载到内存,而是需要的时候才返回结果(不同于容器)

  【举例】:和上面例子一样,下面的a就是一个迭代器,和可迭代对象title不同,a可以通过next(a)来逐个获取其中的每个元素

# list是可迭代对象
title = ['Python','Java','C++']
print(isinstance(title,Iterable))
# 可迭代对象的iter方法返回一个迭代器
a = iter(title)
print(next(a))
print(next(a))
print(next(a))
# next完毕再次next因为没有值所以抛出StopIteration异常
# print(next(a))
# StopIteration

  如果使用next(title)则会报TypeError错误,显示列表对象不是一个迭代器

# 不是迭代器使用next方法会报TypeError错误
# next(title)
# TypeError: 'list' object is not an iterator

  迭代器每次调用next()方法的时候做两件事:

  1,为下一次调用next()方法修改状态

  2,生成当前调用的返回结果

 

原文地址:https://www.cnblogs.com/minseo/p/15357586.html