如何在python中实现caesar密码?

如何在python中实现caesar密码?,python,while-loop,nested-loops,caesar-cipher,Python,While Loop,Nested Loops,Caesar Cipher,我似乎无法使密码正确工作 我试图在每次进入循环时重置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]) wh

我似乎无法使密码正确工作

我试图在每次进入循环时重置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)
导入系统 file=sys.argv[1] 打开(文件“r”)作为f: filedata=f.read() 旧字符串=文件数据 alp=列表('abcdefghijklmnopqrstuvxyz') i=0 j=0 key=int(sys.argv[2]) 而i
您的while循环看起来不像pythonic。当您尝试使用复杂的东西时,它会使代码变得复杂。尝试像这样使用for in循环:

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
而i

尝试使用简单的特性,Python中有很多特性

这不应该是无限循环,也不是嵌套循环;代码中只有一个循环,无论输入如何,循环都将不可避免地结束。文件read()和write()可能是这需要时间的原因。在您的答案中没有解决OP问题的方法。而且,这看起来不像是一个试图过度复杂化的人的代码,更像是一个熟悉另一种语言的人的代码。如果他在这种情况下不使用i和j索引,如果你试图给他一个方向,它也可以解决问题,给他一个线索,告诉他什么是错误,还有像现在这样的最佳实践?谢谢你给我一个线索)