Comment trouvez vous ce code ? [résolus]

Comment trouvez vous ce code ? [résolus] - Python - Programmation

Marsh Posté le 06-06-2004 à 20:07:25    

Bonjour je viens de finir mon premier micro programme en python et j'aimerais avoir l'avis de programmeurs expérimentés.
Voici le code  :
 

Code :
  1. # ce programme test une chaine et met un espace et
  2. # une majuscule apres un point
  3. import string
  4. # i est le compteur pour les caracteres de la chaine
  5. i = 0
  6. exp = """Attention . ceci est un exemple.et oui il y a des.fautes de.frappe."""
  7. print "Entrez au moins une phrases avec plusieurs points."
  8. print "Exemple : "
  9. print exp
  10. str = raw_input()
  11. if str == "":  # si aucune chaine n'est rentre, exp est utilise
  12. str = exp
  13. if str[0]<> string.upper(str[0]):  # si la premiere lettre n'est pas une Maj
  14. str = string.upper(str[0]) + str[1:]
  15. for i in range(len(str)):
  16. if str[i] == ".":
  17.  if i + 1 <= len(str) and str[i+1] == " ":
  18.   if i + 2 <= len(str) and str[i+2] <> string.upper(str[i+2]):
  19.    str = str[:i+2] + string.upper(str[i+2]) + str[i+3:]
  20.  else:
  21.   str = str[:i+1] + " " + string.upper(str[i+1]) + str[i+2:]
  22. print str


 
Pensez-vous que j'ai utillisé les meilleures methodes, le code est-il clair?


Message édité par lascapi le 02-07-2004 à 12:21:22

---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 06-06-2004 à 20:07:25   

Reply

Marsh Posté le 06-06-2004 à 20:48:17    

l'algo me parait foireux
 
non il est pas très clair, et sans doute trop compliqué : déjà je comparerait pas plages plutot que par caractère. on s'y perds en plus avec tout ce que tu fais avec str QUI EST UN MOT RESERVE D'AILLEURS :o. et pas la peine d'utiliser le module string "minuscule".upper() et voilà :o  et surtout, le ferait un "chaine".split('.') et pour chaque morceau sauf le premier, je mets l'espace et la majuscule, et après je ".".join(..)

Reply

Marsh Posté le 06-06-2004 à 22:05:13    

mets ton code dans les balises de code du forum, splulisiblecommeca


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 06-06-2004 à 22:08:05    

Ouais c'est vrai qu'il est pas trés clair, je l'ai fait à l'arrache, mais ca marche.
Ceci dis, je vois pas ce qu'est une plage et comment faire pour programmer ça ?
Je vais modifié le "str" de suite bien que cela ne met pas posé de problème jusqu'à présent.
Bon le "sting".join() si j'ai bien compris c'est pour joindre deux listes??? Or je voulais éviter de travailler avec des listes et rester avec des chaines. Et le "chaine".split('.') c'est quoi je l'ai pas trouvé dans la doc que j'ai. Ca rajoute le "." ???
Bon d'accord j'ai pas trop chercher mais vus que je suis pas trop anglophone, le nombre de site est vite limité... Si vous en avez des bon avec une doc costaud. Merci
En fait je n'est pas compris la nuance, à par ne pas utiliser string.upper("..." ) mais seulement upper("..." ).
Je vous remercie d'avance de votre pascience .


---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 06-06-2004 à 22:09:24    

Pour les balise de code c'est comment ? Elles n'y sont pas sur la boite à outil.


---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 06-06-2004 à 22:12:44    

c'est à codé des balises de gras, italique et compagnie quand tu post


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 06-06-2004 à 23:28:51    

OK c'est rectifié. Merci


---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 07-06-2004 à 00:10:26    

Voila j'ai rectifié ce que j'ai compris, pour le reste il faudra un peu plus d'explication ou de temp.

Code :
  1. # ce programme test une chaine et met un espace et
  2. # une majuscule apres un point
  3. from string import upper
  4. i = 0
  5. exp = """Attention . ceci est un exemple.et oui il y a des.fautes de.frappe."""
  6. print "Entrez au moins une phrases avec plusieurs points."
  7. print "Exemple : "
  8. print exp
  9. chaine = raw_input()
  10. if chaine == "": 
  11. chaine = exp
  12. if chaine[0]<> upper(chaine[0]): 
  13. chaine = upper(chaine[0]) + chaine[1:] # elle le devient
  14. for i in range(len(chaine)): 
  15. if chaine[i] == ".": 
  16.  if i + 1 <= len(chaine) and chaine[i+1] == " ":                    if i + 2 <= len(chaine) and chaine[i+2] <> upper(chaine[i+2]): 
  17.    chaine = chaine[:i+2] + upper(chaine[i+2]) + chaine[i+3:]
  18.  else:
  19.   chaine = chaine[:i+1] + " " + upper(chaine[i+1]) + chaine[i+2:]
  20. print chaine


