如何让用户结束程序和班次列表

时间:2017-11-18 01:41:58

标签: python

我正在尝试制作加密程序

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中编码,所以任何帮助都会受到赞赏!初学者

3 个答案:

答案 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?