Как я могу внедрить шифр Цезаря в python? - PullRequest
0 голосов
/ 26 апреля 2020

Я не могу заставить шифр работать правильно.

Я пытаюсь сбрасывать значение j каждый раз, когда оно входит в l oop, но оно просто застревает в бесконечном l oop. Кроме того, что я должен сделать, чтобы заменить каждую букву в файле указанной буквой?

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)

1 Ответ

1 голос
/ 26 апреля 2020

Ваше время l oop не похоже на pythoni c. Когда вы пытаетесь использовать сложные вещи, это усложняет ваш код. Попробуйте использовать for в l oop следующим образом:

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

И вам не нужно использовать в нем индекс i и j.

Но если вы хотите использовать "while "l oop, сделайте это

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

...