How can the built-in range function take a single argument or three?

前端 未结 4 1818
借酒劲吻你
借酒劲吻你 2020-12-06 05:44

I would like to know, if anyone can tell me, how the range function can take either: a single argument, range(stop), or range(start, stop), or

4条回答
  •  我在风中等你
    2020-12-06 06:13

    class xrangeIterator:

    def __init__(self,xrange_obj):
    
        self._xrange_obj=xrange_obj
    
    
    def __next__(self):
    
        self.copy_gen=self._xrange_obj._result
    
        for i in self.copy_gen:
    
            return i
    
        raise StopIteration
    

    class xrange:

    def __init__(self,*args):
    
        self._args=args
    
        self.start,self.step=0,1
    
        self._repr_string=None
    
        for i in self._args:
    
            if type(i) is not int:
    
                raise TypeError("Cannot interprate '{}' as integer!".format(type(i).__name__))
    
    
        if self._length(self._args)<1:
    
            raise TypeError( "xrange Must have at least one argument")
    
    
        elif self._length(self._args)==1:
    
            self.stop=self._args[0]
    
            self._repr_string="xrange(0,{})".format(self.stop)
    
            self._result=self._xrange(self.start-self.step,self.stop-self.step,self.step)
    
        elif self._length(self._args)==2:
    
            self.start=self._args[0]
    
            self.stop=self._args[1]
    
            self._result=self._xrange(self.start-self.step,self.stop-self.step,self.step)
    
        elif self._length(self._args)==3:
    
            self.step=self._args[2]
    
            self.start=self._args[0]
    
            self.stop=self._args[1]
    
            self._result=self._xrange(self.start-self.step,self.stop-self.step,self.step)
    
    
        else:
    
            raise TypeError("xrange expected at most three arguments,got {}".format(self._length(self._args)))
    
    
    def __repr__(self):
    
        if self._length(self._args)==1:
    
            return self._repr_string
    
        return "xrange{}".format(self._args)
    
    def __iter__(self):
    
        return xrangeIterator(self)
    
    
    def _length(self,n):
    
        counter=0
    
        for i in n:
    
            counter+=1
    
        return counter
    
    
    def _xrange(self,start,stop,step):
    
        if step==0:
    
                raise ValueError("Argument 3 should not be zero!")
    
        if startstop and step<0:
    
                start+=step
    
                yield start
    

提交回复
热议问题