zoukankan      html  css  js  c++  java
  • 课时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课后习题及答案

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

  • 相关阅读:
    调用Mapreduce,org.apache.hadoop.hbase.mapreduce处理hbase问题
    mysql用视图和事件实现数据间隔插入数据到表
    mysql自定义函数实现数据正则处理
    ambari安装Zeppelin Notebook提示ES源找不到问题解决
    IDEA 进行编译代码的时候,报错误Error:scalac: IO error while decoding .* with GBK
    Linux最大线程数限制及当前线程数查询
    rhel log 日志时间戳时间不对更改方法
    usb禁用验证
    CentOS 7 下挂载NTFS文件系统并实行开机自动挂载
    linux 判定那块网卡为eth0 eth0对应的物理网卡闪灯30秒
  • 原文地址:https://www.cnblogs.com/DC0307/p/9538168.html
Copyright © 2011-2022 走看看