CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Python] Problème "String index"

Xemantikk
Xemantikk
Niveau 4
21 février 2017 à 21:24:58

Bonjour, je souhaite faire un programme qui consiste à remplacer les majuscules par des minuscules et inversement à l'aide de la table de code ASCII. Cependant j'ai un soucis dans mon programme :


i = 0

chaine = raw_input("Chaine de caractères : ")
l = len(chaine)

while i<=l:
    b = chaine[i]
    c = ord(b)
    i = i+1
if 65<=c<=90:
    chaine.lower()
else:
    chaine.upper()

Un message d'erreur apparait au niveau du b = chaine[i] me disant :''' " IndexError: string index out of range "

Quelle serait la solution ?

MrGreez94
MrGreez94
Niveau 10
21 février 2017 à 21:49:17

A moins que ce soit le réel objectif de l'exercice, sache qu'il y a déjà des fonctions qui font ça, notamment swapcase()

Ex :

chaine = aBcDeF
print(chaine.swapcase())

output : AbCdEf

Cj1993
Cj1993
Niveau 12
21 février 2017 à 21:54:48

Ta boucle va jusqu'à i = L sauf que chaine[L] existe pas

Message édité le 21 février 2017 à 21:56:12 par Cj1993
Xemantikk
Xemantikk
Niveau 4
21 février 2017 à 22:09:33

Le 21 février 2017 à 21:49:17 MrGreez94 a écrit :
A moins que ce soit le réel objectif de l'exercice, sache qu'il y a déjà des fonctions qui font ça, notamment swapcase()

Ex :

chaine = aBcDeF
print(chaine.swapcase())

output : AbCdEf

Oui c'est l'objectif de l'exercice.

Le 21 février 2017 à 21:54:48 Cj1993 a écrit :
Ta boucle va jusqu'à i = L sauf que chaine[L] existe pas

Du coup la solution serait de mettre l-1 au lieu de l ?

Grymmis
Grymmis
Niveau 19
21 février 2017 à 22:42:04

Oui, l-1 au lieu de l.
Mais honnêtement, ton programme est très mal conçu.

D'abord, on passera sur le fait que tu utilises Python 2.X plutôt que Python 3.X ( sûrement car tes professeurs t'ont imposé ce choix, ce qui est dommage... étant donné que passer à la dernière version ne coûte rien )... C'est pas si grave.

Mais ce qui l'est plus, c'est ton choix de boucle :
En algorithmique, on distingue généralement deux types de boucles : les boucles " Pour " ( = for en anglais ), qu'on utilise lorsque l'on connait le nombre d'itérations ( = tour de boucle ) qu'il faut réaliser, et les boucles " Tant Que " ( = while en anglais ) qui tourneront tant qu'une certaine condition est valide... On les utilise que lorsque nous ne pouvons pas savoir à l'avance le nombre de tours maximum que l'on va réaliser.

Or, là, tu connais le nombre de tours que l'on va réaliser : c'est la longueur de ta chaine.
Du coup, l'utilisation d'une boucle Tant Que est inappropriée.

Et d'un point de vue plus pythonique, les boucles Pour en Python sont des boucles for ... in ..., c'est à dire qu'elles parcourent un objet dit " itérable ". En l’occurrence, elles peuvent parcourir une chaine de caractères ( caractère par caractère )... Ce qui est exactement ce que tu veux.

Ton programme s'écrirait donc plus de la forme :

for i in chaine: #A chaque tour de boucle, i prend la valeur du caractère suivant de la boucle #Les actions que tu veux réaliser #La boucle se termine quand le parcours de la chaine est terminé...

Bref, tu n'avais peut-être pas vu ça en cours, mais ça me semblait nécessaire de préciser que l'usage d'une boucle Tant Que est inapproprié... Tu as déjà probablement vu la nuance entre les deux boucles en cours....

( et dernier point je sais pas si c'est un mauvais C/C, mais ta condition doit être à l'intérieur de ta boucle hein... Tu veux qu'elle s'exécute pour chaque caractère... Pas seulement pour le dernier ( de toute façon ça ne marcherait pas :hap: ) )

Xemantikk
Xemantikk
Niveau 4
21 février 2017 à 22:54:20

Merci beaucoup Grymmis, je pense que cela va beaucoup m'aider pour améliorer mon programme, voir recommencer du début ^^.

Je vais regarder pour passer sur Python 3.X et oui ma condition en fin de programme est initialement dans la boucle (Problème C/C)

Grymmis
Grymmis
Niveau 19
23 février 2017 à 02:18:22

Nan mais te casse pas la tête pour Python 3.X, si ton / tes profs travaille(nt) avec Python 2.X, reste sur Python 2.X, ça risque de te poser quelques soucis sinon.

C'était juste une remarque que je me faisais à moi même, je trouve ça dommage... J'ai encore jamais entendu parler de profs travaillant avec Python 3.X, alors que cette version n'est pourtant pas si récente...

De rien sinon, je me sentais obligé d'intervenir... Parce que tu ne te serais pas rendu compte du problème, étant donné que ton programme allait fonctionner correctement.... Mais comme on le rabâche souvent, coder, c'est pas simplement produire quelque chose qui fonctionne... Faut-il aussi que ce soit juste. :ok:

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment