[python] 수레에 대한 range ()

range()파이썬에서 float에 해당 하는 것이 있습니까?

>>> range(0.5,5,1.5)
[0, 1, 2, 3, 4]
>>> range(0.5,5,0.5)

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    range(0.5,5,0.5)
ValueError: range() step argument must not be zero



답변


나는이 내장 된 기능 모르겠지만, 같은 한 서면 너무 복잡하지 않아야합니다.

def frange(x, y, jump):
  while x < y:
    yield x
    x += jump

의견에서 언급했듯이 다음과 같은 예기치 않은 결과가 발생할 수 있습니다.

>>> list(frange(0, 100, 0.1))[-1]
99.9999999999986

예상 결과를 얻으려면이 질문에 다른 답변 중 하나를 사용하거나 @Tadhg에서 언급했듯이 인수 decimal.Decimal로 사용할 수 있습니다 jump. float 대신 문자열로 초기화하십시오.

>>> import decimal
>>> list(frange(0, 100, decimal.Decimal('0.1')))[-1]
Decimal('99.9')

또는:

import decimal

def drange(x, y, jump):
  while x < y:
    yield float(x)
    x += decimal.Decimal(jump)

그리고:

>>> list(drange(0, 100, '0.1'))[-1]
99.9


답변

다음 중 하나를 사용할 수 있습니다.

[x / 10.0 for x in range(5, 50, 15)]

또는 람다 /지도를 사용하십시오 :

map(lambda x: x/10.0, range(5, 50, 15))


답변

예전에는 사용 numpy.arange했지만 부동 소수점 오류로 인해 반환되는 요소 수를 제어하는 데 약간의 문제가있었습니다. 이제는 다음과 같이 사용합니다 linspace.

>>> import numpy
>>> numpy.linspace(0, 10, num=4)
array([  0.        ,   3.33333333,   6.66666667,  10.        ])


답변

Pylab에는 frange(실제로 래퍼 matplotlib.mlab.frange)가 있습니다.

>>> import pylab as pl
>>> pl.frange(0.5,5,0.5)
array([ 0.5,  1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ])


답변

열심히 평가 (2.x range) :

[x * .5 for x in range(10)]

지연 평가 (2.x xrange, 3.x range) :

itertools.imap(lambda x: x * .5, xrange(10)) # or range(10) as appropriate

번갈아:

itertools.islice(itertools.imap(lambda x: x * .5, itertools.count()), 10)
# without applying the `islice`, we get an infinite stream of half-integers.


답변

사용 itertools: 지연 평가 부동 소수점 범위 :

>>> from itertools import count, takewhile
>>> def frange(start, stop, step):
        return takewhile(lambda x: x< stop, count(start, step))

>>> list(frange(0.5, 5, 1.5))
# [0.5, 2.0, 3.5]


답변

패키지 more-itertools에 numeric_range 함수를 추가하는 것을 도왔습니다 .

more_itertools.numeric_range(start, stop, step) 내장 함수 범위처럼 작동하지만 float, Decimal 및 Fraction 유형을 처리 할 수 ​​있습니다.

>>> from more_itertools import numeric_range
>>> tuple(numeric_range(.1, 5, 1))
(0.1, 1.1, 2.1, 3.1, 4.1)