views:

112

answers:

4

I'm coding a small program to time and show, in a ordered fashion, my Rubik's cube solvings. But Python (3) keeps bothering me about times being used prior to global declaration. But what's strange is that IT IS declared, right on the beggining, as times = [] (yes, it's a list) and then again, on the function (that's where he complains) as times = [some, weird, list] and "globaling" it with global times. Here is my code, so you may analyse it as you want:

import time

times = []

def timeit():
    input("Press ENTER to start: ")
    start_time = time.time()
    input("Press ENTER to stop: ")
    end_time = time.time()
    the_time = round(end_time - start_time, 2)
    print(str(the_time))
    times.append(the_time)
    global times
    main()

def main():
    print ("Do you want to...")
    print ("1. Time your solving")
    print ("2. See your solvings")
    dothis = input(":: ")
    if dothis == "1":
        timeit()
    elif dothis == "2":
        sorte_times = times.sort()
        sorted_times = sorte_times.reverse()
        for curr_time in sorted_times:
            print("%d - %f" % ((sorted_times.index(curr_time)+1), curr_time))
    else:
        print ("WTF? Please enter a valid number...")
        main()

main()

Any help would be very appreciated as I'm new in the world of Python :)

+3  A: 

The global declaration is when you declare that times is global

def timeit():
    global times # <- global declaration
    # ...

If a variable is declared global, it can't be used before the declaration.

In this case, I don't think you need the declaration at all, because you're not assigning to times, just modifying it.

John Millikin
Thanks! That worked!
AntonioPT
Darn it! Now, when I choose option 2 to show me my results, this shows up: AttributeError: 'NoneType' object has no attribute 'reverse', referring to sorted_times = sorte_times.reverse()
AntonioPT
That's because `times.sort()` returns `None`. You should use either `times.sort(); print times` or `print sorted(times)`.
John Millikin
Thanks! NOW it worked ^^
AntonioPT
+1  A: 

From the Python documentation:

Names listed in a global statement must not be used in the same code block
textually preceding that global statement.

http://docs.python.org/reference/simple_stmts.html#global

So, moving global times to the top of the function should be fine.

But, you should try not to use globals in this situation. Consider using a class.

carl
+1 for a more complete answer than mine.
Randle Taylor
A: 

From the Python Docs

Names listed in a global statement must not be used in the same code block textually preceding that global statement.

Randle Taylor
A: 

This program should work but may not work exactly as you intended. Please take note of the changes.

import time

times = []

def timeit():
    input("Press ENTER to start: ")
    start_time = time.time()
    input("Press ENTER to stop: ")
    end_time = time.time()
    the_time = round(end_time - start_time, 2)
    print(str(the_time))
    times.append(the_time)

def main():
    while True:
        print ("Do you want to...")
        print ("1. Time your solving")
        print ("2. See your solvings")
        dothis = input(":: ")
        if dothis == "1":
            timeit()
        elif dothis == "2":
            sorted_times = sorted(times)
            sorted_times.reverse()
            for curr_time in sorted_times:
                print("%d - %f" % ((sorted_times.index(curr_time)+1), curr_time))
            break
        else:
            print ("WTF? Please enter a valid number...")

main()
Noctis Skytower