对于以下几行python代码片段,需要解释。

时间:2017-03-11 17:48:55

标签: python string eval string-formatting

下面的python代码用于执行操作,如追加,排序,打印列表L。我正在分析代码,但无法理解代码中的几行。

 l = []#declare the list
 choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"}#dicationary declaration
 for _ in range(int(raw_input())):  #prompt for user input and iterate 
        cmds = raw_input().split(" ")   #get the operation that needs to be performed on the list
        choice = str(len(cmds))   #get the length
        if cmds[0] == "print": print l   #print the list
        elif choice in choices: eval("l." + choices[choice].format(*cmds))

字典声明,choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"}有括号和括号,我无法理解它的意义。由于

,最后一行elif choice in choices: eval("l." + choices[choice].format(*cmds))似乎很神秘
  1. eval函数,用于执行Python代码。
  2. 字符串函数format,似乎很难被隐藏起来 添加符号*
  3. 输入格式如下

    insert 0 6
    print 
    remove 6
    append 9
    

2 个答案:

答案 0 :(得分:1)

这是非常丑陋的代码。 <{1>}作为第一个输入无效;首先,你必须说明你想要使用这种怪物的次数,例如insert 0 6

然后:

  1. 输入1中有三个参数。 insert 0 6cmds = raw_input.split(" ")然后您将三个(choice = str(len(cmds)))参数传递给代码。
  2. 然后使用数字33返回相应的格式字符串。在这种情况下; choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"}

  3. 我们没有要求"{}({}, {})",我们要求print,因此insertif cmds[0] == "print": print l,我们会跳过它。

  4. 这意味着我们必须评估False。好吧,我们从第(2)点已经知道elif choice in choices: eval("l." + choices[choice].format(*cmds))对应choice == 3"{}({}, {})"用于元组解包...它将(*cmds))解包为大括号中的字符串,给出(input, 0, 6)
  5. 然后我们在(4)的末尾连接字符串以给出&#34; l.insert(0,6)&#34;作为一个字符串。然后将其传递给"insert(0, 6)"并执行。

答案 1 :(得分:1)

此功能允许用户输入在列表上工作的方法作为原始输入。然后它创建一个字符串,它是一个有效的python代码行,并在列表中对其进行评估。

choices字典包含用于构造将要评估的行的格式字符串。括号{}将替换为.format调用中输入列表中的项目。括号()是用于在python中使其成为正确函数调用的括号。

如果将eval替换为print,您将看到替换后命令的确切内容。

另请注意,此代码仅适用于Python 2,对于需要使用的Python 3:

l = []#declare the list
choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"}#dicationary declaration
for _ in range(int(input())):  #prompt for user input and iterate 
    cmds = input().split(" ")   #get the operation that needs to be performed on the list
    choice = str(len(cmds))   #get the length
    if cmds[0] == "print": print(l)   #print the list
    elif choice in choices: eval("l." + choices[choice].format(*cmds))