2017-08-15 110 views
-4

我刚开始Python和我被困在一个愚蠢的错误,但我不明白为什么它不工作问:python:为什么我的char被视为str?

def encryption(str1): 
    i = 0 
    for x in str1: 
     if (x >= 'a' and x <= 'z' or x >= 'A' and x <= 'Z'): 
      str1[i] = str1[i] + 3 % 26 #str[i] = x + 3 % 26 
     i+=1 
    return str1 

当我执行该程序,我得到这个错误:

TypeError: string indices must be integers, not str.

灿有人向我解释为什么str [i] - 23被认为是str?对我来说,我只是修改了char的ascii值。

+2

这不是C,尝试'ORD(STR1 [I])'得到ASCII字符的值。为什么混合指数与'x'?并且错误似乎在其他地方... –

+0

并在发布之前修复您的缩进。 –

+0

请记住,字符串是immutable –

回答

1

python中的字符串不是像C中的数组。它们是不可变的,即 您无法对字符串进行适当的更改。你的选项是将 这个字符串转换成一个列表(类似于一个c数组)或者创建一个新的空字符串 并将每个加密的字母连接到它(这可能会更快)。 Ord将字符串转换为ascii数字并且chr转换反转。 的因而isalpha方法测试真当且仅当该字符是在{A-Z A-Z}

str1 = 'this is a test [email protected]#[email protected]#[email protected]' 

def encryption(str1): 
    new_string = '' 
    for character in str1: 
     if character.isalpha(): 
      new_string += chr(ord(character) + 3 % 26) 
     else: 
      new_string += character 
    return new_string 

print(encryption(str1)) 
+0

噢好吧,以及我认为我会做一个大蟒蛇字符串训练会话,但我没有注意到python和C字符串之间的差别很大。好吧,谢谢。 – Cjdcoy

+0

主要的区别是不可抵抗性。您可以索引字符串,就像在C中一样,但不能更改单个字符元素。如果你想把它变成一个伪C数组,做一个列表理解数组= [[x for string in string]],然后在使用“”.join(array)后修改它。虽然,我的答案中的方法将更快,更pythonic。 – Rosh

+0

是的我没有做python模仿c,所以我会尝试像你一样推理。 – Cjdcoy

相关问题