Я хочу создать программу для шифрования целого слова с помощью шифра Виженера. До сих пор я могу зашифровать только одну букву за раз.
Мой код до сих пор:
def alpha(shift):
initial_letter = 97 + shift
alpha_list_shift = (list(map(chr, range(initial_letter, 123))))
alpha_list_rest = (list(map(chr, range(97, initial_letter))))
return alpha_list_shift + alpha_list_rest
def encrypt(char_str, char_key):
column_line_alpha = alpha(0)
index_char_key = column_line_alpha.index(char_key)
index_char_str = column_line_alpha.index(char_str)
column_line_alpha_2 = alpha(index_char_key)
return column_line_alpha_2[index_char_str]
Да, точно! Извините за мой плохой английский
Без проблем! Я просто хотел убедиться, прежде чем отвечать на неправильный вопрос :)
@toRex Да! Но, если хотите, каждый отзыв может помочь мне стать лучше. Разные взгляды :)
Краткий ответ: encrypted_string = "".join([encrypt(chr, key) for chr in string_you_want_to_encrypt])
Более длинный ответ: у Python есть много прекрасных (для меня) способов элегантной работы со списками, и, поскольку строки утыкаются в списки, вы можете использовать синтаксис «понимания списка» для динамического создания нового списка из вашей строки, затем преобразуйте его обратно в строку, используя собственный метод "join" типа String, который объединит все элементы в итерируемом объекте (например, в списке), склеив их вместе с рассматриваемой строкой. Итак, "".join(['x', '2', '#'])
вернет строку "x2#"
. Понимание списка позволяет вам вызывать метод для каждого элемента по мере его итерации, поэтому мы можем вызывать вашу функцию для каждого элемента, и результат будет в списке, возвращенном пониманием списка, а затем сшит обратно в строку с помощью join()
.
Лучший ответ: может быть веская причина, по которой encrypt
принимает по одному символу за раз, но тогда каждый раз, когда вы его вызываете, вам приходится обрабатывать цикл, и это может сделать ваш код немного чище/менее повторяющимся, если вы перепишете encrypt
, чтобы взять целая струна. Затем вы можете поместить цикл внутри своего метода примерно так:
encrypted_string = ""
for letter in input_string:
# [your encryption code]
encrypted_string += newly_encrypted_character
Как правило, в Python вам не нужно делать что-то похожее на C, где вы создаете цикл, который использует целые числа для отслеживания вашей позиции в строке (или любой другой итерации, такой как кортеж или список). «for <item> in <iterable>
» должен сделать всю работу за вас.
расширил краткий ответ :)
Спасибо! Это помогло! :)
Является ли вопрос примерно таким: «Как я могу вызвать
encrypt()
для каждого символа в строке и сохранить результат в другой строке?»