CodeHS is a comprehensive teaching platform for helping schools teach computer science. We provide web-based curriculum, teacher tools and resources, and professional development. All questions or comments related to CodeHS can go here!
0 points
about 7 years
my_list = [0,1,2,3,6,5,7]
for i in range[0,len[my_list],2**i]: print my_list[i]
this code gives an error
Answer 55e1c6b5d3292fba3e0000c2
The code is fine apart from the for loop line. Read that line again. for i in range[0, len[my_list], 2**i]
means to take the next value from the range and
then assign it to i
. So first, Python has to generate the range. This means that i
can only be assigned a value when the range has been generated. This is how things will go in your case:
- Python sees the for loop
- Python tries to generate a range [it doesn’t know what
i
is yet] - It notices that you have passed
i
to the range[] method, it doesn’t know whati
is so it generates a NameError [which basically means that it doesn’t know whati
is a name of]
This is how they should have gone:
- Python sees the for loop
- It tries to generate a range. Generation is successful.
- It assigns the first value of the range to
i
As you can see, in your case, i
has not been created yet and you are already trying to pass it in as an argument to the range[]
function. If you tell me what you are trying to do then I could fix your code.
points
about 7 years
Answer 55e28f289113cb1cd400054d
points
about 7 years
Answer 55e3b13b937676a569000576
Try the following:
import math l = list[range[0,100]] for i in range[0, int[math.log[len[l],2]]+1]: print l[2**i - 1]
Note that the last line is indented but does not show in the preview.
points
about 7 years
best way with powers of 2 is using bit-shifting on 1
, which is way faster than exponentiation in that case.
That said, I wouldn't recommend a while
loop but rather a for
loop, or even better: generate your list of values using a list comprehension [which avoids all the variables and undesired side effects, infinite loops because of while
, etc...] and one-liner:
print[[1