def substitutionEncrypt1(text,key):
plaintext=text.lower()
alphabet="abcdefghijklmnopqrstuvwxyz "
for ch in plaintext:
r=plaintext.index(ch)
plaintext=plaintext.replace(ch,key[r])
return plaintext
我的短信是“快速棕色狐狸” 我理解为什么python不能正确地加密替换密码,但是为什么python在第五行中抛出一个错误“substring not found”? 我不是在明文中迭代字符吗? 我使用的语言是python
谢谢!在
在你的代码中有几个问题导致它根本没有做你想做的事情。
1。字符串在Python中是不可变的
不能在Python中更改字符串。一旦它被创建,它就保持不变。 您所能做的就是创建一个新的字符串,可能基于原始字符串,然后 给它指定相同的名称。在
例如,可以使用切片表示法在某个索引处分配新元素,从而修改a
list
(可变类型):不能用字符串做到这一点,字符串是不可变的:
^{pr2}$因此,您所能做的就是给
s
分配一个全新的字符串:因此,
upper()
,就像replace()
和所有其他字符串方法一样,在的地方不工作, 而是返回字符串的修改后的副本。在关于原因,请参见Why are Python strings immutable?。基本上可以归结为性能。
2。循环不会迭代
s
。它迭代循环开始时s
的值执行
for item in iterable
操作时,Python将执行以下操作:iterable
指向的值的引用(在循环的开始处)。3。你不应该在迭代可变序列时改变它们
即使
str
是一个可变类型,并且您可以更改它,也决不应该在迭代时更改iterable。在示例:
输出:
如您所见,由于列表大小和项的各自索引在迭代过程中发生了更改,因此跳过了项。在
对于字典,Python甚至会明确地警告您这一点并退出:
输出:
所以,记住这一切,如果你想以你想要的方式实现你的代码,你需要 保持两个变量彼此独立,一个是循环的,另一个是将转换后的结果分配给的。在
但是由于Python已经为这个目的提供了一个^{} 函数(如@scar López的答案中所述),因此您应该使用这个函数。在
你不应该迭代那些同时被修改的东西(不管是列表,集合,还是字典…你明白了),而且字符串是不可变的,所以实际上每次迭代都要创建新的字符串。对于在Python中实现替换密码,没有什么比使用^{} 更容易的了,而且我们可以使转换在两个方向上工作:
相关问题 更多 >
编程相关推荐