2010-01-20 15 views
19

Estoy programando un pequeño programa para el tiempo y mostrar, de manera ordenada, mis soluciones de cubo de Rubik. Pero Python (3) me sigue molestando sobre los tiempos que se usan antes de la declaración global. Pero lo que es extraño es que se declara, al principio, como times = [] (sí, es una lista) y luego de nuevo, en la función (que es donde se queja) como times = [some, weird, list] y "globaling" con global times. Aquí está mi código, por lo que puede analizar como quiera:el nombre 'tiempos' se usa antes de la declaración global, ¡pero SE HA DECIDIDO!

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() 

Cualquier ayuda sería muy apreciada como soy nuevo en el mundo de Python :)

Respuesta

24

La declaración global es cuando se declara que es timesglobal

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

Si se declara una variable global, no se puede utilizar antes de la declaración.

En este caso, no creo que necesite la declaración en absoluto, porque no está asignando a times, simplemente modificándolo.

+0

¡Maldita sea! Ahora, cuando elijo la opción 2 para mostrar mis resultados, aparece: AttributeError: el objeto 'NoneType' no tiene atributo 'reverse', refiriéndose a sorted_times = sorte_times.reverse() – AntonioPT

+0

Eso es porque 'times.sort()' regresa 'Ninguno'. Debería usar 'times.sort(); tiempos de impresión' o 'impresión ordenada (tiempos)'. –

+0

Gracias! AHORA funcionó ^^ – AntonioPT

18

A partir de la documentación de Python:

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

Así, moviéndose global times a la parte superior de la función debe estar bien.

Pero debería intentar no usar globales en esta situación. Considera usar una clase.

+0

+1 para una respuesta más completa que la mía. – randlet

2

Desde el Python Docs

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

1

Este programa debería funcionar pero puede no funcionar exactamente como se pretendía. Por favor, tome nota de los cambios.

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() 
0

Para el programa principal, puede declararlo en la parte superior. No habrá advertencia. Pero, como dije, la mención global no es útil aquí. Cada variable puesta en el programa principal está en el espacio global. En las funciones, debe declarar que desea utilizar el espacio global para ello con esta palabra clave.

Cuestiones relacionadas