[Tutor] range query
Fri, 19 Jan 2001 10:51:07 -0500
On Fri, Jan 19, 2001 at 11:07:50PM +0900, kevin parks wrote:
| how come range only works with integers? Is there a way to do the same thing with floats-value steps? It seems very unPython like to me.
| why can't you do this:
| range(3, 0.5)
This isn't how range orders its arguments. This says you want to
count up from 3 to 0. Not exactly possible. ex:
range( 0 , 3 )
[ 0 , 1 , 2 ]
Also, range is defined only for integers, so if you do provide a step
(the /third/ argument) it will be converted to an int first
range( 0 , 3 , 0.5 )
**** Error : zero step size
# (Oh, 0.5 was rounded down)
range( 0 , 3 , 1.5 )
[ 0 , 1 , 2 ]
| [0.0 ,0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
This could be useful. Perhaps the following (untested) could work
map( range( 0 , 6 ) , lambda x : x/2.0 ) :
# My idea here is to double your range, then halve each value. This
# ought to work . . .
| inquiring minds want to know...
My guess is that floats are just bad things. Basically, ints are
well-behaved while floats aren't. Floats are usually represented
using binary bits and often in IEEE 754 format. The IEEE format can't
represent all floating point numbers. It uses a Scientific Notation
style ( 1.x**n ) to store it. Floats can therefore only represent
numbers that exist as powers of 2.
In C, C++, etc, you can't write the following (equivalent) :
for( float i = 0 ; i < 3 ; i++ )
because the meaning of incrementing a float by 1 is undefined. Also,
float comparisons rarely work right ex:
if ( (0.0/3.0) == 0 ) :
is likely to print "false".
| Seoul, Korea
As someone else suggested, you could use a list comprehension. You
could also define your own float_range function that behaves the way
you want it to, but be careful with precision issues.