01-可迭代对象及其检测方法

目标

  • 知道什么是可迭代对象
  • 能够使用isinstance() 检测对象是否可迭代

迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

1. 可迭代对象

我们已经知道可以对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代

image-20180822151610751

# for循环可迭代的对象有: list tuple str dict set range
# 列表可以迭代
for value in [1,2,3]:
    print(value)

print(20*"--")
# 元组可以迭代
for value in (1,2,3):
    print(value)

print(20*"--")
# 字符串可以迭代
for value in "hello":
    print(value)

print(20*"--")
# range() 可以迭代
for value in range(3):
    print(value)

print(20*"--")
# 字典可以迭代(得到key)
for value in {"a": 100, "b": 1000}:
    print(value)

print(20*"--")

我们把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable)

但是,是否所有的数据类型都可以放到for...in...的语句中,然后让for...in...每次从中取出一条数据供我们使用,即供我们迭代吗?

2. 如何判断一个对象是否可以迭代

可以使用 isinstance() 判断一个对象是否是 Iterable 对象:

from collections import Iterable
# 使用isinstance() 函数检测某个对象是否是一个可迭代的对象

# 列表是可迭代对象
result = isinstance([1,2], Iterable)
print(result)

# 元组是可迭代对象
result = isinstance((1,2), Iterable)
print(result)

# 字符串是可迭代对象
result = isinstance("hello", Iterable)
print(result)

# 字典是可迭代对象
result = isinstance({"a": 10, "b": 100}, Iterable)
print(result)

# 数字不是可迭代对象
result = isinstance(100, Iterable)
print(result)

# 定义类
class MyClass(object):
    pass

# 创建对象
c1 = MyClass()
# 对象c1不是可迭代对象
result = isinstance(c1, Iterable)
print(result)

运行结果:

True
True
True
True
False
False

Process finished with exit code 0

3. 可迭代对象的本质

可迭代对象的本质就是:

一个对象所属的类中含有 __iter__() 方法,该对象就是一个可迭代对象。

from collections import Iterable
# 使用isinstance() 函数检测某个对象是否是一个可迭代的对象


class MyClass(object):
    # 可迭代对象的本质是,类中是否定义了 __iter__() 方法
    def __iter__(self):
        return self


c1 = MyClass()
# 对象c1不是可迭代对象
result = isinstance(c1, Iterable)
print(result)

image-20180704163108816