import collections.abc
from collections.abc import Iterable, Iterator
import collections
# collections.abc是Python内建的一个集合模块,提供了许多有用的集合类(dict、list、set、tuple)。
# iterable:可迭代的;可迭代对象;可遍历对象
# iterable(可迭代对象) 和 iterator(迭代器)是两个概念
# 生成器是一种特殊的迭代器;列表、元组、字符串、字典、迭代器都是可迭代对象,且都包含迭代器。
# 每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
'''
迭代器与生成器的异同:
1.生成器是一种特殊的迭代器,拥有迭代器的所有特性;
2.迭代器使用return返回值而生成器使用yield返回值,每一次对生成器执行next()都会在yield处暂停;
3.迭代器和生成器虽然都执行next()方法时返回下一个元素,迭代器在实例化前就已知所有元素,但是采用惰性计算机制,
共有多少元素,下一个元素是什么都是未知的,每一次对生成器对象执行next()方法才会产生下一个元素。'''
'''在Python中,我们把所有可以迭代的对象统称为可迭代对象,有一个类专门与之对应:Iterable。
所以,要判断一个类是否可迭代,只要判断是否是Iterable类的实例即可。
整型、布尔不可迭代,字符串、列表、字典、元组可迭代。'''
print(isinstance(2, collections.abc.Iterable)) # False
print(isinstance(True, collections.abc.Iterable)) # False
print(isinstance((1, 2, 3), collections.abc.Iterable)) # tuple
print(isinstance({1: 'a', 2: 'b', 3: 'c', 4: 'd'}, Iterable)) # dict
print(isinstance({1, 2, 3, 5, 5, 3, 2}, Iterable)) # set
print(isinstance([1, 2, 3, 4, 5], Iterable)) # list 列表是可迭代对象,但不是迭代器
print(isinstance([1, 2, 3], Iterator)) # False 列表不是迭代器
'''迭代器一定是可迭代对象,但可迭代对象不一定是迭代器。
iter()函数可以让具备迭代性的对象变成迭代器(可使用next()函数访问)'''
print(isinstance(iter([1, 2, 3]), Iterator)) # True
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))
# Counter:字典的子类,提供了可哈希对象的计数功能
print(collections.Counter('python')) # 统计字符出现的次数
print(collections.Counter('hello world hello lucy'.split())) # 统计单词个数
python迭代器
最新推荐文章于 2024-04-24 11:57:57 发布