我需要帮助弄清楚我做错了什么。我是学习Python的新手,这是我正在学习的课程中的一个问题。我试图在互联网上获得其他用户的帮助,我认为我非常接近完成这个问题。
This question与我的要求类似,但我没有看到我追求的答案。
课程的问题如下:
Message类包含可用于将密码应用于字符串的方法,用于加密或解密消息(因为对于Caesar代码,这是相同的操作)。
在接下来的两个问题中,您将根据文档字符串中的规范填写Message
中ps6.py
类的方法。已经填写的Message
类中的方法是:
__ init__(self, text)
getter方法get_message_text(self)
getter方法get_valid_words(self)
,请注意此方法返回self.valid_words
的副本,以防止有人改变原始列表。
在这个问题中,您将填写两种方法:
填写Message类的build_shift_dict(self, shift)
方法。确保您的字典包括小写和大写字母,但小写字母及其大写字母的移位字符是相同字母的较低和大写实例。这意味着,如果原始字母是" a"它的移位值是" c",字母" A"应该转到字母" C"。
如果您不熟悉英文字母的排序或字符,我们将遵循string.ascii_lowercase
和string.ascii_uppercase
显示的字母顺序:
>>> import string
>>> print string.ascii_lowercase
abcdefghijklmnopqrstuvwxyz
>>> print string.ascii_uppercase
ABCDEFGHIJKLMNOPQRSTUVWXYZ
来自简介页面的提醒 - 空格字符,逗号,句号,感叹号等字符不会被此密码加密 - 基本上,string.punctuation
中的所有字符加上空格(& #39;')以及string.digits
中找到的所有数字字符(0 - 9)。
填写Message类的apply_shift(self, shift)
方法。您可能会发现使用build_shift_dict(self, shift)
更容易。请记住,密码不应更改空格和标点符号。
到目前为止我尝试过:
class Message (object):
def __init__(self, text):
'''
Initializes a Message object
text (string): the message's text
a Message object has two attributes:
self.message_text (string, determined by input text)
self.valid_words (list, determined using helper function load_words
'''
self.message_text = text
self.valid_words = load_words(WORDLIST_FILENAME)
def build_shift_dict(self, shift):
dict = {}
stringLower = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
stringUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
pos1 = 0
for letter in stringLower[0:26]:
offset1 = pos1 + shift
dict[letter] = stringLower[offset1]
pos1 += 1
pos2 = 0
for letter in stringUpper[0:26]:
offset2 = pos2 + shift
dict[letter] = stringUpper[offset2]
pos2 += 1
return dict
def punct_handler(text, dict):
stringLower = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
stringUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ'
temp = []
s = 0
t = 1
while t <= len(text):
if text[s:t] in '12!@#$%;:, <>^&*.?/\0123456789':
temp.append(text[s:t])
else:
val = text[s:t]
temp.append(coder[val])
s += 1
t += 1
return ''.join(temp)
def apply_shift(text, shift):
return punct_handler(text, build_shift_dict(shift))
问题来自最后一位,apply_shift。我得到的错误是:
Traceback (most recent call last):
File "submission.py", line 168, in apply_shift
return punct_handler(text, build_shift_dict(shift))
NameError: global name 'punct_handler' is not defined
代码测试是:
apply_shift on "we are taking 6.00.1x" with random shift
正确的输出应该是:
yg ctg vcmkpi 6.00.1z