J'espere que vous parvenez à lire le code,si il est trop foireux je peux le commenter encore.


Message édité par lascapi le 07-06-2004 à 09:42:24

---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 07-06-2004 à 08:26:45    

t'es commentaires sont foireux et flingue la lisibilité. et tu n'as pas applicuqé que ce que je t'ai dit

Reply

Marsh Posté le 07-06-2004 à 09:41:08    

Ok rectification pour les commentaire (moi on m'avais dis d'en mettre...)
Mais pour le reste je n'est pas compris donc je peux pas faire de modification. C'est pas de la mauvaise volonté.
J'ai quand même commencé un autre algorytme, je le poste dés que possible.


---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 07-06-2004 à 09:41:08   

Reply

Marsh Posté le 07-06-2004 à 12:47:49    

lascapi a écrit :

Ok rectification pour les commentaire (moi on m'avais dis d'en mettre...)
Mais pour le reste je n'est pas compris donc je peux pas faire de modification. C'est pas de la mauvaise volonté.
J'ai quand même commencé un autre algorytme, je le poste dés que possible.


"chaine".split('.'), ca permet de creer une liste de strings en creant un nouveau string a chaque fois que le caractere '.' est rencontre dans "chaine".
 
"#".join(liste), ca te rend la concatenation de tous les strings presents dans la liste, avec la chaine "#" entre chacun des objets (c'est l'inverse de split quoi)
 
