我已经用Java完成了Caesar密码的加密代码,我的计划是使用相同的逻辑在Python中重写程序。虽然可以通过多种方式完成,但我有什么方法可以使用与 Python 中的 StringBuilder 等效的东西吗?如果我在 Python 中有一个存储字符串值的 hold 变量,那么我如何以类似于下面 Java 中的方式附加新字符或字符串?
static String encrypt(String s, int shift)
{
shift = shift % 26 + 26;
StringBuilder hold = new StringBuilder();
for (char i : s.toCharArray())
{
if (Character.isLetter(i))
{
if (Character.isUpperCase(i))
hold.append((char)('A' + (i - 'A' + shift) % 26 ));
else
hold.append((char)('a' + (i - 'a' + shift) % 26 ));
}
else
hold.append(i);
}
return hold.toString();
}
您可以使用字符串的直接列表转换,然后使用 ord()/chr() 函数来弄乱单个字符的 ASCII 值。
字符串是不可变的,但列表不可变。 你可以在 Python 中很好地连接字符串,字符串可以通过列表转换和使用 split() 和 join() 重新转换来更改。
Python 字符串还有给出布尔值的 isupper()、islower()、isdigit() 和 isalpha() 方法。
我现在无法对此进行测试,因为我不完全理解您的密码,但我认为它接近于复制您的 JAVA 代码。 您可能希望稍微调整密码位。
def encrypt(encryptString, shift):
shift = shift % 26 + 26
stringList = list(encryptString)
for eachCharacter in stringList:
if eachCharacter.isalpha() == True:
if eachCharacter.isupper() == True:
eachCharacter = chr( ( ord('A') + ord(eachCharacter) - ord('A') + shift) % 26)
else:
eachCharacter = chr( ( ord('a') + ord(eachCharacter) - ord('a') + shift) % 26)
encryptString = ''.join(stringList)
return encryptString
我建议使用字符列表,即
>>> x = ['a', 'b', 'c']
>>> x
['a', 'b', 'c']
>>> x.append('d')
>>> x += ['e', 'f']
>>> x
['a', 'b', 'c', 'd', 'e', 'f']
>>> "".join(x)
'abcdef'