我是python的新手,我真的找不到办法做到这一点。
我想根据某些条件更改字符串的字母。这是代码:
for c in text:
ordChar=ord(c)
if ordChar>=65 and ordChar<=90:
ordChar=ordChar+13
if ordChar>90:
ordChar=ordChar-90+64
c=chr(ordChar)
else:
if ordChar>=97 and ordChar<=122:
ordChar=ordChar+13
if ordChar>122:
ordChar=ordChar-122+96
c=chr(ordChar)
return text
返回的text
值与参数值相同。我认为变量是指针,因此编辑c
时,它应该编辑text
。我做错了什么?
答案 0 :(得分:5)
您不是在“编辑”c
,而是将其分配给其他内容。另一种方法是构建一个新的字符串,而不是试图改变旧字符串(这是不可能的),然后代替c=...
,你会newstr += ...
。
答案 1 :(得分:2)
正如我在评论中所解释的,Python中的字符串不可变,因此您需要创建一个新字符串,不能简单地编辑旧字符串。您的代码可以变为:
new_text = ""
for c in text:
ordChar=ord(c)
if ordChar>=65 and ordChar<=90:
ordChar=ordChar+13
if ordChar>90:
ordChar=ordChar-90+64
c=chr(ordChar)
else:
if ordChar>=97 and ordChar<=122:
ordChar=ordChar+13
if ordChar>122:
ordChar=ordChar-122+96
c=chr(ordChar)
new_text += c
return new_text
答案 2 :(得分:2)
在arshajii和Josh的答案中构建一个新字符串,或者使用map
或列表理解来逐个字符地应用转换。 (无论哪种方式,你都在创建一个新的字符串,而不是转换原始字符串。)
def convert_char(c):
code = ord(c)
if 65 <= code <= 90:
code += 13
if code > 90:
code -= 26
elif 97 <= ord(c) <= 122:
code += 13
if code > 122:
code -= 26
return chr(code)
print ''.join(map(convert_char, "Testing"))
有几种更好的方法可以做到这一点,例如:
def convert_char(c):
if 'a' <= c <= 'z':
return chr(97 + (ord(c) - 6) % 26)
elif 'A' <= c <= 'Z':
return chr(65 + ord(c) % 26)
return c
或
from string import lowercase, uppercase
def convert_char(c):
if c in lowercase:
return lowercase[(lowercase.index(c) + 13) % 26]
if c in uppercase:
return uppercase[(uppercase.index(c) + 13) % 26]
return c
(对早期答案的评论中的链接有更多。)