python - 使用 for 循环和 if/else 语句创建凯撒密码
问题描述
我必须为我的班级创建一个凯撒密码。规定是我不能导入任何东西,我必须使用 for 循环和 if/else 语句。我的代码已经接近完成,但目前卡住了。该程序当前运行没有抛出任何错误代码,但不输出所需的答案。我附上了下面的代码。目前有两个问题我正在寻求解决方案。首先,我写了一个 if/else 语句来环绕这些值,如果它们低于 65 或高于 96。这是所有必要的,因为输出应该全部大写。但是,这个声明似乎没有做任何事情。我目前不确定这是为什么。其次,代码在每个空格后添加一个字符到输出。我已经告诉代码基本上忽略空格,所以我不知道为什么会这样。例如:如果我的消息是“在黎明攻击虫族”,而我的编码密钥是“3”,则输出应该是“DWWDFN CHUJ DW GDZQ”,只需将所有内容大写并将它们移动 3。但是,我得到“DWWDFN =] HUJ =DW =GDZQ”。如您所见,它基本上是正确的。我似乎无法弄清楚不是的部分。感谢您提供的任何帮助。
enter def caesar_cipher():
text = str.upper(input("Your message? "))
shift = int(input("Encoding key? "))
for i in range(0, len(text)):
a = text[i]
o = a.find(" ")
if o == 0:
print(" ", end='')
p = a.find("'")
if p == 0:
print("'", end='')
s = a.find("!")
if s == 0:
print("!", end='')
d = a.find('"')
if d == 0:
print('"', end='')
new = ord(str(a)) + shift
if int(new) >= 97:
new2 = int(new) - 26
new3 = chr(int(new2))
elif int(new) <= 64:
new2 = int(new) + 26
new3 = chr(int(new2))
else:
new3 = chr(int(new))
print(new3, end='')
caesar_cipher()
解决方案
一些一般性评论:
- 你在使用一个函数,这是一件好事,但是函数基本上就是整个程序,包括输入、处理和输出;通常,如果函数具有明确定义的函数,例如“计算字符串的凯撒密码”,则编写函数是一个好主意
- 您将打印语句与函数的结果混淆了;尽管您可能需要打印输出,但在大多数情况下,首先计算结果然后打印它更有意义;让您的函数返回结果,然后打印该结果
- 您正在通过检查in的位置
a
来检查是否等于,但您可以' '
' '
a
if a == ' '
- 您正在检查
a
四个不同的值,但最终会执行四次相同的操作,即将该值添加到结果中;你可以很容易地结合这些 - 即使
a
是这些值之一,你仍然去计算new
,你需要一个else
那里(这实际上回答了你的第二个问题) - 您创建了多个变量(和)
new
,即使您可以将这些语句中的大多数组合成一个,或者如果需要,也可以覆盖变量的值;因此,紧随其后可以很容易地紧随其后,或者只是new2
new3
new = 65 + 3
new2 = chr(new)
new = 65 + 3
new = chr(new)
new = chr(65 + 3)
ord()
返回 anint
并且shift
是 anint
,所以它们的总和也是 anint
,无需继续铸造东西int()
- 您在边缘情况下有一个小错误,但无论如何在测试工作代码时您会发现这是一件小事
将所有这些应用于您的代码:
def caesar_cipher(text, shift):
result = ''
for i in range(0, len(text)):
a = text[i]
if a in [' ', '\'', '!', '"']:
result += a
else:
new = ord(str(a)) + shift
if new > 90:
new = chr(new - 26)
elif new < 65:
new = chr(new + 26)
else:
new = chr(new)
result += new
return result
def main():
message = str.upper(input("Your message? "))
key = int(input("Encoding key? "))
print(caesar_cipher(message, key))
main()
或者,如果您想告诉老师您在 StackOverflow 上得到了答案,请提交:
def caesar_cipher(text, shift):
return ''.join(
ch if ch in ' \'!"' else chr((ord(ch) + shift - 65) % 26 + 65) for ch in text
)
推荐阅读
- cucumber - 场景.getid 没有返回功能名称
- c# - Lambda 表达式:在 foreach 语句内部还是外部?
- amazon-web-services - 无法访问我的 Amazon S3 存储桶上的跨域内容
- java - CRUDRepository::delete 静默执行,而执行应该违反 FK 并抛出异常
- php - 如何动态更改 Crypt 在 Laravel 中使用的密钥?
- vpn - 如何在不接触 NAT 路由器的情况下为 DynDNS 进行端口转发
- sql-server - Redgate 架构比较
- jquery - 如果文件包含 'index_'+storeNum+'html?s'+storeNum; 则尝试重定向到默认值;不存在
- javascript - 为什么我突然在 Nuxt 中收到未知单词错误?
- java - 错误 500:java.lang.NoSuchMethodError:javax/validation/Validator