这个程序要求用户输入一个单词列表。然后,它返回一个加密单词列表和第二个列表,该列表指定用于加密这些单词的数字移位。这个想法是从https://www.khanacademy.org/computing/computer-science/cryptography/crypt/v/one-time-pad得到的。
import random
def rotate_letter(letter, number):
if letter == ' ':
return letter
if letter.islower():
start = ord('a')
elif not letter.islower():
start = ord('A')
normal_shift = ord(letter) - start
new_letter = start + (normal_shift + number) % 26
return chr(new_letter)
def avoid(letter):
avoid = ' ,!?¿,*+-%/@1234567890'
for i in avoid:
if i == letter:
return False
return True
def rotate_word(word):
new_word = ''
random_series = []
for letter in word:
if avoid(letter):
random_number = random.randint(1,26)
new_letter = rotate_letter(letter, random_number)
new_word += new_letter
random_series.append(random_number)
else:
new_word += letter
return (new_word, random_series)
def shift(words):
index = 0
encrypted_words = []
random_shifts = []
while index < len(words):
(new_word, random_series) = rotate_word(words[index])
encrypted_words.append(new_word)
random_shifts.append(random_series)
index += 1
return (encrypted_words, random_shifts)
def get_input():
words = []
while True:
user = (input('Input words to encrypt. Done when ready \n' ))
if user == 'Done' or user == 'done':
return words
words.append(user)
def start():
words = get_input()
encrypted_words = []
random_shifts = []
(encrypted_words, random_shifts) = shift(words)
print('UNENCRYPTED WORDS', words)
print('ENCRYPTED WORDS', encrypted_words)
print('RANDOM SHIFTS', random_shifts)
start()发布于 2017-01-06 22:09:26
您的函数avoid是非常不必要的,也是令人困惑的。我希望avoid('@')返回True。当您将字母存储为全局常量和设置时,您应该获得一定的速度(因为它不需要一次又一次地重构,而且对于set来说成员资格测试非常快。我用letter not in letters_avoid代替了你的功能。
每当您在Python中进行字符串添加时,您可能做错了什么。这是因为字符串是不可变的,所以每次添加时都必须创建一个新字符串,并且需要复制要添加的字符串的内容。这太慢了。相反,可以使用list来积累new_word的字母,并在结尾处对它们进行str.join。
返回tuple时,()是隐式的。你可以直接写return a, b。
在words上迭代时,您应该直接迭代它,而不是它的索引。
使用str.lower可以将双比较if user == 'Done' or user == 'done'减少到if user.lower() == 'done':。
您应该使用if __name__ == '__main__':保护来调用您的代码,以便在不执行整个脚本的情况下从另一个脚本导入您的函数。
import random
letters_avoid = set(' ,!?¿,*+-%/@1234567890')
def rotate_letter(letter, number):
if letter == ' ':
return letter
if letter.islower():
start = ord('a')
elif not letter.islower():
start = ord('A')
normal_shift = ord(letter) - start
new_letter = start + (normal_shift + number) % 26
return chr(new_letter)
def rotate_word(word):
new_word = []
random_series = []
for letter in word:
if letter not in letters_avoid:
random_number = random.randint(1, 26)
new_word.append(rotate_letter(letter, random_number))
random_series.append(random_number)
else:
new_word.append(letter)
return "".join(new_word), random_series
def shift(words):
encrypted_words = []
random_shifts = []
for word in words:
new_word, random_series = rotate_word(word)
encrypted_words.append(new_word)
random_shifts.append(random_series)
return encrypted_words, random_shifts
def get_input():
words = []
while True:
user = input('Input words to encrypt. Done when ready \n')
if user.lower() == 'done':
return words
words.append(user)
def start():
words = get_input()
encrypted_words, random_shifts = shift(words)
print('UNENCRYPTED WORDS', words)
print('ENCRYPTED WORDS', encrypted_words)
print('RANDOM SHIFTS', random_shifts)
if __name__ == "__main__":
start()https://codereview.stackexchange.com/questions/151916
复制相似问题