#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
    迭代器

    我们已经知道，可以直接作用于for循环的数据类型有以下几种：

    一类是集合数据类型，如list、tuple、dict、set、str等；

    一类是generator，包括生成器和带yield的generator function。

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

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

'''

from collections import Iterable

flag = isinstance([], Iterable)
print(flag) # True

flag = isinstance({}, Iterable)
print(flag) # True

flag = isinstance('abc', Iterable)
print(flag) # True

flag = isinstance((x for x in range(10)), Iterable)
print(flag) # True

flag = isinstance(100, Iterable)
print(flag) # False



'''
 而生成器不但可以作用于for循环，还可以被next()函数不断调用并返回下一个值，直到最后抛出StopIteration错误表示无法继续返回下一个值了。

可以被next()函数调用并不断返回下一个值的对象称为迭代器：Iterator。

可以使用isinstance()判断一个对象是否是Iterator对象：

'''

from collections import Iterator
flag = isinstance((x for x in range(10)), Iterator)
print(flag)
flag = isinstance([], Iterator)
print(flag)
flag = isinstance({}, Iterator)
print(flag)
flag = isinstance('abc', Iterator)


flag = isinstance((x for x in range(10)), Iterator)
print(flag)
flag = isinstance([], Iterator)
print(flag)
flag = isinstance({}, Iterator)
print(flag)
flag = isinstance('abc', Iterator)
print(flag)