一、可迭代对象与迭代器

1. 概念

  • 迭代
    迭代是指依次访问序列中的每个一元素,也称为遍历。
  • 可迭代对象-Iterable
    Iterable简单理解就是可以迭代的对象,主要有str,list,tuple,dict、set、generator等
  • 迭代器
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

2、通过for循环来迭代Iterable对象

  • 迭代字符串str
l = 'hello,python'
for e in l:
    print(e,end='')

输出:

hello,python
  • 迭代列表list
l = [1, 2, 3, 4, 5, 6]
for e in l:
    print(e, end=' ')
  • 迭代字典dict
    字典默认迭代的是key值
d = {'1': 'mike', '2': 'john', '3': 3}
for key in d:
    print(key)

【注】如果需要迭代value值的话可以使用d.values()生成一个Iterable,也可以通过d.items()同时迭代key,value


l = 'hello,python'
for i,e in enumerate(l):
    print(i,e,sep=':',end=' ')

输出:

0:h 1:e 2:l 3:l 4:o 5:, 6:p 7:y 8:t 9:h 10:o 11:n

3、常见的返回Iterable对象的函数



4、迭代器-Iterator



it = iter(['hello,world'])
print(next(it))
print(next(it))

输出:

hello,world
    print(next(it))
StopIteration

d = {'1': 'mike', '2': 'john', '3': 3}
key = d.keys()
print(isinstance(key,Iterable))
print(isinstance(iter(key),Iterator))

输出:

True
True

二、生成器-generator

如果元素序列可以按照某种算法推算出来,那我们可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator

1、通过类似于列表生成式的for循环创建列表生成器

g=(x for x in range(10) if x%2) # 注意此处是小括号

2、生成器可以通过for循环访问也可以通过next()函数访问

it = (x for x in range(3))
print(next(it))
for x in it:
    print(x)

3、通过定义函数,使用yield关键字创建复杂的生成器

例如:创建一个产生斐波拉契数列的生成器

def fib(n):
    if n < 0:
        return None
    count, a, b = 0, 0, 1
    while count < n:
        yield b
        a, b = b, a + b
        count = count + 1
    return None
for x in fib(10):
    print(x,end=' ')

输出:

1 1 2 3 5 8 13 21 34 55

4、生成器既是迭代器Iterator也是可迭代对象Iterable

例如:

g = (x for x in range(3))
print(type(g))
print(isinstance(g,Iterator))
print(isinstance(g,Iterable))

输出

<class 'generator'>
True
True

三、Iterable、Iterator、generator总结





g = iter([x for x in range(3)])
print(next(g))
for x in g:
    print(x)

输出0 1 2 而不是0 0 1 2

0 1 2

其通过next访问之后记住下次访问的位置是1,而不从重新从头开始访问