课时48:魔法方法:迭代器

目录:

  一、迭代器

  二、课时48课后习题及答案

 

*************

一、迭代器

*************

迭代的意思类似于循环,每一次重复的过程被称为一次迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。提供迭代方法的容器称为迭代器,通常接触的迭代器有序列(列表、元组、字符串)还有字典也是迭代器,都支持迭代的此操作。

举个例子,通常使用for语句来进行迭代:

>>> for i in "FishC":
    print(i)

    
F
i
s
h
C

 字符串就是一个容器,同时也是一个迭代器,for语句的作用就是触发这个迭代器的迭代功能,每次从容器里依次拿出一个数据,这就是迭代操作。

字典和文件也是支持迭代操作的:

>>> links = {'1':'111111',\
         '2':'222222',\
         '3':'333333',\
         '4':'444444'}
>>> for each in links:
    print('%s->%s'%(each,links[each]))

    
1->111111
2->222222
3->333333
4->444444

关于迭代,Python提供了两个BIF:

  • iter()
  • next()

对于一个容器对象调用iter()就得到它的迭代器,调用next()迭代器就会返回下一个值,然后怎么结束呢?如果迭代器没有值可以返回了,Python会抛出一个StopIteration的异常:

>>> string = "FishC"
>>> it = iter(string)
>>> next(it)
'F'
>>> next(it)
'i'
>>> next(it)
's'
>>> next(it)
'h'
>>> next(it)
'C'
>>> next(it)
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    next(it)
StopIteration

所以利用这两个BIF,可以分析出for语句其实是这样工作的:

>>> string = "FishC"
>>> it = iter(string)
>>> while True:
    try:
        each = next(it)
    except StopIteration:
        break
    print(each)

    
F
i
s
h
C

那么关于实现迭代器的魔法方法有两个:

  • __iter__()
  • __next__()

一个容器如果是迭代器,那就必须实现__iter__()魔法方法,这个方法实际上就是返回迭代器本身。接下来重点是要实现的是__next__()魔法方法,因为它决定了迭代的规则。简单举个例子:

class Fibs:
    def __init__(self):
    self.a = 0
    self.b = 1
    def __iter__(self):
    return self
    def __next__(self):
    self.a, self.b = self.b, self.a + self.b
    return self.a
>>> fibs = Fibs()
>>> for each in fibs:
    if each < 20:
        print(each)
    else:
        break

    
1
1
2
3
5
8
13

好了,这个迭代器的唯一亮点就是没有终点,所以如果没有跳出循环,它会不断迭代下去。那可不可以加一个参数,用于控制迭代的范围呢?

>>> fibs = Fibs()
>>> for each in fibs:
    print(each)

    
1
1
2
3
5
8
13
>>> fibs = Fibs(10)
>>> for each in fibs:
    print(each)

    
1
1
2
3
5
8

是不是很容易呢?就是那么回事的啦。

 

 

*******************************

二、课时48课后习题及答案

*******************************

 

posted @ 2018-08-26 18:55  那是个好男孩  阅读(334)  评论(0编辑  收藏  举报