带有TypeError的Python问题:+不支持的操作数类型:“ int”和“ str”

时间:2019-05-04 03:03:47

标签: python cs50

我是整个编程世界的新手,在进行cs50的caesar练习时遇到了Python问题。我不知道出了什么问题,非常感谢您的帮助!

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 个答案:

答案 0 :(得分:1)

我认为变量x是一个字符串。将argv[1]替换为int(argv[1])

答案 1 :(得分:1)

您试图在数学上添加一个整数和一个字符串或一段文本。该文本可能看起来像“ 5”,但在计算机上是一个字符,代表一个书面的5,而不是文字数字5。通常,当某些内容需要用户输入,例如input()或运行时参数,默认情况下将其视为类型string

您希望使用int()float()函数,以使x = int(argv[1])将字符串中的数字转换为实际数字。 (对于小数点后的数字又称为“浮点数”,为float())显然,如果您输入的内容不是数字,则这些字符会中断。

答案 2 :(得分:0)

列表sys.argv为您提供了一个字符串列表,当您执行x = argv[1]时,x成为字符串。

现在,当您尝试执行lower = (((ord(n[i]) - 97 + x) % 26)) + 97时,您试图添加一个整数和一个字符串,这是不可能的,因此,您需要在代码中进行的唯一更改是确保输入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