鱼C论坛

 找回密码
 立即注册
查看: 1341|回复: 11

[已解决]关于48课时课后题

[复制链接]
发表于 2018-5-15 15:37:10 | 显示全部楼层 |阅读模式
3鱼币
class MyRev:
    def __init__(self,data):
        self.data = data
        self.index = len(data)


    def __iter__(self):
        return self


    def __next__(self):
        while self.index:
            value = self.data[self.index]
            self.index = self.index - 1
            return value

            
请大神指教下最后一段为啥不对呢
最佳答案
2018-5-15 15:37:11
hi 索引超出范围引发(最后一位索引值是 len(data) -1 ),调整代码即可

  1. class MyRev:
  2.     def __init__(self,data):
  3.         self.data = data
  4.         self.index = len(data)


  5.     def __iter__(self):
  6.         return self


  7.     def __next__(self):
  8.         while self.index:
  9.             self.index = self.index - 1 #here
  10.             value = self.data[self.index]
  11.             
  12.             return value
复制代码

最佳答案

查看完整内容

hi 索引超出范围引发(最后一位索引值是 len(data) -1 ),调整代码即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-15 15:37:11 | 显示全部楼层    本楼为最佳答案   
hi 索引超出范围引发(最后一位索引值是 len(data) -1 ),调整代码即可

  1. class MyRev:
  2.     def __init__(self,data):
  3.         self.data = data
  4.         self.index = len(data)


  5.     def __iter__(self):
  6.         return self


  7.     def __next__(self):
  8.         while self.index:
  9.             self.index = self.index - 1 #here
  10.             value = self.data[self.index]
  11.             
  12.             return value
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-15 16:05:45 | 显示全部楼层
thexiosi 发表于 2018-5-15 15:54
hi 索引超出范围引发(最后一位索引值是 len(data) -1 ),调整代码即可

就是把while循环内的两行调下位置吗,为啥会超出索引范围呢?
我再看看,谢谢大神了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-15 16:09:39 | 显示全部楼层
月引流光 发表于 2018-5-15 16:05
就是把while循环内的两行调下位置吗,为啥会超出索引范围呢?
我再看看,谢谢大神了。

举个栗子 (注意序列最后一个元素的索引号)

>>> tmp = 'abcd'
>>> len(tmp)
4
>>> tmp[4]
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    tmp[4]
IndexError: string index out of range
>>> tmp[3]
'd'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-15 16:19:38 | 显示全部楼层
thexiosi 发表于 2018-5-15 15:37
hi 索引超出范围引发(最后一位索引值是 len(data) -1 ),调整代码即可

m = MyRev('我是小甲鱼')
>>> for i in m:
        print(i,end='')

       
鱼甲小是我NoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNone
大神能帮忙看下吗,又出了新问题,好多None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-15 16:20:28 | 显示全部楼层
thexiosi 发表于 2018-5-15 15:37
hi 索引超出范围引发(最后一位索引值是 len(data) -1 ),调整代码即可

m = MyRev('我是小甲鱼')
>>> for i in m:
        print(i,end='')

       
鱼甲小是我NoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNone
大神能帮忙看下吗,又出了新问题,好多None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-15 16:39:49 | 显示全部楼层
hi 需要增加StopIteration(),以便在迭代结束后跳出while循环,具体代码如下
  1. class MyRev:
  2.     def __init__(self,data):
  3.         self.data = data
  4.         self.index = len(data)


  5.     def __iter__(self):
  6.         return self


  7.     def __next__(self):
  8.         while self.index:
  9.             self.index = self.index - 1
  10.             value = self.data[self.index]
  11.             return value
  12.         if self.index == 0:
  13.             raise StopIteration()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-15 16:50:51 | 显示全部楼层
thexiosi 发表于 2018-5-15 16:39
hi 需要增加StopIteration(),以便在迭代结束后跳出while循环,具体代码如下

有一点不明白的是当随着迭代的进行,当self.index = 0 的时候while循环不是已经终止了吗,也不会再有返回值了啊,怎么会又出现None 呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-15 16:51:34 | 显示全部楼层
thexiosi 发表于 2018-5-15 16:09
举个栗子 (注意序列最后一个元素的索引号)

>>> tmp = 'abcd'

恩,这个我之前明白了,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-5-15 16:56:48 | 显示全部楼层
thexiosi 发表于 2018-5-15 16:39
hi 需要增加StopIteration(),以便在迭代结束后跳出while循环,具体代码如下

啊啊 ,这个也想明白了,正是由于self.index == 0 的时候不再循环,没有返回值了,所以当迭代的时候会有好多None. 谢谢大神的耐心解答了,太感谢了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-15 16:58:21 | 显示全部楼层
月引流光 发表于 2018-5-15 16:50
有一点不明白的是当随着迭代的进行,当self.index = 0 的时候while循环不是已经终止了吗,也不会再有返回 ...

好问题 :)

当self.index=0时,while循环终止,但是迭代器仍然运行,因此持续返回None,除非通过StopIteration()结束迭代
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-15 17:03:07 | 显示全部楼层
月引流光 发表于 2018-5-15 16:56
啊啊 ,这个也想明白了,正是由于self.index == 0 的时候不再循环,没有返回值了,所以当迭代的时候会有 ...

客气啦 :)

本人小白一名,来,握爪,彼此加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 04:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表