2010-01-20 5 views
19

Je suis en train de coder un petit programme pour chronométrer et montrer, d'une manière ordonnée, mes solvats de Rubik's cube. Mais Python (3) ne cesse de me déranger sur les temps d'utilisation avant la déclaration globale. Mais ce qui est étrange, c'est qu'il est déclaré, dès le début, comme times = [] (oui, c'est une liste) et encore une fois, sur la fonction (c'est là qu'il se plaint) comme times = [some, weird, list] et "globalisation" avec global times. Voici mon code, vous pouvez l'analyser comme vous voulez:Le nom 'times' est utilisé avant la déclaration globale - Mais IL EST déclaré!

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

Toute aide serait très apprécié que je suis nouveau dans le monde de Python :)

Répondre

24

La déclaration mondiale est lorsque vous déclarez que times est global

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

Si une variable est déclarée global, il ne peut pas être utilisé avant la déclaration.

Dans ce cas, je ne pense pas que vous ayez besoin de la déclaration du tout, car vous ne l'attribuez pas à times, juste en le modifiant.

+0

Dites-le! Maintenant, quand je choisis l'option 2 pour me montrer mes résultats, ceci apparaît: AttributeError: L'objet 'NoneType' n'a pas d'attribut 'reverse', faisant référence à sorted_times = sorte_times.reverse() – AntonioPT

+0

C'est parce que 'times.sort()' renvoie 'Aucun'. Vous devriez utiliser 'times.sort(); print times' ou 'print trié (times)'. –

+0

Merci! MAINTENANT ça a marché ^^ – AntonioPT

18

De la documentation 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

Ainsi, le déplacement global times en haut de la fonction doit être fine. Mais, vous devriez essayer de ne pas utiliser de globals dans cette situation. Pensez à utiliser une classe.

+0

+1 pour une réponse plus complète que la mienne. – randlet

2

De l'Python Docs

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

1

Ce programme devrait fonctionner, mais peut ne pas fonctionner exactement comme vous le souhaitez. S'il vous plaît prendre note des changements.

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

Pour le programme principal, vous pouvez le déclarer en haut. Il n'y aura pas d'avertissement. Mais, comme dit, la mention globale n'est pas utile ici. Chaque variable mise dans le programme principal est dans l'espace global. Dans les fonctions, vous devez déclarer que vous souhaitez utiliser l'espace global pour ce mot clé.

Questions connexes