iOS开发人员如何学习Python编程14-函数5

162 阅读2分钟

这是我参与11月更文挑战的14天,活动详情查看:2021最后一次更文挑战

迭代器

迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来。迭代提供了一种通用的不依赖索引的迭代取值方式。

可以用for循环遍历的对象都是可迭代对象:

  • strlisttupledictset等都是可迭代对象;
  • generator,包括生成器和带yield的生成器函数。 判断是否可迭代:

除了看内置是否含有__iter__方法来判断该对象是否是一个可迭代的对象之外,我们还可以使用 isinstance() 判断一个对象是否是 Iterable 对象:

  • isinstance():用来判断对象是否是相应类型,与type()类似。
from collections import Iterable,Iterator
print(isinstance('abc',Iterable))   # True
print(isinstance([1,2,3,4],Iterable))   # True
print(isinstance(123,Iterable))     # False

迭代器对象

  • 有内置的__next__()方法的对象,执行该方法可以不依赖索引取值;
  • 有内置的__iter__()方法的对象,执行迭代器的__iter__()方法得到的依然是迭代器本身。 ⚠️注意: 可迭代对象不一定是迭代器:
from collections import Iterable,Iterator
li = [1,2,3,4]
print(isinstance(li,Iterator)) # False

Iterator

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

  • Iterator。 那我们可以通过iter()方法将可迭代的对象,转为迭代器:
li = [1,2,3,4]
lis = iter(li)
print(type(lis))    # <class 'list_iterator'>

⚠️注意: 迭代器不可以通过下标取值,而是使用__next__()或者next()。但是只要超出范围则直接报错StopIteration

print(lis[0])    # 报错 not subscriptable
print(lis.__next__())
print(lis.__next__())
print(lis.__next__())
print(lis.__next__())

print(next(lis))
print(next(lis))
print(next(lis))
print(next(lis))

next()只能顺延调用,不能往前。

可迭代对象迭代器区别

  • 可用于for循环的都是可迭代类型;
  • 作用于next()都是迭代器类型;
  • listdictstr等都是可迭代的但不是迭代器,因为next()函数无法调用它们。可以通过iter()函数将它们转为迭代器;
  • pythonfor循环本质就是通过不断调用next()函数实现的。

生成器迭代器

  • 生成器能做到迭代器能做的所有事;
  • 因为生成器自动创建了iter()next()方法,生成器显得简洁,而且高效。