Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

explication source inversion de chaine ?

38 réponses
Avatar
Eastwind - Vent d Est
dans le livre de swinnen l exercice suivant est propos=E9 :

5=2E9. =C9crivez un script qui recopie une cha=EEne (dans une nouvelle
variable) en l'inversant.
Ainsi par exemple, =AB zorglub =BB deviendra =AB bulgroz =BB.

La solution donn=E9e par l'auteur :

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

# Inversion d'une cha=EEne de caract=E8res

# Cha=EEne fournie au d=E9part :
ch =3D raw_input ('entrer un mot: ' )
lc =3D len(ch) # nombre de caract=E8res total
i =3D lc - 1 # le traitement commencera =E0 partir du dernier
caract=E8re
nch =3D "" # nouvelle cha=EEne =E0 construire (vide au d =E9part)
while i >=3D 0:
nch =3D nch + ch[i]
i =3D i - 1
# Affichage :
print nch

ca marche mais je ne comprend pas pourquoi la variable "i" est
encapsul=E9 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 =E9crit que
c'est pour commencer par le dernier caract=E8re , mais si l'on enl=E8ve
1 , ne commence t-on pas avec l'avant dernier caract=E8re ?

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 =3D nch + ch[i]
IndexError: string index out of range



quelqu'un peut m'expliquer ? j'ai d=E9j=E0 chercher le nom de l erreur
mais elle pas trop compr=E9hensible a ce niveau ..

merci

10 réponses

1 2 3 4
Avatar
Mihamina (R12y) Rakotomandimby
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]
<type 'exceptions.IndexError'>: string index out of range

Avatar
Bruno Desthuilliers
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 !-)



Avatar
jean-michel bain-cornu
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...

Avatar
Bruno Desthuilliers
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.


Avatar
jean-michel bain-cornu
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



Avatar
Bruno Desthuilliers
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 !-)




Avatar
MC
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

Avatar
jean-michel bain-cornu
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...

Avatar
Amaury Forgeot d'Arc
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


Avatar
Méta-MCI \(MVP\)
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
1 2 3 4