转载的老板请注明出处:http://blog.youkuaiyun.com/cc_xz/article/details/78692064万分感谢!
在本篇中,你将了解到:
1.可迭代对象、迭代器与生成器。
2.如何进行反向迭代。
3.对迭代器进行切片。
4.同时迭代多个可迭代对象。
可迭代对象、迭代器与生成器:
容器:
容器是用来存储元素的一种数据结构,容器将所有的数据都保存在内存中,在Python中的典型容器有:list、deque、set、dict、OrderedDict等。容器很容易理解,它就是生活中的箱子、房间等一切可以盛放其他物品的容器。
通过判断对象是否包含某元素来确定它是否是一个容器:
assert 1 in [1, 2, 3, 4] # assert是Python中的断言,断言是表达式的返回结果比如为True。
assert 4 not in [1, 2, 3] # 如果表达式的返回结果为False,则报出AssertionError异常。
assert 1 in {
1, 2, 3, 4, 5} # 例如第五行中,由于元组中并不存在1,所以报出异常。
assert 4 not in {
1, 2, 3, 5} # 而这些代码表明,list、set、tuple都是容器。
assert 1 in (12, 3, 4, 5) # 因为他们都包含了多个不同的元素。
assert 4 not in (1, 2, 3, 5)
输出结果为:
Traceback (most recent call last):
File "D:/Python/Code/Demo01/Demo.py", line 5, in <module>
assert 1 in (12,3,4,5)
AssertionError
可迭代对象:
大部分的容器都是可迭代的,但还有一些对象也是可以迭代的,例如文件对象和管道对象等。一般而言容器所存储的元素是优先的,同样的,可迭代对象也可以用来表示一些包含有限元素的数据结构。任何对象都可以成为可迭代对象,不一定必须是基本数据结构,只要这个对象可以返回一个iterator即可。
x = [1,2,3,4,5]
y = iter(x) #iter()函数用于生成一个迭代器。
# print(next(x)) #默认list是可迭代对象,而不是迭代器对象。
print(next(y)) #而y则是使用iter()函数所生成的迭代器对象。
print(type(x))
print(type(y))
输出结果为:
1
<class 'list'>
<class 'list_iterator'>
值得注意的是,这里是x是可迭代对象,而y是迭代器,迭代器可以从可迭代对象中获取值。在可以进行迭代的类中,一般会实现__iter__()和__next__()两个函数。
x = [1,2,3,4,5]
for x_ in x :
pass
当执行上述for循环中的代码时,实际上是在执行:
即:将一个可迭代对象调用iter()函数转换成一个迭代器,再调用这个迭代器的netx()函数,将其中的元素一一解析出来。
迭代器(Iterators):
任何具有__next__()函数的对象都是迭代器,对迭代器调用next()函数可以获取下一个元素。而至于该对象如何产生这个值,同它能否成为一个迭代器并没有关系(只有一个元素)。所以迭代器本质上是一个生产元素的工厂,每次向迭代器请求下一个值时,迭代器都会进行计算并返回相应的元素。
为了更好的理解迭代器的内部结构,首先来定义一个生成斐波拉契数的迭代器(菲波拉契数是值在一个数值的序列中,后面一个数的值等于前面两个数的和)
class fib<