下面几行 python 代码片段,需要解释一下。

For the few lines of below python code snippet, need explanation.

以下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 这似乎与 添加符号 *.

输入格式如下

insert 0 6
print 
remove 6
append 9

这真是丑陋的代码。 insert 0 6 作为 第一个 输入是无效的;首先,你必须说明你想使用这个怪物多少次,例如1.

然后:

  1. 输入 insert 0 6 包含三个参数。 cmds = raw_input.split(" ")choice = str(len(cmds)) 然后计算出您向代码传递了三个 (3) 参数。
  2. 然后使用数字 3choices = {"0": "", "1": "{}()", "2": "{}({})", "3": "{}({}, {})"} 返回适当的格式字符串。在这种情况下; "{}({}, {})"

  3. 我们没有要求print,我们要求insert,所以if cmds[0] == "print": print lFalse,我们跳过它。

  4. 这意味着我们必须评估 elif choice in choices: eval("l." + choices[choice].format(*cmds))。那么,我们已经从第(2)点知道choice == 3对应于"{}({}, {})"(*cmds)) 用于元组解包...它将 (input, 0, 6) 解包到花括号处的字符串中,给出 "insert(0, 6)".
  5. 然后我们将 (4) 末尾的字符串连接起来,得到 "l.insert(0, 6)" 作为字符串。然后传递给 eval 并执行。

此函数允许用户输入在列表上工作的方法作为原始输入。然后它创建一个字符串,该字符串是 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))