#1 Le 24/02/2009, à 22:25
- Guilhem 58
Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Bonsoir à tous !
Bon, j'apprends tranquillement le langage Python et là je coince sur un script. Le programme à réaliser doit afficher le nombre de lettres des prénoms appartenant à une liste donnée.
Voici le script que j'ai réalisé :
liste=["Hervé","Paul","Céline","Séverine","Sylvie","André","Jean-Pierre"]
a,b=0,0
while(a<=6):
c=liste[b]
d=len(c)
print"Le prénom",c,"comporte",d,"caractères"
a,b=a+1,b+1
Ma boucle se réalise bien mais je n'obtiens pas le bon nombre de caractères (certains sont justes et d'autres faux !).
Une fois lancé, j'obtiens ça :
Le prénom Hervé comporte 6 caractères
Le prénom Paul comporte 4 caractères
Le prénom Céline comporte 7 caractères
Le prénom Séverine comporte 9 caractères
Le prénom Sylvie comporte 6 caractères
Le prénom André comporte 6 caractères
Le prénom Jean-Pierre comporte 11 caractères
Si quelqu'un peut m'aider ... je suis preneur de solutions adaptées à mon niveau de débutant !
@+ Guilhem58
Dernière modification par Guilhem 58 (Le 24/02/2009, à 23:40)
Portable PackardBell - Intel Core2Duo T5250 - 1.50GHz - 2Go RAM - GeForce 8600M GS – LInux Mint 9
Hors ligne
#2 Le 24/02/2009, à 22:47
- belkiss
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Salut !
Ton problème vient des caractères accentués, voici une méthode pour corriger l'erreur : utiliser la conversion de utf-8 vers unicode
>>> print len(unicode("Séverine",'utf-8'));
8
>>> print len(unicode("Mù$àëêl_ète",'utf-8'));
11
Je ne sais pas si c'est la meilleure solution, mais ça marche ^^
Dernière modification par belkiss (Le 24/02/2009, à 22:48)
Hors ligne
#3 Le 24/02/2009, à 23:06
- philarmonie
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
autre solution, déclarer tes chaînes en unicode
>>> len('Hervé')
6
>>> len(u'Hervé')
5
ce qui donne
liste = [u"Hervé", u"Paul", u"Céline", u"Séverine", u"Sylvie", u"André", u"Jean-Pierre"]
for prenom in liste:
print u"Le prénom %s comporte %d caractères" % (prenom, len(prenom))
j'ai aussi un peu modifié la boucle, et utilisé le formatage de chaîne pour le print
Dernière modification par philarmonie (Le 24/02/2009, à 23:10)
#4 Le 24/02/2009, à 23:39
- Guilhem 58
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Merci à vous deux ! Ca marche maintenant !
Voici le script modifié :
liste=["Hervé","Paul","Céline","Séverine","Sylvie","André","Jean-Pierre"]
a,b=0,0
while(a<=6):
c=liste[b]
d=len(unicode(c,'utf-8'))
print"Le prénom",c,"comporte",d,"caractères."
a,b=a+1,b+1
@+ Guilhem58
Dernière modification par Guilhem 58 (Le 24/02/2009, à 23:42)
Portable PackardBell - Intel Core2Duo T5250 - 1.50GHz - 2Go RAM - GeForce 8600M GS – LInux Mint 9
Hors ligne
#5 Le 24/02/2009, à 23:47
- philarmonie
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Juste pour information, la boucle while pour parcourir une liste c'est pas, mais alors pas pythonesque du tout
Un iterable (comme une liste, une chaine, un tuple...) ça se parcourt avec une boucle for
Exemple
for c in liste
print c
car dans ton cas, si tu modifies la taille de ta liste, tu dois aussi modifier la condition de sortie de ta boucle while.
de plus tu fais appelles à des variables temporaires (a,b) inutiles (d'ailleurs a aurait suffit) et ça fait plus de ligne de code à taper.
et puis dans le fond, c'est carrément plus lisible.
Quand je vois for c in liste... je comprends facilement que le script va répéter une suite d'action pour tous les éléments de la liste, alors que quand je vois une boucle while je suis obligé de regarder ce qu'il se passe dans la boucle pour comprendre qu'elle effectue une itération à l'intérieur d'une liste.
Dernière modification par philarmonie (Le 24/02/2009, à 23:51)
#6 Le 24/02/2009, à 23:54
- Guilhem 58
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Merci Philarmonie mais pour l'instant je ne sais pas utiliser la fonction "for" !
Je suis le cours de Python suivant :
http://python.developpez.com/cours/TutoSwinnen/
Peut être pour la suite mais pour le moment je ne comprends pas cette manière de coder ! Je suis preneur d'un script plus "pythonesque" !
Pour l'instant ça marche comme ça ! J'espère acquérir les subtilités plus tard ...
@+ Guilhem58
Portable PackardBell - Intel Core2Duo T5250 - 1.50GHz - 2Go RAM - GeForce 8600M GS – LInux Mint 9
Hors ligne
#7 Le 24/02/2009, à 23:59
- philarmonie
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Une version plus pythonesque, je t'en ai déjà donné une
liste = [u"Hervé", u"Paul", u"Céline", u"Séverine", u"Sylvie", u"André", u"Jean-Pierre"]
for prenom in liste:
print u"Le prénom %s comporte %d caractères" % (prenom, len(prenom))
C'est plus court, non?
Quand tu penses à ton algorithme, tu te dis, pour tous les prenom de ma liste je dois faire patati, patata...
Et bah ce qui est bien dans python, c'est que tu l'écris ainsi (mais en anglais)
for prenom in liste:
patati
patata
et là python va effectuer une itération dans ta liste, et la variable prenom contiendra successivement toutes les valeurs contenues dans ta liste.
P.S: très bon choix le Swinnen.
Dernière modification par philarmonie (Le 25/02/2009, à 00:06)
#8 Le 25/02/2009, à 00:04
- Guilhem 58
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Merci pour ces précisions !
Vais aller me coucher et j'étudierai ça demain à tête moins fatiguée !
@+ Guilhem58
Portable PackardBell - Intel Core2Duo T5250 - 1.50GHz - 2Go RAM - GeForce 8600M GS – LInux Mint 9
Hors ligne
#9 Le 25/02/2009, à 10:17
- aleph2
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
> Guilhem 58
Débutant, je prendrais le train Python 3.
> Merci Philarmonie mais pour l'instant je ne sais pas utiliser la fonction "for" !
...
> ...J'espère acquérir les subtilités plus tard ...
Je partage l'avis de Philarmonie. Le hic est que ce n'est pas une subtilité. C'est *la façon* de travailler en Python.
#10 Le 25/02/2009, à 12:19
- Guilhem 58
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Salut aleph2 !
Je veux bien faire comme vous le dites mais dans le cours en ligne je n'ai pas encore vu ces instructions ! Je ne comprends pas comment l'utiliser : je fais pour le moment avec ce que je connais et maîtrise ... Mais je ne demande qu'à apprendre !
Petite question (peut être idiote!) : j'utilise Python 2.5.2 (je vois ça quand je lance python dans mon terminal). Comment je fais pour être en Python 3 ?
@+ Guilhem
Portable PackardBell - Intel Core2Duo T5250 - 1.50GHz - 2Go RAM - GeForce 8600M GS – LInux Mint 9
Hors ligne
#11 Le 25/02/2009, à 16:08
- philarmonie
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Petite question (peut être idiote!) : j'utilise Python 2.5.2 (je vois ça quand je lance python dans mon terminal). Comment je fais pour être en Python 3 ?
via Application -> Ajouter/supprimer -> python (v3.0)
Pour le reste ça viendra, suis les tutos progressivement comme tu le fais et tu comprendra de mieux en mieux comment fonctionne python.
J'ai pas le Swinnen sous la main, mais je trouve bizarre si il aborde les itérateurs en ne présentant pas le for avant le while (ou du moins en même temps).
Pour ce qui est de comprendre le fonctionnement de for je vais te l'illustrer ainsi
for element in liste:
do_something
est équivalent à
i = 0
while (i < len(liste)):
element = liste[i]
do_something
i = i + 1
Dernière modification par philarmonie (Le 25/02/2009, à 18:06)
#12 Le 25/02/2009, à 16:54
- aleph2
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Le "Swinnen" n'est pas un mauvais bouquin, mais il faut bien voir la réalité des choses. Il est à mon avis obsolète.
Extrait de l'introduction :
" Les exemples de ce livre ont été réalisés les uns après les autres sur une période de temps relativement longue : certains ont été développés sous Python 1.5.2, puis d'autres sous Python 1.6, Python 2.0, Python 2.1, Python 2.2 et enfin Python 2.3.
Hors il se trouve que que bien des particularités de Python ont été introduites en Python >= 2.3 (codages, compréhension de listes, type booléen, itérateurs, type unicode, ...). Je cite de mémoire. Le bouquin, logiquement, n'en parle pas.
Quant au sujet délicat de savoir si un débutant devrait commencer par Python 3.0 ou non, il y a eu de nombreuses discussions sur la mailing-list de développeurs de Python 3000, auxquels se sont joints bien du monde du milieu académique.
Le consensus qui en sort est que Python 3.0 est le bon point de départ. Bien des modules, comme turtle.py, ont été améliorés et préservés pour garder à Python son excellent caractère pédagogique.
La meilleure introduction reste à mon avis http://docs.python.org/3.0/ -> tutorial. En anglais, mais c'est la "lingua franca" de l'informatique.
Bien du plaisir.
#13 Le 26/02/2009, à 08:37
- Guilhem 58
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Salut aleph !
C'est vrai que le top serait le tuto anglais python 3.0 que tu cites mais suis un peu "léger" dans la langue de Shakespeare ...
Je vais peut être continuer le Swinnen pour acquérir des bases (certaines un peu dépassées) puis je me plongerai dans le tuto anglais afin de rectifier certaines choses et d'en découvrir d'autres !
Ca me semble plus faisable vu mon niveau d'anglais ...
@+ Guilhem58
Portable PackardBell - Intel Core2Duo T5250 - 1.50GHz - 2Go RAM - GeForce 8600M GS – LInux Mint 9
Hors ligne
#14 Le 26/02/2009, à 14:23
- HP
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
C'est *la façon* de travailler en Python.
Y a quand même des trucs qui me font énormément délirer en python, des fois, genre çà :
if 'urlopen error' in str(e) or 'HTTP Error' in str(e):
Y a pas à dire, c'est trop simple…
Parce que bizarrement je n'arrivais pas à récupérer proprement les erreurs issues de urllib2, alors, je suis passé par des chaînes (qui semblent être des tableaux de caractères ou un truc du genre), c'est sûrement loin d'être top ; de toute façon, je n'ai que deux ou 3 cas à traiter…
Ouais c'est quand même moche, je sais, mais ça fait ce que j'en attends !
[EDIT] orthographe
Dernière modification par HP (Le 26/02/2009, à 17:08)
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#15 Le 26/02/2009, à 16:41
- aleph2
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
> HP
Je rêve ou as-tu changé ton code trois fois.
#16 Le 26/02/2009, à 17:01
- HP
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
Ouais… y a des versions qui marchaient pas vraiment comme voulu…
Tiens, du coup, je le modifie encore une fois ! (pour le fun)
En plus c'est un truc de fou le script en question, avec des encodages (et des réencodages) de caractères… du contenu "arbitraire"… c'est pas évident de tout tester… et j'ai pas trop le réflexe de la console python .
Voilà, voilà… mais cette fois ci c'est la bonne… parce que ça marche et que j'ai trop peur de tout casser… la partie la plus môche, c'est juste le code ici présent… du moins, à mes yeux.
Dernière modification par HP (Le 26/02/2009, à 17:08)
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#17 Le 26/02/2009, à 17:25
- aleph2
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
> HP
>>> 'a' in 'abc'
True
fonctionne parce que le/la type/classe str possède une méthode nommée __contains__.
C'est ce que l'on voit quand on fait un
>>> dir('')
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__',
'__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__',
'__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__',
'__setattr__', '__str__', 'capitalize', 'center', 'count', 'decode', 'encode',
'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower',
'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split',
'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper',
'zfill']
C'est le principe même du fonctionnement, l'âme, de Python, effectuer un
>>> 'a' in 'abc'
est équivalent à
>>> 'abc'.__contains__('a')
True
Il en va ainsi de toutes les classes qui possèdent cet attribut ou les classes que l'on peut définir soi-même.
----
Effectuer des tests sur les strings des messages d'erreur (?) Les messages d'erreur sont susceptibles d'être modifiés, les gestionnaires d'erreur non !
>>> def z1():
assert 1 == 2, '1 différent de 2'
>>> def z2():
assert 1 == 2, 'une autre message'
>>> try:
z1()
except AssertionError:
print 'erreur'
erreur
>>> try:
z2()
except AssertionError:
print 'erreur'
erreur
----
Pour ton enième code :
if 'urlopen error' in str(e) or 'HTTP Error' in str(e):
Correct, mais un
if 'urlopen error' or 'HTTP Error' in str(e):
n'a pas beaucoup de sens, parce que un string, 'urlopen error' est toujours vrai.
>>> bool('asdf')
True
>>> bool('')
False
Ne pas oublier que Python fait du "short evaluation" pour les booléens.
#18 Le 26/02/2009, à 17:49
- HP
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
if 'urlopen error' or 'HTTP Error' in str(e):
n'a pas beaucoup de sens, parce que un string, 'urlopen error' est toujours vrai.
Oui… sur ce coup j'ai manqué d'inspiration…
Sinon, oui… comme tu dis :
Effectuer des tests sur les strings des messages d'erreur (?) Les messages d'erreur sont susceptibles d'être modifiés
Parfaitement, mais je ne sais pourquoi dans mon main.py je ne parviens à récupérer correctement les erreurs urllib2.HTTPError et urllib2.URLError… je vais essayer de plancher là dessus…
dans le main ça ressemble à çà :
if __name__ == '__main__':
ERRORS = { 'GRABBER' : 15, 'UNEXPECTED' : 514 }
try:
Observer = Observer()
try:
page = htmlGrabber(url).grab()
except Exception, e:
if 'urlopen error' in str(e) or 'HTTP Error' in str(e):
Observer.exit(ERRORS['GRABBER'], e)
else:
raise e
except Exception, e:
Observer.exit(ERRORS['UNEXPECTED'], e)
Où Observer est un objet assez simple, mais nécessaire puisque ensuite utilisé dans le atexit, et il ne fait que syslog le message passé en argument 2, et l'argument 1 correspond au code de sortie (supérieur à 0), utilisé pour sys.exit, cet argument sera conservé en tant que propriété de l'objet.
On voit bien qu'au pire des cas, je sors en erreur quoiqu'il advienne (id est même si les messages venaient à être modifiés), il s'avère juste que la sortie accompagnée d'un message pour l'utilisateur serait alors moins compréhensible.
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne
#19 Le 26/02/2009, à 18:19
- HP
Re : Besoin aide script Python : nombre caractères d'un prénom - RESOLU
bé ouais… bourrique que je suis !
c'est moi qui m'envoyais des chaîne depuis les exception du module…
avec un pauvre :
raise e
ouais, je la referai plus celle-ci, je crois.
cat /dev/urandom >/dev/null 2>&1 #github
Hors ligne