我正在尝试对Caesar Cypher进行编码,但仅适用于小写字母,并且正在尝试将其打印回原始大写字母。
def encrypt(message, key):
alphabet_lower = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
if type(message) == str and type(key) == int:
Letters = message.lower()
LowerLetters = list(Letters)
BacktoStr = []
for i in LowerLetters:
if i.strip() and i in alphabet_lower:
BacktoStr.append(alphabet_lower[(alphabet_lower.index(i) + key) % 26])
else:
BacktoStr.append(i)
FinalEncrypt = "".join(BacktoStr)
return(FinalEncrypt)
else:
return("Invalid Input")
例如,当我运行代码时:encrypt("Hello world",12)
我得到正确的输出,但是它是小写的。 'tqxxa iadxp'
返回输出时,如何使大写字母保持大写?使用python 3.7.0
答案 0 :(得分:0)
您不想立即将整个消息小写,否则您会在循环中丢失大写信息。 (可以解决它,但是它需要另一个循环或更改迭代方式。)
有两种基本策略:
alphabet_lower
处理大写字母。制作一个alphabet_upper
,然后将它们与i
对照。对alphabet_lower
的改进:
alphabet_lower
。您可以改为将其设为全局变量,以便仅创建一次。alphabet_lower
来检查其中是否包含字符,因此可以使用字符串代替列表:'abcdefghijklmnopqrstuvwxyz'
。它可能会或可能不会更快,但是它当然更容易阅读,并且现在更重要。 (您稍后将学习,如果您想检查某事物是否在一大堆事物中,那么set
或dict
会更有效。)< / li>
import string
并使用string.ascii_lowercase
来代替构建自己的小写字母列表。chr(letter) - chr('a')
或chr(letter) - chr('A')
,具体取决于字母是大写还是小写。i.lower() != i.upper()
而不是列出字母。非字母不会大写或小写,因此请i.lower() == i.upper()
。if 'a' <= i <= 'z':
。请注意:这些方法采用ASCII。如果您的输入内容可能包含通用Unicode(例如“á”),则必须了解这些方法是否按照您的预期做。
测试每种方法的小片段,以确保您了解每个部分的作用。
其他改进:
for i in Letters
同样适用。if i.strip()
,因为i
将始终是单个字符(同样,假定是ASCII)。return
不是函数。写return x
,而不是return(x)
。Letters
之类的名称通常用于类,而不是常规对象。 Here's Python's semi-official style guide.