Я сделал два изменения в вашем коде.
1. При первом редактировании вы можете анализировать ключи и значения, не спрашивая пользователя, сколько он хочет, используя while True
и останавливаяпри поиске команды выхода (например, строка stop
).
Существует также проверка длины (keyLetter
- это один символ, valueNum
- это одна цифра, благодаря двум while len() != 1
, побуждающим пользователя снова ввести значение, если они потерпели неудачу раньше)
Это субъективно ;если вам нужен фиксированный размер, используйте код.
def build_encrypt_code():
d1 = {}
exitCmd = 'stop'
print('Enter {} to interrupt parsing'.format(exitCmd))
while True:
keyLetter = ''
while len(keyLetter) != 1:
keyLetter = str(input("Please enter a char to represent a key: "))
if keyLetter.lower() == exitCmd:
break
valueNum = ''
while len(str(valueNum)) != 1:
valueNum = int(input("please enter a digit to represent the key's value: "))
d1[keyLetter] = valueNum
return d1
2. Второе редактирование, однако, обязательно , и в этом месте происходит сбой программного обеспечения.
def encrypt(d1, strToEncrypt):
for i in strToEncrypt:
if i == d1.keys():
encrpytedStr = strToEncrypt.replace(i, d1[i])
return encrpytedStr
else:
return i
В этой функции вы циклически переключаетесь между всеми символами в вашей строке (i
является символом), а затем сравниваете символ сKeysView.Кроме того, вы затем возвращаетесь в if, но при этом он будет выполнять только цикл, а затем прерываться (и, поскольку условие if всегда ложно, ваш encryptedStr
всегда будет вашим первым символом).
Это рабочий код для функции шифрования:
def encrypt(d1, strToEncrypt):
encryptedStr = strToEncrypt
for char in strToEncrypt:
if char in d1.keys():
encryptedStr = encryptedStr.replace(char, str(d1[char]))
return encryptedStr
Мы циклически повторяем каждый символ, и если это in
KeysView, вы можете заменить этот символ строковой версией своего номера (связанной с этим символом).), а затем в конце for вы можете вернуть зашифрованную строку.