Python问题:TypeError:不支持的操作数类型'+': 'int'和'str'

4

我是新手,刚接触编程领域。在完成cs50的凯撒密码练习时,遇到了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'

问题不在于Python!Python是强类型的,这意味着将+运算符应用于字符串和数字会导致错误(您正在遇到的错误)。要么将数字转换为字符串(以进行连接),要么将字符串转换为数字(以进行加法)。 - dcg
“x”的类型是什么?这个错误是由于您试图将整数值与字符串值相加而导致的。您必须确保“+”操作的所有操作数都是相同类型的,如果要添加它们,则为整数,如果要连接它们,则为字符串。 - Pedram
3个回答

1
列表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

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

不要思考,它是一个字符串。 - dcg
他在终端输入了1,但我认为它被识别为字符串。不过我不太确定。 - pdrersin
argv 是一个字符串列表,其中包含运行文件的人给出的参数,例如 python myfile a b c,在这种情况下,argv = ['a', 'b', 'c']。你可以自行解释这些值的含义。 - dcg
所以你认为这里被读取为整数了...你真的测试过吗?有趣! - pdrersin
不,x 被读取为字符串,你需要将其转换为整数(就像你正在做的那样)。 - dcg

1
你正在尝试将整数和字符串或文本相加。该文本可能看起来像一个"5",但对于计算机来说,它是代表写成的5的字符,而不是字面上的数字5。通常情况下,当某些东西接受用户输入,例如input()或运行时参数时,默认将其作为string类型处理。

你需要使用int()float()函数,例如x = int(argv[1]),这将把字符串中的数字转换为实际数字。(对于有小数点的数字,即“浮点数”,请使用float())显然,如果输入的内容不是数字,则会出现错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接