explication source inversion de chaine ?

Le
Eastwind - Vent d Est
dans le livre de swinnen l exercice suivant est proposé :

5.9. Écrivez un script qui recopie une chaîne (dans une nouvelle
variable) en l'inversant.
Ainsi par exemple, « zorglub » deviendra « bulgroz ».

La solution donnée par l'auteur :

#! /usr/bin/env python
# -*- coding: Latin-1 -*-

# Inversion d'une chaîne de caractères

# Chaîne fournie au départ :
ch = raw_input ('entrer un mot: ' )
lc = len(ch) # nombre de caractères total
i = lc - 1 # le traitement commencera à partir du dernier
caractère
nch = "" # nouvelle chaîne à construire (vide au d épart)
while i >= 0:
nch = nch + ch[i]
i = i - 1
# Affichage :
print nch

ca marche mais je ne comprend pas pourquoi la variable "i" est
encapsulé la valeur "lc - 1" et non pourquoi simplement la valeur "lc
" , j'avais fait un script similaire avant de regarder la solution
mais je n'avais pas diminuer la valeur lc de 1 . Il est écrit que
c'est pour commencer par le dernier caractère , mais si l'on enlève
1 , ne commence t-on pas avec l'avant dernier caractère ?

output erreur sans la valeur lc - 1 :

me@robby:~/python.swinnen/solutions$ python exercice_5_09.py
entrer un mot: hello
Traceback (most recent call last):
File "exercice_5_09.py", line 12, in ?
nch = nch + ch[i]
IndexError: string index out of range



quelqu'un peut m'expliquer ? j'ai déjà chercher le nom de l erreur
mais elle pas trop compréhensible a ce niveau ..

merci
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mihamina (R12y) Rakotomandimby
Le #649326
Eastwind - Vent d Est wrote:

ca marche mais je ne comprend pas pourquoi la variable "i" est
encapsulé la valeur "lc - 1" et non pourquoi simplement la valeur "lc
" , j'avais fait un script similaire avant de regarder la solution
mais je n'avais pas diminuer la valeur lc de 1 . Il est écrit que
c'est pour commencer par le dernier caractère , mais si l'on enlève
1 , ne commence t-on pas avec l'avant dernier caractère ?


Non.

quelqu'un peut m'expliquer ? j'ai déjà chercher le nom de l erreur
mais elle pas trop compréhensible a ce niveau ..


In [2]: chaine="abcdef"
In [3]: len(chaine)
Out[3]: 6
In [4]: chaine[0]
Out[4]: 'a'
In [5]: chaine[1]
Out[5]: 'b'
In [6]: chaine[2]
Out[6]: 'c'
In [7]: chaine[5]
Out[7]: 'f'
In [8]: chaine[6]

Bruno Desthuilliers
Le #649048
dans le livre de swinnen l exercice suivant est proposé :

5.9. Écrivez un script qui recopie une chaîne (dans une nouvelle
variable) en l'inversant.
Ainsi par exemple, « zorglub » deviendra « bulgroz ».

La solution donnée par l'auteur :

#! /usr/bin/env python
# -*- coding: Latin-1 -*-

# Inversion d'une chaîne de caractères

# Chaîne fournie au départ :
ch = raw_input ('entrer un mot: ' )
lc = len(ch) # nombre de caractères total
i = lc - 1 # le traitement commencera à partir du dernier
caractère
nch = "" # nouvelle chaîne à construire (vide au d épart)
while i >= 0:
nch = nch + ch[i]
i = i - 1
# Affichage :
print nch

ca marche mais je ne comprend pas pourquoi la variable "i" est
encapsulé la valeur "lc - 1" et non pourquoi simplement la valeur "lc
" , j'avais fait un script similaire avant de regarder la solution
mais je n'avais pas diminuer la valeur lc de 1 . Il est écrit que
c'est pour commencer par le dernier caractère , mais si l'on enlève
1 , ne commence t-on pas avec l'avant dernier caractère ?


Dans l'écrasante majorité des langages de programmation, on compte à
partir de zéro. Donc, le premier élément d'une séquence (chaine, liste
etc) est à l'index zéro, et le dernier élément à l'index
longueur(sequence) - 1.


output erreur sans la valeur lc - 1 :

:~/python.swinnen/solutions$ python exercice_5_09.py
entrer un mot: hello
Traceback (most recent call last):
File "exercice_5_09.py", line 12, in ?
nch = nch + ch[i]
IndexError: string index out of range


Bin oui, forcément.

ch = "abcde"
len(ch)
5



ch[0]
'a'



ch[4]
'e'



ch[len(ch)]
Traceback (most recent call last):



File "<stdin>", line 1, in <module>
IndexError: string index out of range




quelqu'un peut m'expliquer ? j'ai déjà chercher le nom de l erreur
mais elle pas trop compréhensible a ce niveau ..


Ca veut dire que l'index que tu demandes n'existe pas dans la séquence
en question.


Accessoirement, bien qu'instructif du point de vue algorithmique de base
(et c'est le but de l'exercice), le code en question n'est absolument
pas pythonesque. La solution canonique (pour une chaine) est:

nch = ch[::-1]

Je te laisse parcourir la doc pour trouver l'explication !-)



jean-michel bain-cornu
Le #649046
Bonjour,
Dans l'écrasante majorité des langages de programmation, on compte à
partir de zéro. Donc, le premier élément d'une séquence (chaine, liste
etc) est à l'index zéro, et le dernier élément à l'index
longueur(sequence) - 1.


