找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 4049|回复: 7

[代码与实例] 在Python2.x版本迭代器输出错误,请帮忙

11

主题

26

帖子

26

积分

贫民

积分
26
jingseyi2011 发表于 2017-12-22 17:09:23 | 显示全部楼层 |阅读模式
#!/usr/bin/python
# -*- coding: UTF-8 -*-
#构造迭代器
class MyIter(object):
    def __init__(self,start,end):
        self.start = start
        self.end = end
    def __iter__(self):
        return self
    def __next__(self):
        if self.start < self.end:
            r = self.start
            self.start += 1
            return r
        else:
            raise StopIteration
        
if __name__ == '__main__':
    m = MyIter()
    for i in m(1,10):
        print(i)
在主函数中,输出一直报错:
Traceback (most recent call last):
  File "D:/SW/Python/program-defined/52_chapter10_Iteration.py", line 20, in <module>
    m = MyIter()
TypeError: __init__() takes exactly 3 arguments (1 given)

请问是版本的问题么?
回复

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2017-12-22 20:02:23 | 显示全部楼层
m = MyIter(1,10)
回复 支持 反对

使用道具 举报

11

主题

26

帖子

26

积分

贫民

积分
26
jingseyi2011  楼主| 发表于 2017-12-25 10:03:48 | 显示全部楼层
还是没过呢,请问你用的是哪个版本的Python?
class MyIter(object):
    def __init__(self,start,end):
        self.start = start
        self.end = end
    def __iter__(self):
        return self
    def __next__(self):
        if self.start < self.end:
            r = self.start
            self.start += 1
            return r
        else:
            raise StopIteration
        
if __name__ == '__main__':
    m = MyIter(1,10)
    for i in m(1,10):
        print(i)

>>>

Traceback (most recent call last):
  File "D:\SW\Python\program-defined\52_chapter10_Iteration.py", line 20, in <module>
    for i in m(1,10):
TypeError: 'MyIter' object is not callable
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-12-25 10:38:45 | 显示全部楼层
jingseyi2011 发表于 2017-12-25 10:03
还是没过呢,请问你用的是哪个版本的Python?
class MyIter(object):
    def __init__(self,start,end):

for i in m:
不是m(1,10), m是MyIter对象,没有定义__call__所以不能像函数一样调用
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-12-25 10:40:04 | 显示全部楼层
你原本是这个意思吧
class MyIter(object):
    def __init__(self,start,end):
        self.start = start
        self.end = end
    def __iter__(self):
        return self
    def __next__(self):
        if self.start < self.end:
            r = self.start
            self.start += 1
            return r
        else:
            raise StopIteration
        
if __name__ == '__main__':
    m = MyIter   #m是Mylter类,而不是实例化对象
    for i in m(1,10):
        print(i)
回复 支持 反对

使用道具 举报

11

主题

26

帖子

26

积分

贫民

积分
26
jingseyi2011  楼主| 发表于 2017-12-26 13:55:31 | 显示全部楼层
剑心无痕 发表于 2017-12-25 10:40
你原本是这个意思吧
class MyIter(object):
    def __init__(self,start,end):

谢谢大神,你的意思是:m只是用来代替MyIter这个类的,并不是实例化以后的对象,也就是说语句也可以是这样的?
if __name__ == '__main__':
      for i in MyIter(1,10):
             print(i)
回复 支持 反对

使用道具 举报

2

主题

219

帖子

219

积分

版主

Rank: 7Rank: 7Rank: 7

积分
219

热心会员默默耕耘优秀版主

剑心无痕 发表于 2017-12-26 14:16:21 | 显示全部楼层
jingseyi2011 发表于 2017-12-26 13:55
谢谢大神,你的意思是:m只是用来代替MyIter这个类的,并不是实例化以后的对象,也就是说语句也可以是这 ...

可以,就是这个意思
回复 支持 反对

使用道具 举报

11

主题

26

帖子

26

积分

贫民

积分
26
jingseyi2011  楼主| 发表于 2017-12-27 14:10:36 | 显示全部楼层
剑心无痕 发表于 2017-12-26 14:16
可以,就是这个意思

谢谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

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