我在做一个凯撒密码的项目。我接受用户的输入,把它变成一个列表,去掉空格,然后加密字母。
我的问题是:如何将这些空格重新添加到最终的加密消息中?
以下是我迄今为止所取得的成就(假装单词=消息)
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
en_de = input("Do you want to encrypt or decrypt your message? ")
word = input("Enter a word: ")
shift = input("Enter a number: ")
word = list(word)
indexes = []
def encrypt():
for letters in word:
if letters in alphabet:
index = (alphabet.index(letters))
int(index)
indexes.append(index)
print(indexes)
n = 0
n = n + int(shift)
for i in range(len(indexes)):
indexes[i] = indexes[i] + n
print(indexes)
ceaser_cipher = ''
for i in indexes:
if i > len(alphabet)-1:
i %= len(alphabet)
ceaser_cipher = ceaser_cipher + (alphabet[i])
for
print(ceaser_cipher)
def decrypt():
for letters in word:
index = (alphabet.index(letters))
int(index)
indexes.append(index)
print(indexes)
n = 0
n = n + int(shift)
for i in range(len(indexes)):
indexes[i] = indexes[i] - n
print(indexes)
ceaser_cipher = ''
for i in indexes:
if i > len(alphabet)-1:
i %= len(alphabet)
ceaser_cipher = ceaser_cipher + (alphabet[i])
print(ceaser_cipher)
if en_de == "encrypt":
encrypt()
elif en_de == "decrypt":
decrypt()
2条答案
按热度按时间dz6r00yl1#
我想要的结构是这样的:
最终的程序可能看起来像这样:
mznpcxlj2#
你在学习的道路上是正确的,@Toby的回答对你来说是一个很好的贡献。
我想在这里逗你玩,让你知道,一旦你熟悉了许多其他Python特性和语法,整个"Caesar Cipher"可以在一行程序中完全实现。
看看这个
示例:
说明:
''.join(seq)
接受一个字符串序列seq
并将它们连接成一个字符串;ord(c)
给出字符c
在Unicode表中的索引。例如,ord('a')
返回整数97
,ord('A')
返回整数65
;chr(i)
是ord
的逆:它给出Unicode表中索引i
处的字符。例如,chr(122)
返回字符串'z'
,chr(90)
返回字符串'Z'
;... for c in word
是generator expression。是一个很好的简洁高效的习惯用法,用于从另一个序列创建一个序列。在本例中,我取字符串word
中的每个字符c
,执行一个操作,并使用每个结果元素创建一个新序列。... if ... else ...
是三元运算符。这是在表达式中嵌入条件的快捷方式。这里,如果字符索引不在65到90(大写字母)之间,也不在97到122(小写字母)之间,我将返回相同的字符c
。这使得任何非字母都不会被密码转换(如空格、逗号或感叹号);x <= y <= z
是一个链式比较,这是Python中一个很好的习惯用法,类似于Math条件表达式。(a := 65)
和(i := ord(c))
使用了walrus运算符:=,也就是“赋值表达式”。这样,你就可以在表达式中使用变量的同时赋值它,并且这个变量将在声明后的封闭上下文中使用。例如,i
在or
运算符的左侧赋值,并在右侧使用。此外,a
在条件的“test”部分中赋值,并在“expression”部分中使用。chr(a + (i - a + shift) % 26)
使用python的运算符%执行modulo operation,其中26
是从A到Z的字母计数。这意味着,如果你的shift
让你的字母溢出了字母表,它会循环回到开头/结尾。例如,'B'
与-4
的位移产生'X'
,而'x'
与+30
的位移产生'b'
(因为30 = 26 + 4
);这是一个相当人为的实现,但希望你今天能了解一些关于python的新东西!