J'imagine que tu parles des langages actuels, et que tu ne tiens pas
compte des innombrables langages propriétaires qui existaient il y a une
vingtaine d'années...

Bruno Desthuilliers
Le #649045
Bonjour,
Dans l'écrasante majorité des langages de programmation, on compte à
partir de zéro. Donc, le premier élément d'une séquence (chaine, liste
etc) est à l'index zéro, et le dernier élément à l'index
longueur(sequence) - 1.


J'imagine que tu parles des langages actuels,


Pas nécessairement - à moins que tu ne compte C parmi les langages
"actuels" !-)

Par contre:
et que tu ne tiens pas
compte des innombrables langages propriétaires qui existaient il y a une
vingtaine d'années...


Non, bien sûr.


jean-michel bain-cornu
Le #649042
Dans l'écrasante majorité des langages de programmation, on compte à
partir de zéro. Donc, le premier élément d'une séquence (chaine,
liste etc) est à l'index zéro, et le dernier élément à l'index
longueur(sequence) - 1.


J'imagine que tu parles des langages actuels,


Pas nécessairement - à moins que tu ne compte C parmi les langages
"actuels" !-)


Je ne saurais trop que dire ; C est universellement utilisé, mais
franchement pas pratique, en tout cas pour l'usage que j'ai d'un langage
de programmation.
Perso, ça fait 3 ou 4 ans que je n'y ai pas touché, ce n'est donc plus
très actuel pour moi :-)
D'ailleurs, j'attendrais avec un grand intérêt de voir un OS programmé
en python.

A+
jm



Bruno Desthuilliers
Le #649040
Dans l'écrasante majorité des langages de programmation, on compte à
partir de zéro. Donc, le premier élément d'une séquence (chaine,
liste etc) est à l'index zéro, et le dernier élément à l'index
longueur(sequence) - 1.


J'imagine que tu parles des langages actuels,


Pas nécessairement - à moins que tu ne compte C parmi les langages
"actuels" !-)


Je ne saurais trop que dire ; C est universellement utilisé, mais
franchement pas pratique, en tout cas pour l'usage que j'ai d'un langage
de programmation.
Perso, ça fait 3 ou 4 ans que je n'y ai pas touché, ce n'est donc plus
très actuel pour moi :-)


<aol />.

Mais bon, ce que je voulais dire, c'est que ce n'est pas franchement une
nouveauté comme langage !-)




MC
Le #649039
Bonsoir !

Je profite de cet appel à troller...

des innombrables langages propriétaires qui existaient il y a
une vingtaine d'années...


AMHA, il n'y a jamais eu autant de langages propriétaires
qu'actuellement.


des langages actuels


Cela sous-entend que commencer à compter à zéro est une notion
"actuelle", plus moderne.
Mais cela est loin d'être évident. On a pris l'habitude de faire avec,
ce qui n'implique pas que ce soit mieux.






--
@-salutations

Michel Claveau

jean-michel bain-cornu
Le #651659
Cela sous-entend que commencer à compter à zéro est une notion
"actuelle", plus moderne.
Mais cela est loin d'être évident. On a pris l'habitude de faire avec,
ce qui n'implique pas que ce soit mieux.


Il y aurait là-dessous le fait qu'un registre de processeur s'initialise
à zéro que ce ne serait pas étonnant...
et pourquoi 0 ? parce que électriquement ça se fait tout seul.
Pourquoi pas +1 ? parce qu'il faut un cycle de plus pour initialiser un
registre à 1 ? On demande un électronicien dans la salle...

Amaury Forgeot d'Arc
Le #651657
Cela sous-entend que commencer à compter à zéro est une notion
"actuelle", plus moderne.
Mais cela est loin d'être évident. On a pris l'habitude de faire avec,
ce qui n'implique pas que ce soit mieux.


Il y aurait là-dessous le fait qu'un registre de processeur s'initialise
à zéro que ce ne serait pas étonnant...
et pourquoi 0 ? parce que électriquement ça se fait tout seul.
Pourquoi pas +1 ? parce qu'il faut un cycle de plus pour initialiser un
registre à 1 ? On demande un électronicien dans la salle...


Et puis, on gagne en place pour stocker l'index: pour référencer 4
éléments, il suffit de 2 bits, alors que 4 s'écrit avec 3 chiffres binaires.

--
Amaury


Méta-MCI \(MVP\)
Le #651656
Bonsoir !


Je pense que la raison (l'origine), c'est simplement les USA. Ils avaient pris l'habitude de
commencer à partir de zéro, et cette habitude s'est retrouvée dans les langages.

Je me souviens encore des terminaux qui, en mode "européen" commençaient à (1,1), en bas à gauche
(comme des graphiques avec abscisses et ordonnées), et, en mode "US", commençaient à (0,0), en haut
à gauche. Un micro-switch permettait de passer de l'un à l'autre. L'habitude US l'a emporté...
C'est comme la taille des écrans en pouces, à l'encontre du système international, etc. etc.


Si on pouvait choisir (le choix existe dans certains langages), je préfèrerais commencer à 1. Et le
dernier élément d'un tableau de longueur 4 serait le 4e élément.
Mais, bon, on ne va pas changer Python pour ça...


@+

MCI
Publicité
Poster une réponse
Anonyme