迭代器

一、引入迭代器

 有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几种方式?
  1. 索引取值l[0],
  2. 用for循环来取值

两种取值区别:
  索引取值l[0],其次我们是不是还可以用for循环来取值
  用for循环来取值,我们把每一个值都取到,不需要关心每一个值的位置,因为只能顺序的取值,并不能跳过任何一个直接去取其他位置的值

二、为什么要有迭代器

迭代: 可以将某个数据集内的数据“一个挨着一个的取出来”,就叫做迭代。

迭代器: 不依赖于索引的迭代方式,这就是迭代器。对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式

三、可迭代对象和迭代器对象

# 1. 可迭代对象:指的是内置有__iter__方法的对象,即obj.__iter__,如下
'hello'.__iter__
(1,2,3).__iter__
[1,2,3].__iter__
{'a':1}.__iter__
{'a','b'}.__iter__
open('a.txt').__iter__


# 2. 迭代器对象:可迭代对象执行obj.__iter__()得到的结果就是迭代器对象,而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象

文件类型是迭代器对象
open('a.txt').__iter__()
open('a.txt').__next__()

# 迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

四、for循环迭代器

4.1 while True循环的问题

# 直接用while True循环在迭代器对象中通过__iter__()取值,终究会有取空的时候,取空再取值,会报StopIteriation异常

ls = [1,2,3,4,5]
iter_ls = ls.__iter__()
while True:
    try:
        print(iter_ls.__next__())
    except StopIteration:
        print('取完了')
        break

4.2 for循环原理

for循环就是对while循环去迭代器对象的封装

for循环的工作原理:

for k in obj:
pass

1. 先调用in后面那个对象的__iter__方法,得到一个迭代器对象

2. 迭代器调用__next__方法进行取值,将得到的返回值赋值给变量名k

3. 循环往复直到__next__取值,抛出异常,for会自动捕捉异常StopIteration然后结束循环

五、枚举对象

# 给可迭代对象及迭代器对象添加迭代索引

s = 'abc'
for k in enumerate(s):
    print(k,end=' ')   # (0, 'a') (1, 'b') (2, 'c') 

dic = {'a': 1, 'b': 2, 'c': 3}
obj = enumerate(dic)
print(obj.__next__())    # (0, 'a')

dic = {'a': 1, 'b': 2, 'c': 3}
for i,k_v in enumerate(dic.items()):
    k,v = k_v
    print(k_v,end='')        # ('a', 1)('b', 2)('c', 3)
    print(i,k,v,end='     ')   # 0 a 1     1 b 2     2 c 3

 

posted on 2020-05-15 23:24  软饭攻城狮  阅读(76)  评论(0编辑  收藏  举报

导航