Partage
  • Partager sur Facebook
  • Partager sur Twitter

[exercices] Instruction itératives et chaînes

Anonyme
    4 juillet 2010 à 11:45:04

    Ecrire un programme qui lit une chaîne entrée par l'utilisateur et l'affiche un caractère à la fois.
    Effectuer cette tâche avec une boucle while et avec une boucle for.

    Résultat : Ce soir

    Merci pour votre participation

    avec while:

    >>> c=raw_input("entre ta chaine :")
    entre ta chaine : bonjour
    >>> i=0
    >>> while i<len(c):
            print c[i]
            i+=1



    ma solution (version 2.6) :

    ch=raw_input('choisissez une chaine :')
        for lettre in ch:
            print lettre
    


    Autre solution

    ch=raw_input('choisissez une chaine :')
        for n in range(len(ch)):
    	print list(ch)[n]
    
    • Partager sur Facebook
    • Partager sur Twitter
      4 juillet 2010 à 12:18:55

      Voici une solution (version 2.6) :
      def f(str):
          for c in str:
              print c
      
      f(raw_input())
      


      Et je suis désolé de te critiquer à nouveau, mais l'utilisation de la boucle while dans tes problèmes actuels et contre intuitif. De plus puisque tes exos sont destinés au débutants, il ne faut pas leur donner de mauvaises habitudes.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        4 juillet 2010 à 14:47:58

        Petite info suplémentaire :

        Même si l'on ajoute des parenthèses à la fonction print et que l'on remplace la fonction raw_input par input dans la version 3.x de Python le bout de code proposé par Eponix ne marchera pas dans la console.

        Il y une petite astuce qui n'est peut-être pas à la porté d'un pur débutant !

        Je conseil donc d'étudier la fonction print et les flux de sortie (sys.stderr et sys.stdout) en Python 3. ;)
        • Partager sur Facebook
        • Partager sur Twitter
          4 juillet 2010 à 15:35:33

          Eh bien si, LeYan'tibus, son script marche ;)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            4 juillet 2010 à 16:00:46

            Faut-il que cela s'affiche sur une ligne ou en verticale ?

            Parce-que si tu test ce script (dans la console et non avec IDLE) :
            import time
            def f(str):
                for c in str:
                    print(c, end ='')
                    time.sleep(2)
            
            f(input())
            


            tu te rendra mieux compte du problème que je voulais soulever. ;)
            • Partager sur Facebook
            • Partager sur Twitter
              4 juillet 2010 à 17:31:33

              Je pense que c'était un caractère par ligne, mais on ne peux savoir . . .
              Mais oui, j'avais déjà étudié ton code dans un autre topic mais je n'arrivais pas à le faire fonctionner ;)

              Voilà fred1599 pourquoi je te disais de plus décrire ce que tu attendais ;)
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                4 juillet 2010 à 17:49:49

                Si je ne l'écris pas, c'est que je ne l'impose pas :)
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  4 juillet 2010 à 21:34:50

                  Citation : Plug'n'Play 512


                  Mais oui, j'avais déjà étudié ton code dans un autre topic mais je n'arrivais pas à le faire fonctionner ;)



                  Le script que j'ai posté ici ?! Il marche très bien pourtant o_O ?!

                  [Edit] Bizard autant qu'étrange :o !

                  Et ce code, marche-t-il chez les possésseurs d'un Python 3.1 ? :
                  from time import sleep
                  from sys import stdout
                  from os import linesep
                  
                  try:
                      from idlelib.rpc import RPCProxy
                      if isinstance(stdout, RPCProxy):
                          linesep = '\n'
                          print('-- Mode IDLE --')
                  except ImportError:
                      pass
                  
                  
                  
                  def draw(s, *args, file=stdout):
                  
                      if not hasattr(file, 'write'):
                          raise TypeError
                  
                      verticale = False
                      timeout = 0
                      end = linesep
                  
                      if args:
                          x = y = Z = True
                          for i in args:
                              if isinstance(i, bool) and x:
                                  verticale = i
                                  x = False
                              elif isinstance(i, (float, int)) and y:
                                  timeout = i / 1000
                                  y = False
                              elif isinstance(i, str) and Z:
                                  end = i
                                  z = False
                              else:
                                  raise TypeError
                  
                      if verticale:
                          eol = end
                      else:
                          eol = ''
                          s += end
                  
                      for c in s:
                          print(c, end=eol, file=file)
                          file.flush() # force l'affichage ou l'écriture du buffer !
                          
                          if timeout and not c in ' \n\t':
                              sleep(timeout)
                  
                  
                  
                  if __name__ == "__main__":
                  
                      while True:
                          x = input("Entrer une chaine : ")
                          if not x:
                              break
                          print("Affichage de la chaine entrée : ", end='')
                          draw(x)
                          print("[Progressivement]: ")
                          draw(x, 100)
                          print("[Verticalement]: ")
                          draw(x, True)
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 juillet 2010 à 21:54:14

                    Salut,

                    J'ai pensé que la boucle while citée par fred1599 pouvait avoir cette utilité là :

                    chaine = 'chaine non vide'
                    while chaine != '': # Boucle d'input
                        chaine = raw_input('choisissez une chaine (tapez [Enter] pour quitter):')
                        for carac in chaine: print carac
                    print 'Fin du programme' # Fin de la boucle provoquée par la commande [enter]
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 juillet 2010 à 21:54:39

                      Il ne marche pas chez moi =/
                      Mais bon c'est pas grave, je sais déjà comment résoudre ce problème:

                      def un_caractere_a_la_fois(str):
                          for i in str:
                              print(i)
                      
                      un_caractere_a_la_fois(input('>.....'))
                      

                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 juillet 2010 à 21:58:21

                        Re-bonjour,

                        Voici mon code: (J'ai gardé une partie du code type ;) )

                        #Les diférrentes variables
                        #
                        #
                        chaine = ""
                        
                        #Corps du programme
                        #
                        #
                        chaine = input()
                        for i in chaine:
                                print(i, end = "")
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          4 juillet 2010 à 22:25:53

                          Citation

                          chaine = ""



                          est-ce utile?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 juillet 2010 à 23:04:01

                            Une autre solution un peu plus compliquer en une seule ligne.


                            print "\n".join(list(raw_input('choisissez une chaine :')))
                            


                            Bon ça correspond pas aux conditions (pas de boucle), et j'avoue que ça n'a aucun intérêt, mais c'est pour le fun :)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 juillet 2010 à 1:30:17

                              Citation : fred1599


                              avec while:

                              >>> c=raw_input("entre ta chaine :")
                              entre ta chaine : bonjour
                              >>> i=0
                              >>> while i<len(c):
                                      print c[i]
                                      i+=1


                              Non pythonnique.


                              Citation : fred1599


                              ma solution (version 2.6) :

                              ch=raw_input('choisissez une chaine :')
                                  for lettre in ch:
                                      print lettre
                              




                              Pythonnique (rappel : There should be one-- and preferably only one --obvious way to do it.)


                              Citation : fred1599



                              ch=raw_input('choisissez une chaine :')
                                  for n in range(len(ch)):
                              	print list(ch)[n]
                              


                              Non pythonnique.



                              Citation : nyko77

                              j'avoue que ça n'a aucun intérêt,



                              Si, je pense que ça peut instruire un débutant curieux et qui aura l'initiative de décompacter ton code. En plus, je crois que le cours donne les éléments pour comprendre.


                              EDIT Rectification suite à la remarque d'EPonix que je remercie.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                5 juillet 2010 à 1:39:31

                                Citation

                                Non pythonnique.



                                Mais qui es-tu pour me dire si c'est pythonnique ou pas? Guido Van Rossum? Non je ne pense pas qu'il soit aussi stupide.

                                En gros j'en ai rien à faire que se soit pythonnique ou pas, surtout le fait que tu le penses, je ne suis pas en cours de license.

                                Python est une passion, pas un cours que j'apprend pour devenir analyste programmeur ou je ne sais quoi d'autres spécialisés dans l'informatique.

                                Quand tu comprendras cela, je sais ça va être dur pour toi apparement, tout ira bien sur le forum.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  5 juillet 2010 à 2:27:50

                                  Citation : fred1599

                                  Citation

                                  Non pythonnique.



                                  Mais qui es-tu pour me dire si c'est pythonnique ou pas? Guido Van Rossum?



                                  La question n'est pas de savoir qui je suis pour te dire cela. La question est que la notion de code pythonnique existe même si elle est difficile à cerner. Apparemment, tu t'en moques qu'un code soit pythonnique ou pas. Hélas, la réalité n'est pas comme cela et programmer suppose qu'on accepte certaines contraintes, en particulier la contrainte d'idiomatisme. Un programmeur va attendre qu'une chose soit codée d'une certaine façon et pas suivant une autre. Sinon, il sera surpris, il ne comprendra pas, il perdra du temps, etc.


                                  L'unicité du codage est très importante en Python, cela fait partie de la philosophie du langage, c'est même incorporé dans le langage (import this ). En Python, une boucle while et une boucle for ne sont pas équivalentes comme en C où elles sont complètement interchangeables. Dans certaines circonstances on utilisera l'une et pas l'autre. L'usage que tu proposes de la boucle while pour parcourir un itérable n'est pas du tout pythonique, parce qu'un itérable est fait pour être parcouru par une boucle for, c'est à ça que sert une boucle for, je n'y peux rien. Cherche sur le net et tu verras que parcourir une chaîne (un itérable en général) avec une boucle while est considéré comme non pythonnique, et cela est évident puisque tu dois

                                  -- introduire un indice
                                  -- l'initialiser
                                  -- l'incrémenter

                                  alors que tout cela est fait automatiquement avec une boucle for.

                                  Je ne dis pas qu'il soit FAUX d'utiliser une boucle while mais je dis qu'il na faut pas, en particulier vis-à-vis de ceux qui découvrent le langage, laisser passer ce genre de choses. Et c'est pour ça que je réagis, et visiblement, tu n'apprécies pas.

                                  Voici ce que dit Martelli concernant la boucle for :


                                  Citation : Martelli

                                  Here’s a typical for statement:

                                  for letter in "ciao":
                                      print "give me a", letter, "..."
                                  





                                  On ne peut mieux dire ...
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    5 juillet 2010 à 11:58:44

                                    Pour une fois, candide a raison, fred. C'est une bonne chose de vouloir entraîner les débutants à écrire avec while, mais je ne pense pas que ça soit une bonne idée dans le cadre de cet exercice : la boucle for est plus adaptée.

                                    Sinon, je dirais que c'est justement parce que tu programmes pour le fun que tu devrais faire attention à la beauté de ton code. Tu n'as pas de contraintes de temps comme un programmeur professionnel, dont le seul but est de rendre un code éventuellement horrible mais qui fonctionne à la fin de la semaine.

                                    Candide pourrait donc être moins sec, mais ce qu'il dit n'est pas faux : puisque tu codes en Python, et pas en C ou dans tout autre langage, il faudrait que tu fasses attention à la façon dont tu écris ton code. La boucle while aura finalement le même résultat que la boucle for, mais la deuxième est plus "correcte" et élégante.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Anonyme
                                      5 juillet 2010 à 12:33:00

                                      Ce qui me gêne n'est pas l'exactitude de ses dires en ce qui concerne python, c'est sa façon dont il le dit, et qu'il casse en te faisant comprendre que t'es un gros nul et que t'as rien à faire dans ce forum.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        5 juillet 2010 à 12:39:59

                                        Citation : fred1599

                                        qu'il casse en te faisant comprendre que t'es un gros nul et que t'as rien à faire dans ce forum.



                                        Je n'ai jamais pensé que tu es un gros nul, d'ailleurs je ne vois jamais les gens en terme de nul/pas nul, et je pense, au contraire, vu tes connaissances étendues dans ce langage, ton investissement et ta passion pour Python, que tu as beaucoup à apporter sur ce forum.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          5 juillet 2010 à 12:40:46

                                          Il dit simplement que deux des exemples que tu as fait ne sont pas pythonnique.

                                          Et candide, pour ton troisième quote, tu t'es trompé de code. Tu as remis celle de la boucle while alors que je pense que tu parlais de celle de la boucle for parcourant le xrange.
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          [exercices] Instruction itératives et chaînes

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown