我如何将凯撒密码实现为python?

问题描述 投票:0回答:1

我似乎无法使密码正常工作。我试图在每次进入循环时重置j的值,但它只会不断陷入无限循环。另外,为了将文件中的每个字母更改为一个新字母(即指定字母),我正在做的正确操作。

import sys
file = sys.argv[1]

with open(file, 'r') as f:
    filedata = f.read()

old_string = filedata

alp = list('abcdefghijklmnopqrstuvwxyz')
i = 0
j = 0
key = int(sys.argv[2])

while i < len(filedata):
    j = 0
    if filedata[i] != alp[j]:
        j+=1

    if filedata[i] == alp[j]:
        k = old_string.rfind(filedata[i])
        if i < (len(alp) - key):
            old_string = old_string[:k] + alp[j+key] + old_string[k+1:]
        else:
            old_string = old_string[:k] + alp[(j+key)%26] + old_string[k+1:]
    i += 1

with open(file, 'w') as f:
    f.write(old_string)
python while-loop nested-loops caesar-cipher
1个回答
0
投票

您的while循环看起来不像pythonic。当您尝试使用复杂的东西时,它会使您的代码变得复杂。尝试像这样在for循环中使用:

for symbol in filedata:
    if symbol.isalpha():
        actions..

而且您不需要在其中使用i和j索引。

但是如果要使用“ while”循环,请执行此操作

while i < len(filedata):
    j = 0
    while j < len(alp):
        if filedata[i] != alp[j]:
            j+=1

        if filedata[i] == alp[j]:
            k = old_string.rfind(filedata[i])
            if i < (len(alp) - key):
                old_string = old_string[:k] + alp[j+key] + old_string[k+1:]
            else:
                old_string = old_string[:k] + alp[(j+key)%26] + old_string[k+1:]
            break
    i += 1

尝试使用简单的功能,Python中有很多功能

© www.soinside.com 2019 - 2024. All rights reserved.