Python 更好地替代巨大的;如果x==2/如果x==3/如果x==4”;链添加前缀和后缀?

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

我是python新手。我制作了一个简单的程序,检查用户输入变量的内容。根据字符串的长度,我的程序将使用if语句在前后添加单词

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:您不需要字典,因为有一个数字模式。