Pour les docs, Python a un truc vachement bien fait, les docstrings.
Si tu veux vraiment te simplifier la vie, telecharges wxPython (s'facile a trouver), et lance pyCrust, ensuite pour voire les fonctions relatives aux chaines tu tapes  
>>> "".
et ca va derouler un menu avec tous les membres des strings, ensuite tu en selectionne un, tu ajoutes une parentheses et tu lis le DOCSTRING
tu peux faire ca de maniere plus propre (la c'est un peu porc), mais ca ca te permet de tester la fonctionalite au passage

Reply

Marsh Posté le 07-06-2004 à 14:47:10    

Super,merci Masklinn.
J'ai compris comment ca marche. J'ai même réecris le code , mais maintenant cela m'enleve les points et ne me mets pas de majuscule donc il faut que je le retravail.
Voici le code  

Code :
  1. # ce programme test une chaine et met un espace et
  2. # une majuscule apres un point
  3. from string import upper
  4. exp = """Attention . ceci est un exemple.et oui il y a des.fautes de.frappe."""
  5. print "Entrez au moins une phrases avec plusieurs points."
  6. print "Exemple : "
  7. print exp
  8. chaine = raw_input()
  9. if chaine == "":  # si aucune chaine n'est rentre, exp est utilise
  10. chaine = exp
  11. if chaine[0]<> upper(chaine[0]): 
  12. chaine = upper(chaine[0]) + chaine[1:]
  13. listdechaine = chaine.split("." )
  14. chaine = ". ".join(listdechaine)   
  15.        
  16. print chaine


C'est vrai que c'est plus clair. :)
 
edit : en fait j'ai trouvé comment remettre les points, trop simple, il ne me reste plus que les majuscules... :??:


Message édité par lascapi le 07-06-2004 à 15:00:23
Reply

Marsh Posté le 07-06-2004 à 17:34:51    

Je pensez faire une boucle du genre :

Code :
  1. listdechaine = chaine.split("." )
  2. for ch in listdechaine:
  3. if len(ch) > 1:
  4.  ch = upper(ch[0])+ch[1:]
  5. chaine = ". ".join(listdechaine)


Mais une telle boucle ne change rien  :pfff:  
Comment faire... telle est la question.


---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 07-06-2004 à 18:47:58    

bonjour,
 

lascapi a écrit :

Je pensez faire une boucle du genre :

Code :
  1. listdechaine = chaine.split("." )
  2. for ch in listdechaine:
  3. if len(ch) > 1:
  4.  ch = upper(ch[0])+ch[1:]
  5. chaine = ". ".join(listdechaine)


Mais une telle boucle ne change rien  :pfff:  
Comment faire... telle est la question.


 
premierement tu fais une boucle sur une copie des éléments de ta liste mais pas sur la liste elle-même, utilise par exemple :
 

Code :
  1. for i in range(0, len(listdechaine)-1)
  2.     if len(listdechaine[i]) > 1 :
  3.         listdechaine[i] = upper(listdechaine[i][0]) + listdechaine[i][1:]


 
il y a sans doute d'autres méthodes.
 
deuxiemement si ta chaine ne doit comporter qu'une capitale et des miniuscules ensuite tu peux utiliser la méthode capitalize des chaines.
 
Lionel


---------------
Python facile : http://pythonfacile.free.fr/ Les ressources (liens) en français sur Python.
Reply

Marsh Posté le 07-06-2004 à 18:58:33    

C'est bien ce que je pensais, il y avait un bug dans ma boucle, je l'ai donc completé :

Code :
  1. listdechaine = chaine.split("." )
  2. listech=[]
  3. for ch in listdechaine:
  4. if len(ch) > 1:
  5.  ch = upper(ch[0])+ch[1:]
  6.  listech.append(ch)
  7. chaine = ". ".join(listech)


La, ça marche, mais il y a un cas ou ça ne marche pas, c'est quand il y a deja un  espace entre le point et la lettre suivante... C'est normal vus qu'il met l'espace en majuscule et pas la lettre. Il faut donc je pense faire une autre boucle mais je n'ai pas encore l'idée.
 
En tout cas merci le_Glu pour ton exemple clair et précis je vais le tester de ce pas, mais quand même, j'ai encore une petite question :  
la "méthode capitallize des chaines" ce n'est pas upper() ?
Qu'apporte telle de plus ?
 
Mince ne répondez pas tous de suite il faut d'abord que j'aille voir sur la doc par moi même  :D
 
edit : j'ai remplacé list par listech.  
Sorry Taz


Message édité par lascapi le 07-06-2004 à 20:50:22

---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 07-06-2004 à 20:10:13    

list=[]
 
putain mais list aussi c'est un mot réservé :o

Reply

Marsh Posté le 07-06-2004 à 20:48:29    

:( Ha mince encore.
Ou peut-on voir les mots reservés (et à quoi ça sert vus que même si je les utilise "autrement" ça marche)?
Je rectifie ça immédiatement.


---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 07-06-2004 à 20:51:57    

python.org

Reply

Marsh Posté le 07-06-2004 à 20:53:43    

Et en francais ?
Je suis peut-etre ch.;:,:t mais je m'excuse je ne suis pas encore anglophone, d'où incompréhension du site qui est en anglais.


---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 07-06-2004 à 20:55:58    

ben t'achète un livre ou tu utilise un éditeur qui te mets les mots réservés d'une couleur spéciale

Reply

Marsh Posté le 07-06-2004 à 21:45:28    

Ok bon conseil. Mais en attendant je n'est rien trouver, j'ai même chercher sur python.org... mais si je n'ai rien trouvé la c'est que je ne lis pas l'anglais...


---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 07-06-2004 à 22:52:39    

ben alors apprendre l'anglais d'abord

Reply

Marsh Posté le 08-06-2004 à 10:39:27    

ditto
 
Faire de la programmation sans comprendre l'anglais c'est du suicide, parce que 99.9% des docs, exemples et bases de connaissances sont en anglais et que la majorite des langages se basent sur l'anglais pour la creation de leurs commandes/items

Reply

Marsh Posté le 08-06-2004 à 18:58:11    

bonjour,
 

lascapi a écrit :


En tout cas merci le_Glu pour ton exemple clair et précis je vais le tester de ce pas, mais quand même, j'ai encore une petite question :  
la "méthode capitallize des chaines" ce n'est pas upper() ?
Qu'apporte telle de plus ?
 


la méthode capitalize met la premiere lettre d'une chaine en majuscule et  
toutes les autres en minuscules.
 
le_Glu


---------------
Python facile : http://pythonfacile.free.fr/ Les ressources (liens) en français sur Python.
Reply

Marsh Posté le 10-06-2004 à 14:42:55    

Ouah c'est super simple, Je vais essayé de le finir cet aprem, comme ca je pourrai me consacré entièrement au Bac...
En tout cas merci a tous, c'est à dire à :
Masklinn
Taz
le_GLu
Masklinn
Burgergold
Et je voulais félicité particulièrement le_Glu pour ses explications claire et aimable.
Bon pour le "Prog final" je le fait et .... et voila quoi : |
 
 
; )
 
edit : oups Masklinn y est deux fois....Alors je rajoute les autres ; Merci encore à Taz,le_Glu, et Burgergold ;)  


