今天的我更强了 发表于 2020-6-19 11:32:27

迭代器

class Run():
    def __init__(self):
      self.a=2020
    def __iter__(self):
      return self
    def __next__(self):
      if 0<=self.a:
            if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
                return self.a
            self.a-=1
      else:
            raise StopIteration('太小了!')
r=Run()
for i in r:
    if i>=2000:
      print(i)
    else:
      break
求指教这段代码的错误在哪 为什么一直输出2020不停?

Twilight6 发表于 2020-6-19 11:36:14

本帖最后由 Twilight6 于 2020-6-19 11:37 编辑


因为你这的代码:
if 0<=self.a:
            if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
                return self.a
            self.a-=1
迭代器条件成立后 return 执行就不会执行下面的代码,也就是红色代码不会运行了,导致你每次迭代都是执行上一次条件成立的值了~

这样即可
class Run():
    def __init__(self):
      self.a=2020
    def __iter__(self):
      return self
    def __next__(self):
      if 0<=self.a:
            if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
                self.a -= 1
                return self.a+1
            self.a-=1
      else:
            raise StopIteration('太小了!')
r=Run()
for i in r:
    if i!=None and i>=2000:
      print(i)

今天的我更强了 发表于 2020-6-19 11:37:37

Twilight6 发表于 2020-6-19 11:36
因为你这的代码:

迭代器条件成立后 return 执行就不会执行下面的代码,也就是红色代码不会运行了,导 ...

懂了懂了 谢谢

Twilight6 发表于 2020-6-19 11:38:20

今天的我更强了 发表于 2020-6-19 11:37
懂了懂了 谢谢

{:10_282:}

今天的我更强了 发表于 2020-6-19 11:44:47

Twilight6 发表于 2020-6-19 11:38


class Run():
    def __init__(self):
      self.a=2021
    def __iter__(self):
      return self
    def __next__(self):
      if 0<=self.a:
            self.a-=1
            if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
                return self.a
      else:
            raise StopIteration('太小了!')
r=Run()
for i in r:
    if i>=2000:
      print(i)
    else:
      break
修改了之后还是报错TypeError: '>=' not supported between instances of 'NoneType' and 'int'
感觉逻辑上没问题啊{:10_266:}

Twilight6 发表于 2020-6-19 11:47:49

今天的我更强了 发表于 2020-6-19 11:44
class Run():
    def __init__(self):
      self.a=2021


看报错:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'

说NoneType 无法和整型判断大小 说明你函数返回了 None   你参考下我上面的代码,就可以正常运行了

今天的我更强了 发表于 2020-6-19 11:57:46

Twilight6 发表于 2020-6-19 11:47
看报错:




你的代码我看懂了 也理解了,可是这一段代码的问题在哪?能再帮忙点一下吗?

Twilight6 发表于 2020-6-19 11:59:58

今天的我更强了 发表于 2020-6-19 11:57
你的代码我看懂了 也理解了,可是这一段代码的问题在哪?能再帮忙点一下吗?

好 看代码这里:

def __next__(self):
      if 0<=self.a:
            self.a-=1
            if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
                return self.a
      else:
            raise StopIteration('太小了!')
迭代过程中只有 if 条件成立 才会执行里面的 return ,当你 if 条件不满足时候 if 外部没有设置 return 返回值

所以 Python 会默认返回一个 None而 None 无法比较大小,导致报错,所以我那 for 循环里的 if 条件先判断是否为 None 才进行下一步

今天的我更强了 发表于 2020-6-19 12:09:33

Twilight6 发表于 2020-6-19 11:59
好 看代码这里:




最后一个问题.....我的也设置成你那样之后
class Run():
    def __init__(self):
      self.a=2021
    def __iter__(self):
      return self
    def __next__(self):
      if 0<=self.a:
            self.a-=1
            if (self.a%4==0 and self.a%100!=0) or (self.a%400==0):
                return self.a
      else:
            raise StopIteration('太小了!')
r=Run()
for i in r:
    if i!=None and i>=2000:
      print(i)
    else:
      break
为什么只返回来一个2020..
拜托了

Twilight6 发表于 2020-6-19 12:10:22

今天的我更强了 发表于 2020-6-19 12:09
最后一个问题.....我的也设置成你那样之后
class Run():
    def __init__(self):


因为第二次for 循环不满足条件 就执行 else 了然后就 break 退出循环了~

去掉 else 和 break 即可

今天的我更强了 发表于 2020-6-19 12:12:00

Twilight6 发表于 2020-6-19 12:10
因为第二次for 循环不满足条件 就执行 else 了然后就 break 退出循环了~

去掉 else 和 break 即可

卧槽. 牛 谢谢谢谢
页: [1]
查看完整版本: 迭代器