Python内置函数-迭代、生成器相关

发布于 2020-05-15  637 次阅读


  • iter
  • next
  • range

iter(object[, sentinel])

返回一个迭代器对象。根据有无第二个参数,对第一个参数的解释相差很大。没有第二个参数,object必须是一个支持迭代协议(__iter__()方法)的容器对象,或者它必须支持序列协议(从 0开始的整数参数的__getitem__() 方法)。如果它不支持这些协议任何一个,将引发TypeError。如果给出第二个参数sentinel,那么object必须是一个可调用的对象。这种情况下创建的迭代器将在每次调用时不带参数调用object的__next__()方法;如果返回的值等于sentinel,将引发StopIteration,否则返回这个值。

>>> a=iter('abcde')
>>> next(a)
'a'
>>> next(a)
'b'
>>> next(a)
'c'
>>> next(a)
'd'
>>> next(a)
'e'
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

第二个参数,读取到特定参数

class A:
    dataList = [1, 2, 3, 4, 5, 6, 7]
    index = 0

    def __call__(self, *args, **kwargs):
        item = self.dataList[self.index]
        self.index += 1

        return item

    def __iter__(self):
        self.i = iter(self.dataList)

        return self.i


for item in iter(A(), 6): # 每一次迭代都会调用一次__call__方法,当__call__返回值等于6停止迭代
    print('item------------------------------', item)

item------------------------------ 1
item------------------------------ 2
item------------------------------ 3
item------------------------------ 4
item------------------------------ 5

next(iterator[, default])

通过调用__next__()方法从迭代器中检索下一个项目。如果有default参数,在迭代器迭代完所有元素之后返回该参数;否则抛出StopIteration

>>> a=iter('abcde')
>>> next(a)
'a'
>>> next(a)
'b'
>>> next(a)
'c'
>>> next(a)
'd'
>>> next(a)
'e'
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> next(a,'f')
'f'

range(start, stop[, step]) 产生一个序列,默认从0开始

range实际上是Ranges和Sequence Types — list, tuple, range中描述的不可变序列类型,而不是函数

range 是一个生成器,他只用来存储数据的生成方式,而不直接存储数据
# 列表解析
sum([i for i in range(100000000)])# 内存占用大,机器容易卡死
 
# 生成器表达式
sum(i for i in range(100000000))# 几乎不占内存

迭代器、生成器后续会详细讲到。。。


一名测试工作者,专注接口测试、自动化测试、性能测试、Python技术。