Message édité par lascapi le 10-06-2004 à 22:43:11

---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 10-06-2004 à 16:47:39    

Voila, j'ai profité de la retouche pour rajouter deux boucles qui enlèvent les espaces de trop avant et après le point.

Code :
  1. # ce programme test une chaine et met un espace et
  2. # une majuscule apres un point
  3. from string import upper
  4. from string import capitalize
  5. i = 0
  6. exp = """Attention ..     ceci est un exemple.et oui il y a des.fautes de.frappe."""
  7. print "Entrez au moins une phrases avec plusieurs points."
  8. print "Exemple : "
  9. print exp
  10. chaine = raw_input()
  11. if chaine == "": 
  12. chaine = exp
  13. if chaine[0]<> upper(chaine[0]): 
  14. chaine = upper(chaine[0]) + chaine[1:]
  15. listdechaine = chaine.split("." )
  16. lench = len(listdechaine)
  17. for i in range(0, lench):
  18. for j in range(0, lench):
  19.  if len(listdechaine[i])>1 and listdechaine[i][0]==" ":
  20.   listdechaine[i]=listdechaine[i][1:]
  21. for i in range(0, lench):
  22. for j in range(0, lench):
  23.  if len(listdechaine[i])>1 and listdechaine[i][len(listdechaine[i])-1]==" ":
  24.   listdechaine[i]=listdechaine[i][:len(listdechaine[i])-1]
  25. for i in range(0, lench):
  26. listdechaine[i]=listdechaine[i].capitalize()
  27. chaine = ". ".join(listdechaine)   
  28.        
  29. print chaine


Voila... :)  
Je suis contant :D , j'ai écris mon premier programme avec Python...
Maintenant il ne me reste qu'a faire l'interface graphique. Quel environement conseillez-vous pour programmé sous Mac OS X ??? :hello:


Message édité par lascapi le 10-06-2004 à 16:48:28

---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 10-06-2004 à 16:57:53    

[:len(listdechaine[i])-1] [:rofl]

Reply

Marsh Posté le 10-06-2004 à 16:59:54    

Qu'est-ce qui a de drole????
 
edit : en tout cas j'aime trop ce smiley mortderire


Message édité par lascapi le 10-06-2004 à 22:39:40

---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 10-06-2004 à 17:03:56    

-1

Reply

Marsh Posté le 10-06-2004 à 17:25:34    

Un peu complique ton prog quand meme, t'es sur qu'il fonctionne?
 
enfin bon.
 
commentaires
 
pas besoin d'importer la lib string si tu ne l'appelles pas, faire "".upper() ca marche sans rien importer.
str est un string, donc au lieu de faire string.upper(str) tu peux faire str.upper(). Code plus clair et moins de possibilites de conneries
 

Code :
  1. if str == "":
  2.      str = exp


Une chaine vide, comme tout objet python vide, est considere comme faux au niveau booleen, tu peux donc remplacer par

Code :
  1. if not str:
  2.     str = exp


mais bon c'est pas tres important
 

Code :
  1. if str[0]<> string.upper(str[0]):
  2.      str = string.upper(str[0]) + str[1:]


remplace par

Code :
  1. str.capitalize()


Ca fait la meme chose (1ere lettre en maj le reste en minuscules)
 
Ensuite on vire tous les espaces presents en plus d'1 exemplaire:

Code :
  1. " ".join(str.split())

Reply

Marsh Posté le 10-06-2004 à 22:47:26    

Encore des révélation, c'est trop bien, je retient surtout la dernière astuce qui me fera économiser 4 lignes de codes, pour la str.capitalize() je l'ai corrigé, pour l'astuce de la chaine vide, je retient mais pour plus tard quand je serai habitué à ce concept.


Message édité par lascapi le 10-06-2004 à 22:50:49

---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 10-06-2004 à 23:11:03    

WaOUh, c'est trop bien la programmation, surtout quand on est aider par des boss  :wahoo:  
Bon j'espere que maintenant tout le monde sera contant :  

Code :
  1. # ce programme test une chaine et met un espace et
  2. # une majuscule apres un point
  3. exp = """attention ..     ceci est un exEmple.et oui il y a des.Fautes de.frappe."""
  4. print "Entrez au moins une phrases avec plusieurs points."
  5. print "Exemple : "
  6. print exp
  7. chaine = raw_input()
  8. if chaine == "": 
  9. chaine = exp
  10. listdechaine = chaine.split("." )
  11. for i in range(0, len(listdechaine)):
  12. listdechaine[i]=" ".join(listdechaine[i].split())
  13. for i in range(0, len(listdechaine)):
  14. listdechaine[i]=listdechaine[i].capitalize()
  15. chaine = ". ".join(listdechaine)   
  16.        
  17. print chaine


