import collections.abc
from collections.abc import Iterable, Iterator
import collections
'''
迭代器与生成器的异同:
1.生成器是一种特殊的迭代器,拥有迭代器的所有特性;
2.迭代器使用return返回值而生成器使用yield返回值,每一次对生成器执行next()都会在yield处暂停;
3.迭代器和生成器虽然都执行next()方法时返回下一个元素,迭代器在实例化前就已知所有元素,但是采用惰性计算机制,
共有多少元素,下一个元素是什么都是未知的,每一次对生成器对象执行next()方法才会产生下一个元素。'''
'''在Python中,我们把所有可以迭代的对象统称为可迭代对象,有一个类专门与之对应:Iterable。
所以,要判断一个类是否可迭代,只要判断是否是Iterable类的实例即可。
整型、布尔不可迭代,字符串、列表、字典、元组可迭代。'''
print(isinstance(2, collections.abc.Iterable))
print(isinstance(True, collections.abc.Iterable))
print(isinstance((1, 2, 3), collections.abc.Iterable))
print(isinstance({1: 'a', 2: 'b', 3: 'c', 4: 'd'}, Iterable))
print(isinstance({1, 2, 3, 5, 5, 3, 2}, Iterable))
print(isinstance([1, 2, 3, 4, 5], Iterable))
print(isinstance([1, 2, 3], Iterator))
'''迭代器一定是可迭代对象,但可迭代对象不一定是迭代器。
iter()函数可以让具备迭代性的对象变成迭代器(可使用next()函数访问)'''
print(isinstance(iter([1, 2, 3]), Iterator))
print(next(iter([1, 2, 3])))
print(next(iter([1, 2, 3])))
print(next(iter([1, 2, 3])))
list1 = iter([5, 6, 7])
print(next(list1))
print(list1.__next__())
print(next(list1))
'''只要一个对象定义了__iter__()方法,那么它就是可迭代对象。'''
class A:
def __iter__(self):
pass
print('A类是可迭代对象吗:', isinstance(A(), Iterable))
'''迭代器是对可迭代对象的升级,一个对象定义了__iter__()方法,那么它就是可迭代对象,
如果一个对象同时实现了__iter__()和__next()__()方法,那么它就是迭代器。'''
class B:
def __iter__(self):
pass
def __next__(self):
pass
print('B是可迭代对象吗:', isinstance(B(), Iterable))
print('B是迭代器吗:', isinstance(B(), Iterator))
print(collections.Counter('python'))
print(collections.Counter('hello world hello lucy'.split()))
