Forum Programmation.python aide pour invalid syntax ..

Posté par . Licence CC by-sa
Tags : aucun
0
30
oct.
2016

Bonjour,

j'ai un dm a rendre pour très bientôt dont le but est de :
jeter 2 dés cubiques et on compte la somme obtenu. On s’arrête et on a gagne quand la somme vaut 7 ou 11, on s’arrête et on a perdu quand la somme fait 2 ou 3 ou 12, on rejoue dans les autres cas

et il a une erreur que je ne trouve pas dans mon code.
voici mon code python :

from random import *

des1=randint(1,6)
des2=randint(1,6)
total=des1 + des2
compteur= 0
gagne= [7,11]
perdu= [2,3,12]

if (total == perdu):
print("vous avez perdu en", compteur,"coup(s)")

if (total == gagne):
print("vous avez gagne en",compteur,"coup(s)")

else:
print ("vous avez obtenu le",des1,"et le",des2,"soit un total de",total)
des1=randint(1,6)
des2=randint(1,6)
compteur= compteur + 1

while (total != gagne and perdu)

  • # une proposition

    Posté par . Évalué à 1. Dernière modification le 30/10/16 à 18:58.

    #!/usr/bin/python
    
    import sys
    
    from random import *
    
    des1=randint(1,6)
    des2=randint(1,6)
    total=des1 + des2
    compteur= 0
    gagne= [7,11]
    perdu= [2,3,12]
    
    
    while total != gagne or perdu:
    
      compteur=compteur +1
      des1=randint(1,6)
      des2=randint(1,6)
      total=des1 + des2
    
      if total in perdu:
        print "vous avez obtenu le",des1,"et le",des2,"soit un total de",total
        print "conclusion: vous avez perdu en", compteur,"coup(s)"
        sys.exit(0)
    
      if total in gagne:
        print "vous avez obtenu le",des1,"et le",des2,"soit un total de",total
        print "conclusion: vous avez gagne en",compteur,"coup(s)"
        sys.exit(0)
    
      else:
        print "vous avez obtenu le",des1,"et le",des2,"soit un total de",total

    Je précise que je n'ai jamais fait de python, donc c'est très probablement crade. Et que je suis pas spécialement doué en code.

    Pour ton while mise à part qu'il est mal placé, tu ne peux pas dire 'tant que ce n'est pas gagné et perdu, je continue' alors que je justement tu veux arrêté si l'un ou l'autre, donc 'tant que ce n'est pas gagné ou perdu, je continue'.

    Bizarre que tu n'ai pas trouvé le problème de syntaxe ?

    • [^] # Re: une proposition

      Posté par . Évalué à 2.

      Bizarre que tu n'ai pas trouvé le problème de syntaxe ?

      Il n’a pas précisé que c’était un problème de syntaxe. J’ai eu la même réaction que toi : il faut un 'or' et pas un 'and'.

      Par contre je pense qu’il faut des parenthèses car '!=' est prioritaire sur 'or' :

      while total != (gagne or perdu):

      Cela dit, après réflexion (et test), comparer un scalaire à une liste ne permet pas de checker si le scalaire est dans cette liste…

      >>> 5 != [7,8]
      True
      >>> 5 != [7,8,5]
      True
      

      et : list1 or list2 semble renvoyer list1 (logique…).

      • [^] # Re: une proposition

        Posté par . Évalué à 1.

        sa ma pourtant l'air de fonctionner le scalaire est bien comparé

        résultat:
        vous avez obtenu le 3 et le 2 soit un total de 5
        vous avez obtenu le 5 et le 3 soit un total de 8
        vous avez obtenu le 4 et le 5 soit un total de 9
        vous avez obtenu le 6 et le 6 soit un total de 12
        conclusion: vous avez perdu en 4 coup(s)

        par contre j'aimerai donner le choix a l'utilisateur de rejeter les dés ou non , je pense qu'avec une condition booléenne sa fera l'affaire non ?

        • [^] # Re: une proposition

          Posté par . Évalué à 2.

          Définitivement, en Python, 2 & 3, comparer un entier à une liste n’a pas de sens.

          Il faut utiliser element in list pour savoir si un élément se trouve dans une liste, comme l’a montré pstk. Par contre j’ai un problème avec la condition pour le while dans son code.

          Je ferais :

          while total not in gagne+perdu:
      • [^] # Re: une proposition

        Posté par . Évalué à 2.

        dans le titre : 'invalid syntax'

        Si tu c/c le code, tu verras qu'une bonne partie ce n'est qu'un problème de syntaxe avant l'algorithme lui même.

        Pour le reste, je ne peux pas aider :\

        • [^] # Re: une proposition

          Posté par . Évalué à 2.

          oui, vu le titre après coup…

          son code étant malformé (indentation perdue) il était de fait syntaxiquement foireux… j’ai pas pris la peine de le ré-identer pour le tester…

    • [^] # Re: une proposition

      Posté par . Évalué à 1. Dernière modification le 30/10/16 à 21:25.

      bonjour ,merci pour vos reponses oui effectivement il s'agit bien dans OR ..
      j'ai testé le code et il fonctionne bien sauf que je n'ai jamais utiliser le sys et le IN pourait tu m'expliquer très rapidement leur utilité? :)

      • [^] # Re: une proposition

        Posté par . Évalué à 1.

        euh… google ? Comme je te l'ai dit, je n'ai jamais fait de python. J'ai simplement googlé pour trouver la syntaxe python de ce que je voulais faire.

        le sys , c'est pour arrêter sortir du script quand la condition est validée, à la manière d'un exit dans bash. Sinon ton script s'arrêtera jamais… Essaye sans.

        pour le in : http://stackoverflow.com/questions/15112125/how-do-i-test-one-variable-against-multiple-values

        • [^] # Re: une proposition

          Posté par . Évalué à 1.

          Oui en gros le IN se traduirait par exemple(4 in nombre) par : 4 apparait dans la variable nombre.
          merci beaucoup pour vos réponses a tout les 2 elles m'ont étaient très utiles ! :)

      • [^] # Re: une proposition

        Posté par . Évalué à 3. Dernière modification le 30/10/16 à 22:21.

        Pour sys tu peux aller voir là https://docs.python.org/3/library/sys.html, ce serait trop long à expliquer…

        Ici il a utilisé la fonction exit() de ce module qui permet de sortir du programme en envoyant un code retour. Je ne vois pas trop pourquoi d’ailleurs car avec la bonne condition dans le while le programme sort de la boucle et envoi exit(0) tout seul parce qu’il a arrive à la fin du script.

        Avec les sys.exit(0) là où il les a mis on pourrait faire while True pour le coup. Vu que le programme se terminerait si l’une des conditions (total in gagne) ou (total in perdu) était remplie.

        while total != gagne or perdu:
        

        ça fait while (total != gagne), qui est toujours vrai puisqu’ils n’ont pas le même type, OU perdu, donc la condition est toujours vraie.

        Pour l’opérateur 'in' c’est tout simple :

        >>> 5 in [1,2,3]
        False
        >>> 3 in [1,2,3]
        True
        
        • [^] # Re: une proposition

          Posté par . Évalué à 1.

          oui exacte pour le while true , merci pour le in c'est tout simple en fin de compte ;)

        • [^] # Re: une proposition

          Posté par . Évalué à 1.

          Exact, mais il me semblait que le script ne s'arrêtait pas. Sois j'ai rêvé soit c'est le while qui est effectivement foireux.

    • [^] # Re: une proposition

      Posté par . Évalué à 2.

      Je me permets de reposter ton code légèrement modifié (en fait seulement la condition du while… ton code marchait mais ça faisait bizarre :)

      #!/usr/bin/python2
      
      import sys
      from random import *
      
      des1=randint(1,6)
      des2=randint(1,6)
      total=des1 + des2
      compteur= 0
      gagne= [7,11]
      perdu= [2,3,12]
      
      while True:
      
        compteur=compteur +1
        des1=randint(1,6)
        des2=randint(1,6)
        total=des1 + des2
      
        if total in perdu:
          print "vous avez obtenu le",des1,"et le",des2,"soit un total de",total
          print "conclusion: vous avez perdu en", compteur,"coup(s)"
          sys.exit(0)
      
        if total in gagne:
          print "vous avez obtenu le",des1,"et le",des2,"soit un total de",total
          print "conclusion: vous avez gagne en",compteur,"coup(s)"
          sys.exit(0)
        else:
          print "vous avez obtenu le",des1,"et le",des2,"soit un total de",total

      C’est du python 2, en 3 ça n’est pas valide…

      On est effectivement obligé d’utiliser sys.exit() car si on met la bonne condition dans le while : while total not in gagne+perdu (le '+' n’est pas une addition ici…) et bien le print n’aura pas lieu lorsque l’on gagne ou que l’on perd, on aura que le troisième print, celui du else, qui aura lieu, bien que le programme s’arrête lorsque l’on gagne ou que l’on perd.

      • [^] # Re: une proposition

        Posté par (page perso) . Évalué à 4.

        • Plutôt un break qu'un sys.exit(0) un break permet de sortir seulement de la boucle que de sortir du programme
        • comme le lancé des dés se fait au début de la boucle, il n'est pas nécessaire de le faire avant
        • il faut mieux éviter les from random import * et préférer les import explicites
        • le résultat est affiché dans les trois cas, donc autant l'afficher hors de tout if/else
        • il vaut mieux utiliser la fonction print() que la commande print voire d'utiliser carrément python3 (à ce stade de l'apprentissage c'est la seule différence, mais python3 résout plein de problèmes)
        • c'est beaucoup plus joli à lire et relire avec des espaces après les virgules et entre les opérateurs
        #!/usr/bin/python2
        from __future__ import print_function
        
        #les deux lignes précédentes peuvent être remplacées par #!/usr/bin/python3 pour passer à python3
        
        from random import randint
        
        compteur= 0
        gagne= [7,11]
        perdu= [2,3,12]
        
        while True:
        
          compteur = compteur + 1
          des1 = randint(1, 6)
          des2 = randint(1, 6)
          total = des1 + des2
          print("vous avez obtenu le", des1, "et le", des2, "soit un total de", total)
        
          if total in perdu:
            print("conclusion: vous avez perdu en", compteur, "coup(s)")
            break
        
          if total in gagne:
            print("conclusion: vous avez gagne en", compteur," coup(s)")
            break

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.