Voila ce que je pense à l'heure actuel (il est 23h04) le plus "beau" code possible pour faire ce que je lui demande de faire. :jap:  
C'est trop bien de programmer, ceci dis je repose ma question : Pour programmer l'interface... quel environement prendre (sous Mac Os X ; je ne sait pas si ca change quelque chose...)  ???
 
Edit : Voici le résultat du programme

Code :
  1. Entrez au moins une phrases avec plusieurs points.
  2. Exemple :
  3. attention ..     ceci est un exEmple.et oui il y a des.Fautes de.frappe.
  4. Attention. . Ceci est un exemple. Et oui il y a des. Fautes de. Frappe.


Message édité par lascapi le 11-06-2004 à 09:33:18

---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 11-06-2004 à 13:39:25    

GUI: je te recommandes wxPython
 
C'est tres simple, facile a programmer meme sans RAD, et compatible Windows, Mac et *nix.
En plus, l'allure des programmes est parfaitement semblables aux programmes "natifs": lancer un programme wxPython sous windows donne l'impression de lancer un programme windows, mais le lancer sous MacOS donne l'impression de lancer un programme specialement fait pour Mac
 
(wxPython est un port sous Python de wxWindows/wxWidgest, GUI multiplateformes C/C++)

Reply

Marsh Posté le 11-06-2004 à 14:05:42    

# ce programme test une chaine et met un espace et  
# une majuscule apres un point ET VIRE LES AUTRES
 
c'est vrai que resoudre un pb en modifiant son énoncé est pratique :)


Message édité par nico168 le 11-06-2004 à 14:07:38
Reply

Marsh Posté le 12-06-2004 à 09:47:07    

Salut lascapi, tu as bien progressé dans ton code, mais ...
 
Il peut peut etre encore plus "beau" et en une seule ligne ..
 

Code :
  1. if chaine == "": 
  2.      chaine = exp
  3.    
  4. chaine='. '.join( [i.strip().capitalize() for i in chaine.split('.')])
  5.            
  6. print chaine


 
allez,
a+
Eric

Reply

Marsh Posté le 12-06-2004 à 17:16:16    

RereWaouh Merci pour wxPython, je m'y met de suite.
Et merci pour LA ligne de code ; ça me rappel les fonctions Lambda ou quelque chose comme ca ??? En tout cas j'essaye de comprendre et je change ça : )


---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 02-07-2004 à 10:09:24    

Et que pensez vous de Tkinter ?


---------------
Evoluons bien, mais surtout : trouvons la vérité ...
Reply

Marsh Posté le 02-07-2004 à 11:17:09    

lascapi a écrit :

Et que pensez vous de Tkinter ?


 
Pour faire un truc simple (une fenêtre, 2-3 boutons...), ça va. Mais si ton appli est plus conséquente, ça rame trop.
 
Je m'en suis servi pour des petites applis (en Tcl ou en Python). L'avantage c'est que Tkinter est très simple à utiliser donc pratique pour faire des prototypes...

Reply

Marsh Posté le 02-07-2004 à 12:08:32    

Bon ptite question. Suite à ce topic je me suis dit utilisons les regex. J'ai trouvé la correspondance mais je n'arrive pas à effectuer le remplacement en utilisant les références arrières
 
Voici un truc qui tourne:

Code :
  1. #!/usr/bin/python
  2. import re
  3. import sys
  4. import string
  5. chaine = ''
  6. chaine = string.join( sys.argv[ 1: ]  )
  7. resultat = re.sub( r'(\.[\w])', r'\1', chaine)
  8. print resultat


 
Lors du remplacement je remets ce que j'ai trouvé pour pas que ça plante.
 
Et moi je travaille sur ce code mais je bloque:

Code :
  1. #!/usr/bin/python
  2. import re
  3. import sys
  4. import string
  5. chaine = ''
  6. chaine = string.join( sys.argv[ 1: ]  )
  7. resultat = re.sub( r'(\.[\w])', r'\1'[1].upper(), chaine)
  8. print resultat


 
Mais j'ai des erreurs, il me dit que r'\1' est une string mais elle contient pas ce que j'attends bref je vois pas trop.

Reply

Marsh Posté le 02-07-2004 à 14:08:15    

up

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed