How to use a decimal range() step value?

前端 未结 30 2128
醉话见心
醉话见心 2020-11-21 22:34

Is there a way to step between 0 and 1 by 0.1?

I thought I could do it like the following, but it failed:

for i in range(0, 1, 0.1):
    print i
         


        
30条回答
  •  情歌与酒
    2020-11-21 23:04

    Suprised no-one has yet mentioned the recommended solution in the Python 3 docs:

    See also:

    • The linspace recipe shows how to implement a lazy version of range that suitable for floating point applications.

    Once defined, the recipe is easy to use and does not require numpy or any other external libraries, but functions like numpy.linspace(). Note that rather than a step argument, the third num argument specifies the number of desired values, for example:

    print(linspace(0, 10, 5))
    # linspace(0, 10, 5)
    print(list(linspace(0, 10, 5)))
    # [0.0, 2.5, 5.0, 7.5, 10]
    

    I quote a modified version of the full Python 3 recipe from Andrew Barnert below:

    import collections.abc
    import numbers
    
    class linspace(collections.abc.Sequence):
        """linspace(start, stop, num) -> linspace object
    
        Return a virtual sequence of num numbers from start to stop (inclusive).
    
        If you need a half-open range, use linspace(start, stop, num+1)[:-1].
        """
        def __init__(self, start, stop, num):
            if not isinstance(num, numbers.Integral) or num <= 1:
                raise ValueError('num must be an integer > 1')
            self.start, self.stop, self.num = start, stop, num
            self.step = (stop-start)/(num-1)
        def __len__(self):
            return self.num
        def __getitem__(self, i):
            if isinstance(i, slice):
                return [self[x] for x in range(*i.indices(len(self)))]
            if i < 0:
                i = self.num + i
            if i >= self.num:
                raise IndexError('linspace object index out of range')
            if i == self.num-1:
                return self.stop
            return self.start + i*self.step
        def __repr__(self):
            return '{}({}, {}, {})'.format(type(self).__name__,
                                           self.start, self.stop, self.num)
        def __eq__(self, other):
            if not isinstance(other, linspace):
                return False
            return ((self.start, self.stop, self.num) ==
                    (other.start, other.stop, other.num))
        def __ne__(self, other):
            return not self==other
        def __hash__(self):
            return hash((type(self), self.start, self.stop, self.num))
    

提交回复
热议问题