Проблема Python с TypeError: неподдерживаемые типы операндов для +: 'int' и 'str' - PullRequest
1 голос
/ 04 мая 2019

Я новичок во всем мире программирования, я столкнулся с проблемой с Python при выполнении упражнения cesar cs50.Я не мог понять, что пошло не так, высоко ценю вашу помощь!

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="")

Ожидается, что в окне терминала:

python caesar.py 1
plaintext: hi
ij

Но оно говорит:

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'

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Вы пытаетесь математически добавить целое число и строку или фрагмент текста. Этот текст может выглядеть как «5», но для компьютера это символ , который представляет собой записанное 5, а не буквальное число 5. Обычно, когда что-то принимает пользовательский ввод, например input(), или принимает аргумент времени выполнения по умолчанию он принимается как тип string.

Вы хотите, чтобы функции int() или float() были такими, чтобы x = int(argv[1]) превращал число в строке в фактическое число. (float () для десятичных чисел, называемых «плавающей точкой») Очевидно, что они сломаются, если вы введете что-то, что не должно быть числом.

1 голос
/ 04 мая 2019

Список sys.argv дает вам список строк, и когда вы делаете x = argv[1], x становится строкой.

Теперь, когда вы пытаетесь сделать lower = (((ord(n[i]) - 97 + x) % 26)) + 97, вы пытаетесь добавитьinteger и строка, что невозможно, поэтому единственное изменение, которое вам нужно сделать в своем коде, - убедиться, что вводимый вами x является целым числом, что вы можете сделать, используя x = int(argv[1])

Таким образом, ваш окончательный код становится

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="")

Вывод получается, как и ожидалось сейчас

plaintext: hi
ij
1 голос
/ 04 мая 2019

Я думаю, что переменная x является строкой. заменить argv[1] на int(argv[1]).

...