2
votes

Problème Python avec TypeError: type (s) d'opérande non pris en charge pour +: 'int' et 'str'

Je suis nouveau dans le monde de la programmation, j'ai rencontré un problème avec Python lors de l'exercice César de cs50. Je ne pouvais pas comprendre ce qui n'allait pas, apprécions grandement votre aide!

Traceback (most recent call last):
  File "caesar.py", line 14, in <module>
    lower = (((ord(n[i]) - 97 + x) % 26)) + 97
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Il est prévu dans la fenêtre du terminal que:

python caesar.py 1
plaintext: hi
ij

Mais il dit:

from cs50 import get_string
from sys import argv

if len(argv) != 2:
    print("only input one integer")

x = argv[1]

n = get_string("plaintext: ")

for i in range(len(n)):

if str.islower(n[i]):
    lower = (((ord(n[i]) - 97 + x) % 26)) + 97
    print(chr(lower), end="")

elif str.isupper(n[i]):
    upper = (((ord(n[i]) - 65) + x) % 26) + 65
    print(chr(upper), end="")

else:
    print(f"{n[i]}", end="")


2 commentaires

Le problème n'est pas avec Python! Python est fortement typé, ce qui signifie que l'application de l'opérateur + à une chaîne et à un nombre entraînera une erreur (celle que vous obtenez). Soit convertir le nombre en chaîne (à concaténer) ou la chaîne en nombre (à ajouter)


Quel est le type de "x"? Cette erreur est due au fait que vous essayez d'ajouter une valeur entière avec une valeur de chaîne. Vous devez vous assurer que tous les opérandes de votre opération "+" sont du même type, des entiers si vous voulez les ajouter ou des chaînes si vous voulez les concaténer.


3 Réponses :


1
votes

Je pense que la variable x est une chaîne. remplacez argv [1] par int (argv [1]) .


5 commentaires

Ne pense pas, c'est une ficelle


Eh bien, il entre 1 dans le terminal mais il est lu comme une chaîne, je pense. Pas sûr cependant.


argv est une liste de chaînes avec les arguments donnés par qui exécute le fichier, par exemple python myfile a b c , dans ce cas argv = ['a', 'b', 'c'] . C'est à vous comment interpréter ces valeurs.


Donc vous pensez qu'il est lu comme un entier ici ... L'avez-vous réellement testé? Intéressant!


Non, x est lu comme une chaîne et vous devez le convertir en int (comme vous le faites)



1
votes

Vous essayez d'ajouter mathématiquement un entier et une chaîne, ou un morceau de texte. Ce texte peut ressembler à un "5" mais pour l'ordinateur, c'est un caractère qui représente un 5 écrit, pas le nombre littéral 5. Typiquement, quand quelque chose prend une entrée utilisateur comme un input () < / code> ou en prenant un argument d'exécution, il le prend par défaut comme type string .

vous voulez les fonctions int () ou float () telles que x = int (argv [1]) qui transformera un nombre dans une chaîne en un nombre réel. (float () pour les nombres à virgule décimale aka "virgule flottante") Évidemment, ceux-ci seront cassés si vous entrez quelque chose qui n'est pas censé être un nombre.


0 commentaires

1
votes

La liste sys.argv vous donne une liste de chaînes, et lorsque vous faites x = argv [1] , x devient une chaîne.

Maintenant, quand vous essayez de faire lower = (((ord (n [i]) - 97 + x)% 26)) + 97 , vous essayez d'ajouter un entier et une chaîne, ce qui n'est pas possible , donc le seul changement que vous devez faire dans votre code est de vous assurer que l'entrée x que vous prenez est un entier, ce que vous pouvez faire en utilisant x = int (argv [1]) p>

Donc votre code final devient

plaintext: hi
ij

La sortie s'affiche comme prévu maintenant

from cs50 import get_string
from sys import argv

if len(argv) != 2:
    print("only input one integer")

#Changed this! Now x is an integer, since you convert the string in argv[1] to an integer
x = int(argv[1])

n = get_string("plaintext: ")

for i in range(len(n)):

    if str.islower(n[i]):
        lower = (((ord(n[i]) - 97 + x) % 26)) + 97
        print(chr(lower), end="")

    elif str.isupper(n[i]):
        upper = (((ord(n[i]) - 65) + x) % 26) + 65
        print(chr(upper), end="")

    else:
        print(f"{n[i]}", end="")


0 commentaires