Python 中可迭代对象、迭代器和生成器的判断总结

Python 中可迭代对象、迭代器和生成器的判断总结

一、判断方法

1. 可迭代对象和迭代器

  以下任何一种方法都可以区分开可迭代对象和迭代器:

  • 是否有 __next__() 方法。可迭代对象没有__next__() 方法,而迭代器有。
  • 通过 collections 模块的 Iterator 属性判断。若 obj 为迭代器,isinstance(obj, Iterator) 为 True;若 obj 仅为可迭代对象,isinstance(obj, Iterator) 为 False。

2. 迭代器和生成器

  以下任何一种方法都可以区分开迭代器和生成器:

  • 实现时是否使用了 yield 语句。生成器本质上是一个函数,使用 yield 语句来实现。
  • 通过 collections 模块的 Generator 属性判断。若 obj 为生成器,isinstance(obj, Generator) 为 True;若 obj 仅为迭代器,isinstance(obj, Generator) 为 False。
  • 使用 type 函数。生成器使用 type(obj) 返回的结果是 ‘generator’,若 obj 仅为迭代器,返回的结果不是如此。

二、区别和相同点

1. 可迭代对象和迭代器

1.1 区别
  • 可迭代对象不一定是迭代器,但是迭代器一定是可迭代对象。
  • 可迭代对象支持 __iter__() 方法,而迭代器支持 __iter__() 方法和 __next__() 方法。
  • 可迭代对象能逐一返回其成员项,而且次数无限制,而迭代器表示一个数据流,含义类似于指针,总是指向当前位置并知道下一个位置。迭代器不断使用 next() 函数调用时,从首项开始不断返回下一项数据直至耗尽(不能回退),耗尽后抛出 Stopiteration 异常,无法再次访问元素。若要再次访问,需要重新定义迭代器。
1.2 相同点

  由于两者都是可迭代对象,相同点即为可迭代对象的特点:

  • isinstance(obj, Iterable) 的结果均为 True。通过 collections 模块的 Iterable 属性判断。
  • 都可以使用 for x in X 语句取出迭代的内容。
  • 使用 iter() 函数可以将可迭代对象转化为迭代器,使用 list() 函数可以将迭代器转化为可迭代对象。

2. 迭代器和生成器

2.1 区别
  • 迭代器不一定是生成器,生成器一定是迭代器。
  • 迭代器是访问容器的一种方式,也就是说容器已经出现,因此迭代器针对的是已经存在的数据序列。而生成器则是自己生成元素的,一边循环一边计算,完整的序列可能并不存在,而是在需要的时候才计算出来。
  • 在实现上,写一个迭代器需要实现 __next__() 和 __iter__() 函数,而实现生成器时,用 yield 就能实现。生成器实现较为简单。
  • 生成器本质上是一个函数,迭代器本质上是一个类。
2.2 相同点
  • 生成器实现了迭代器的接口,因此两者均满足迭代器特性。
  • 两者都是一次性的,均只能遍历一遍(间接遍历也算,例如 list(obj) 算是迭代器间接遍历了一遍),若要再次访问,需要重新定义对象。

三、常见的可迭代对象和迭代器

1. 是可迭代对象但不是迭代器

  • 列表(list)。
  • 字典(dict)。
  • 元组(tuple)。
  • 集合(set)。
  • 字符串(str)。
  • 范围(range)。
  • array 数组(numpy.ndarray)。
  • DataFrame 对象(pandas.core.frame.DataFrame)。
  • DataLoader 对象(torch.utils.data.dataloader.DataLoader)。

2. 是迭代器但不是生成器

  • enumerate(obj)(枚举,obj 可以是可迭代对象、迭代器、生成器)。
  • zip(把可迭代对象打包成元组)。
  • filter(filter 函数对可迭代对象操作)。
  • map(map 函数对可迭代对象操作)。

3. 生成器

  • KFold().split()、StratifiedKFold().split()、GroupKFold().split() 和 StratifiedGroupKFold().split() 函数的返回值。

参考资料

  1.https://blog.csdn.net/PSpiritV/article/details/124542208
  2.https://blog.csdn.net/Cobrander2_0/article/details/127343089
  3.https://blog.csdn.net/qq_39478403/article/details/105840170
  4.https://blog.csdn.net/panc_guizaijianchi/article/details/117515913
  5.https://www.xiaohongshu.com/explore/63ee196500000000130125b1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值