我正在尝试制作加密程序
def intro():
msg = input("Enter the message you wish to encrypt: ")
return msg
def shift(msg):
alpha = ['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']
rotate = int(input("The level of the encryption?: "))
text = ""
for ch in msg:
if ch == " " or ch == ".":
pass
elif msg == "$":
print("nah")
else:
index = alpha.index(ch)
newindex = index + rotate
new= alpha[newindex]
text += new
return text
def start():
msg = intro()
text = shift(msg)
print("Your encryptions is: " + text)
start()
我无法找到一种方法来循环列表而不会导致索引超出范围错误。例如,如果你输入“z”,它将转换为“a”。我还需要让我的程序循环直到用户输入结束它。几个月前我刚刚开始在python中编码,所以任何帮助都会受到赞赏!初学者
答案 0 :(得分:1)
newindex %= len(alpha)
详细更改(使用上下文)
index = alpha.index(ch)
newindex = index + rotate
new= alpha[newindex]
text += new
到
index = alpha.index(ch)
newindex = index + rotate
newindex %= len(alpha) # <--- this is the new line
new= alpha[newindex]
text += new
这会自动使新的索引循环,所以它永远不会超过结束!
工作示例
>> Enter the message you wish to encrypt: 'xyz'
>> The level of the encryption?: 2
>> Your encryptions is: zab
答案 1 :(得分:0)
使用模数运算符将索引包围在列表长度之外:
newindex = (index + rotate) % len(alpha)
要重复,请使用while True:
循环,然后使用break
结束它。
def start():
while True:
msg = intro()
if msg == '':
break
text = shift(msg)
print("Your encryptions is: " + text)
当用户输入空行时,这将结束。
答案 2 :(得分:0)
由于您的代码运行正常,我可以告诉您一些可以用来获得所需功能的技术。
要获得循环的数组,可以使用mod系统。例如,8 mod 3 = 2,它将被编码为remainder = 8 % 3
。如果您有一个mod大小为26,即字母表,您可以取总数的余数并将其用作字母表列表中的索引。当总数大于26并且在a处再次开始时,这将循环。
要使程序以用户输入结束,您可以使用各种方法,如键盘中断,识别某些命令,如ctrl-c或整个单词。这是从之前的stackoverflow问题开始。 How to kill a while loop with a keystroke?