About float/double type number in range.

dn PythonList at DancesWithMice.info
Wed Aug 26 06:40:36 EDT 2020


On 26/08/2020 19:58, Joel Goldstick wrote:
> On Wed, Aug 26, 2020 at 3:43 AM ADITYA <gautam.goari123 at gmail.com> wrote:
>>
>>     Dear Sir/Ma’am
>>
>>     I am requesting you to satisfy me about float number in Range function,
>>     because in the argument of range we can take integer but not double or
>>     float whenever double as well as float are integer in nature but when we
>>     use double/float in, it gives error that- “'float' object cannot be
>>     interpreted as an integer.” If we want to increment the number by half or
>>     quarter what can I do.
>>
>>     For ex- Range(1,3,0.5) I want it gives Output as [1 1.5 2 2.5 3)
>>
> 
> Take a look at this:
>>>> l = [i/2 for i in range(2,7)]
>>>> l
> [1.0, 1.5, 2.0, 2.5, 3.0]


This is a neat solution! To make it more user-friendly, the above needs 
to be wrapped in a convenience function that the user can call using 
arguments like "(1,3,0.5)" and not have to think about the 'multiplies' 
and 'divides'.

The problem with constructing such a list is that it is 'expensive', ie 
if the range is large, more storage-space will be required. In the same 
way that range() moved to a storage-averse model in Python3, herewith a 
pair of generator solutions - it might be quite fun to compare the 
performances (PSL's time library).

My first thought was that the count() from the itertools library enables 
one to step using a floating-point number. So, herewith two 
generator-based solutions:-


<<< Code NB Python v3.8 >>>
def fp_range( start:float, stop:float, step:float=1.0 )->float:
     """Generate a range of floating-point numbers."""
     if stop <= start:
         raise OverflowError( "RangeError: start must be less than stop" )
     x = start
     while x < stop:
         yield x
         x += step

try:
     for fp_number in fp_range( 1, 3, 0.5 ):
         print( fp_number )
except OverflowError as e:
     print( e )

print( "*"*12 )

try:
     for fp_number in fp_range( 1, 3, 0.25 ):
         print( fp_number )
except OverflowError as e:
     print( e )

print( "+"*12 )
import itertools

def fp_iter( start:float, stop:float, step:float=1.0 )->float:
     """Generate a range of floating-point numbers using 
itertools.count()."""
     if stop <= start:
         raise OverflowError( "RangeError: start must be less than stop" )
     for x in itertools.count( start, step ):
         if x >= stop:
             break
         yield x


for fp_number in fp_iter( 1, 3, 0.5 ):
     print( fp_number )

print( "*"*12 )

for fp_number in fp_iter( 1, 3, 0.25 ):
     print( fp_number )

print( "*"*12 )

try:
     for fp_number in fp_iter( 3, 1, 0.5 ):
         print( fp_number )
except OverflowError as e:
     print( e )


<<< Console.out >>>

1
1.5
2.0
2.5
************
1
1.25
1.5
1.75
2.0
2.25
2.5
2.75
++++++++++++
1
1.5
2.0
2.5
************
1
1.25
1.5
1.75
2.0
2.25
2.5
2.75
************
RangeError: start must be less than stop

-- 
Regards =dn


More information about the Python-list mailing list