Python 更好地替代巨大的;如果x==2/如果x==3/如果x==4”;链添加前缀和后缀?
我是python新手。我制作了一个简单的程序,检查用户输入变量的内容。根据字符串的长度,我的程序将使用if语句在前后添加单词Python 更好地替代巨大的;如果x==2/如果x==3/如果x==4”;链添加前缀和后缀?,python,if-statement,Python,If Statement,我是python新手。我制作了一个简单的程序,检查用户输入变量的内容。根据字符串的长度,我的程序将使用if语句在前后添加单词 if len(initialPass) == 2: finalPass = "@" + finalPass + "0010" if len(initialPass) == 3: finalPass = "#" + finalPass + "0011" if len(initialPass) == 4: finalPass = "$" + final
if len(initialPass) == 2:
finalPass = "@" + finalPass + "0010"
if len(initialPass) == 3:
finalPass = "#" + finalPass + "0011"
if len(initialPass) == 4:
finalPass = "$" + finalPass + "0100"
if len(initialPass) == 5:
finalPass = "%" + finalPass + "0101"
if len(initialPass) == 6:
finalPass = "^" + finalPass + "0010"
if len(initialPass) == 7:
finalPass = "&" + finalPass + "0111"
if len(initialPass) == 8:
finalPass = "*" + finalPass + "1000"
if len(initialPass) == 9:
finalPass = "(" + finalPass + "1001"
if len(initialPass) == 10:
finalPass = ")" + finalPass + "1010"
if len(initialPass) == 11:
finalPass = ")!" + finalPass + "1011"
if len(initialPass) == 12:
finalPass = ")@" + finalPass + "1100"
if len(initialPass) == 13:
finalPass = ")#" + finalPass + "1101"
if len(initialPass) == 14:
finalPass = ")$" + finalPass + "1110"
if len(initialPass) == 15:
finalPass = ")%" + finalPass + "1111"
if len(initialPass) == 16:
finalPass = ")^" + finalPass + "10000"
if len(initialPass) == 17:
finalPass = ")&" + finalPass + "10001"
if len(initialPass) == 18:
finalPass = ")*" + finalPass + "10010"
if len(initialPass) == 19:
finalPass = ")(" + finalPass + "10011"
if len(initialPass) == 20:
finalPass = "))" + finalPass + "10100"
有更好的方法吗?有
您想使用len(initialPass)
实现两个目的:
1) 获取最终密码的第一部分,如“@”
、“#”
等
最简单的方法是使用查找表:
>>> extra = [' ', ' ', '@', '#', '$', '%', '^', '&', '*', '(', ')', ')!', ')@', ')#', ')$', ')%', ')^', ')&', ')*', ')(', '))']
>>> extra[2]
'@'
>>> extra[5]
'%'
如果您不想在这样的代码中包含文字,则可以使用以下代码生成:
>>> extra = list(" @#$%^&*()") + [")%s" % c for c in "!@#$%^&*()"]
2) 将初始过程转换为二进制,用0填充,至少有4位数字:
>>> "{0:04b}".format(2)
'0010'
>>> "{0:04b}".format(13)
'1101'
>>> "{0:04b}".format(23)
'10111'
综合起来:
finalPass = extra[len(initialPass)] + finalPass + "{0:04b}".format(len(initialPass))
您可以定义字典函数来查找前缀和后缀。单独处理缺少的值
def look(i):
return {
2: ("@","0010"),
3: ("#","0011"),
...
}.get(i, ("PRE","SUF")) # default values if not found
另外,看起来您的后缀是长度的二进制表示形式,也可以用公式表示。很抱歉,请您为我详细说明一下。我会用它作为我的解决方案,但我也想理解它。@GavinYouker:是的,看一看!与疯狂的分支不同,您应该为所需的字符串创建一个列表,在本例中是一个列表,因为索引相当密集(将Python列表视为引用数组,因此通过索引访问是O(1))。然后使用
len(initialPass)
作为索引从该表中检索项目。通常,当键/索引稀疏时,使用Python字典代替表。检查@Claudiu answer:您不需要字典,因为有一个数字模式。