Python的迭代对象和迭代器

Python中迭代对象(Iterable)是非常核心的内容, 今天就和大家分享一下, 什么是迭代对象和迭代器。
简单来说迭代就等于循环, 那么迭代对象就是可以用for循环的对象.一句话记忆, 可以直接用于for循环的数据类型, 就是迭代对象.

常见的可迭代对象包括:

一、集合数据类型, 如元组(tuple), 列表(list), 字典(dict), 集合(set), 字符串(str)等

二、生成器generator, 包括生成器和带yield的generator function.

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

可迭代对象的实质: 在语法层面,如果一个对象实现了__iter__函数,那么这个对象就是可迭代对象.

迭代对象(Iterable)并不是指某种特定的数据类型或数据结构,它是指存储元素的容器对象,且容器中的元素允许使用__iter__( )函数或__getitem__( )函数进行访问

__iter__函数的作用是让对象可以用for … in循环遍历

getitem( )方法是让对象可以通过“实例名[index]”的方式访问实例中的元素.

如何判断数据是否为可迭代对象呢?

判断时可以使用 isinstance(数据类型, Iterable) 判断一个对象是否是Iterable对象

from collections import Iterable

print(isinstance('qftest', Iterable)) # True

print(isinstance((),Iterable)) # True

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

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

print(isinstance((x for x in range(6)), Iterable)) # True

print(isinstance(10086, Iterable)) # False

通过上面例子可以看出,Python中的内置类型元组(tuple), 列表(list),字典(dict),字符串(str)等对象都是可迭代的.

接下来, 我用自定义一个类, 看一下类是否为可迭代对象.

class ListDemo:

def __init__(self):

self.listnum = []

def add(self, n):

self.listnum.append(n)


list = ListDemo()

list.add(10)

list.add(20)

print(isinstance(list, Iterable)) # False

我们自定义了一个类ListDemo,由于这个类没有实现iter方法,所以这个类的实例不是可迭代对象。

那么什么是迭代器呢?

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

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

from collections import Iterator

print(isinstance('qftest', Iterator)) # False

print(isinstance((),Iterator)) # False

print(isinstance([],Iterator)) # False

print(isinstance({},Iterator)) # False

print(isinstance((x for x in range(6)), Iterator)) # True

print(isinstance(10086, Iterator)) # False

生成器都是Iterator对象, 但元组(tuple), 列表(list), 字典(dict), 字符串(str)虽然是Iterable, 但却不是Iterator.

如何将元组(tuple), 列表(list), 字典(dict), 字符串(str)等Iterable转为Iterator呢?

使用用iter() 函数即可。

print(isinstance(iter([]),Iterator)) # True

print(isinstance(iter({}),Iterator)) # True

print(isinstance(iter(()),Iterator)) # True

print(isinstance(iter('qftest'),Iterator)) # True

大家可能会有疑问, 为什么元组(tuple), 列表(list), 字典(dict), 字符串(str)等数据类型不是 迭代器呢(Iterator), 是迭代对象又不是迭代器,云里雾里的, 我们接着往后看.

python中的Iterator对象表示的是一个数据流, Iterator对象可以被next()函数调用并不断返回下一个值直到没有数据返回最后抛出StopIteration错误提示。

可以将该数据流当做一个序列, 但我们不知道该序列的长度, 只能不断通过next() 函数实现按需计算下一个数据.

所以Iterator的计算是惰性的. 只有在需要返回下一个数据时, 它才会做计算.

Iterator表示一个无限数量的元素容器.

凡是可作用于for循环的对象 都是Iterable对象

凡是可作用域next() 函数的对象都是 Iterator 类型, 它们表示一个惰性计算的序列.

集合数据类型 list, tuple, dict, str等是Iterable但不是Iterator, 不过可以通过iter() 函数获得一个Iterator对象.

例如: python中的for循环底层就是通过不断的进行调用next() 函数实现的.

for i in [10, 20, 30, 40,50]:

print(i)

完全等价于:

先将列表数据 转换为Iterator迭代器

i = iter([10,20,30,40,50])

再循环

while True:

try:

# 获取下一个值

x = next(i)

except StopIteration:

# 没有数据 捕获StopIteration异常

break

以上就是迭代对象与迭代器的相关内容.

最后感谢每一个认真阅读我文章的人,下面这个网盘链接也是我费了几天时间整理的非常全面的,希望也能帮助到有需要的你!

在这里插入图片描述

这些资料,对于想转行做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助……

如果你不想一个人野蛮生长,找不到系统的资料,问题得不到帮助,坚持几天便放弃的感受的话,可以点击下方小卡片加入我们群,大家可以一起讨论交流,里面会有各种软件测试资料和技术交流。

敲字不易,如果此文章对你有帮助的话,点个赞收个藏来个关注,给作者一个鼓励。也方便你下次能够快速查找。

自学推荐B站视频:

零基础转行软件测试:38天自学完软件测试,拿到了字节的测试岗offer,堪称B站最好的视频!

自动化测试进阶:已上岸华为,涨薪20K,2022最适合自学的python自动化测试教程,自己花16800买的,无偿分享

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值