python——迭代(Iterations)和生成器(Generators)

参考:https://www.runoob.com/w3cnote/python-yield-used-analysis.html

迭代(Iterations)有关概念

可迭代对象(Iterable)

能提供迭代器的任意对象。

迭代器(Iterator)

只要定义了next(Python2) 或者__next__⽅法,它就是⼀个迭代器。

迭代(Iteration)

循环遍历(例如某个列表)的这个过程就是迭代。

生成器(Generators)

生成器也是一种迭代器,只能对其迭代一次。因为值是在运行时生成,而不是存入内存中。每次生成器的函数返回一个值,这样大大减少了内存。
生成器是一个特殊的程序,可以被用作控制循环的迭代行为,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。
**使用场景:**不想同⼀时间将所有计算出来的⼤量结果集分配到内存当中。
许多Python 2⾥的标准库函数都会返回列表,⽽Python 3都修改成了返回⽣成器,⽣成器占⽤更少的资源。
经典例子斐波那契数列的生成器(使用生成器):

def fibon(n):
    a = b = 1
    for i in range(n):
        yield a   #每次循环在这里暂停,
        a, b = b, a + b

for x in fibon(10):
    print(x)
'''结果
1
1
2
3
5
8
13
21
34
55
'''

经典例子斐波那契数列的生成器(未使用生成器):

def fibon(n):
    a = b = 1
    result = []
    for i in range(n):
        result.append(a)
        a, b = b, a + b
    return result

print(fibon(10))
'''结果
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
'''

注意:生成器的错误报警有’’StopIteration‘‘,但这个错误提示会出现在使用next()把数据反问完后,但使用for循环会自动捕捉该异常,执行停止。

next()

官方解释,大致意思:返回迭代器的下一项内容,如果default给定了,这个迭代器结束会使用这个值代替产生的StopIteration异常显示

next(...)
    next(iterator[, default])
    Return the next item from the iterator. If default is given and the iterator   is exhausted, it is returned instead of raising StopIteration.

数据的迭代处理

对于字符串,不能直接使用next()函数,但通过另一个内置函数iter,可以将对象返回一个迭代器对象,就可以使用next()函数了,见下例:

import os
n_iterator='This is not iterator'
my_iterator=iter(n_iterator)
print(next(my_iterator))
print(next(my_iterator))  #返回迭代器的下一个项目
print(my_iterator.__next__())#和上面功能一样
'''结果
T
h
i
'''

你可能感兴趣的:(python)