迭代

作者: ffacs 分类: Python 发布时间: 2020-03-16 13:09

迭代

如果给定一个listtuple,我们可以通过for循环来遍历这个listtuple,这种遍历我们称为迭代(Iteration),在Python中,迭代是通过for ... in来完成的。

迭代字典

list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代。默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()

迭代字符串

字符串也是可迭代对象。

迭代list

Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身。

列表生成器

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

[x*x for x in range(11)]就生成了[1,4,9,....100]

[x*x for x in range(11) if x>5] ->[36, 49, 64, 81, 100]

[x if x<3 else -x for x in range(6)]->[0, 1, 2, -3, -4, -5]

[[x,y] for x in [1,2] *for* y in [1,2]]-> [[1, 1], [1, 2], [2, 1], [2, 2]]

生成器

生成器里面装了用来生成一个list的算法,这样就不必创建完整的list,从而节省大量的空间,一边循环,一边计算,在循环的过程中不断推算出后续的元素。

要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator。

(x*x for x in range(11)) -><generator object <genexpr> at ...>

如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

yield

yield语句挂起该函数并向调用者发送回一个值,但是,保留足够的状态以使得函数能够从它离开的地方继续。当继续时,函数在上一个yield返回后立即继续执行。函数中使用yield语句会返回一个生成器对象(返回引用)。

def triangles():
    x = [1]
    while True:
        yield x
        x=[1]+[x[i-1]+x[i] for i in range(1,len(x))]+[1]
n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 10:
        break

for t in results:
    print(t)

生成器生成杨辉三角

迭代器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

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

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

from collections import Iterable
isinstance([], Iterable) // True

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

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

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数

发表评论

电子邮件地址不会被公开。 必填项已用*标注