首页 > 编程语言 >python的迭代对象和迭代器

python的迭代对象和迭代器

时间:2023-01-12 16:33:08浏览次数:65  
标签:迭代 Iterator python 对象 print isinstance Iterable

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

以上就是迭代对象与迭代器的相关内容。来自:https://mp.weixin.qq.com/s?__biz=MzA5NjgzODM3Ng==&mid=2650534149&idx=2&sn=da8068726fac36916e3dc946510ca6f8&chksm=88a6a682bfd12f94f1758ce97a5ef6000d44baef0dbb86e6c035ca96b4a75bc7cf087869a492&scene=27

标签:迭代,Iterator,python,对象,print,isinstance,Iterable
From: https://www.cnblogs.com/aleiyoy/p/17047039.html

相关文章