【问题标题】:Cannot understand specific Python 3 code无法理解特定的 Python 3 代码
【发布时间】:2018-12-30 03:39:41
【问题描述】:

在尝试解决 Hackerrank(The Problem) 上的问题时。我检查了解决此问题的人的解决方案。这是一个人的解决方案-

n = input()
l = []
for _ in range(n):
    s = raw_input().split()
    cmd = s[0]
    args = s[1:]
    if cmd !="print":
        cmd += "("+ ",".join(args) +")"
        eval("l."+cmd)
    else:
        print l

我无法理解第 8 行和第 9 行,有人可以解释一下这些行吗?我可以在学习 Python 3 时在 Python 3 中编写第 8 行和第 9 行吗?怎么样?

【问题讨论】:

  • 仅供参考:该代码非常不符合 Python 风格。

标签: python python-3.x logic


【解决方案1】:

基本上,cmd 是通过将命令(比如“插入”)附加到操作数来构造的。此 cmd 形成一个正确的 Python 表达式(例如 l.insert(0,5),在列表 l 的索引 0 处插入 5)。

这里,l。是硬编码的(第 9 行开始),在 cmd = s[0] 中初始化 cmd,并在第 8 行添加操作数。

eval(str) 以字符串格式评估命令 str,就像它在命令行中一样。

【讨论】:

    【解决方案2】:

    最好只包括问题:)。输入是一个(文本)文件,如下所示:

    Sample Input 0
    
    12
    insert 0 5
    insert 1 10
    insert 0 6
    print
    remove 6
    append 9
    append 1
    sort
    print
    pop
    reverse
    print
    

    正确答案的预期输出如下:

    Sample Output 0
    
    [6, 5, 10]
    [1, 5, 9, 10]
    [9, 5, 1]
    

    在查看您引用的答案之前,最好先了解一下eval;它接受提供的参数并尝试使用全局和本地命名空间将其作为 python 表达式运行。所以在这种情况下,它只需要 "l"-list 和 "cmd"-tuple 的本地。

    发生的事情如下:

    1. 空列表 l 已创建。
    2. “命令”(cmd) 单值列表通过切片 (cmd = s[0]) 从行中解析出来,因为每一行都以列表方法开头或只有一个列表方法
    3. 其他参数放在args
    4. 第 8 行(按要求): 然后将这些其他参数连接到一个字符串元组中。所以 "insert 0 5" 为 l"(0, 5)"cmd 提供 "insert"
    5. 第 8 行 继续(按要求): 然后使用字符串连接将 cmdargs 组合(阅读 here 以了解好的和坏的示例)导致“插入(0,5)“作为cmd的值
    6. 第 9 行(按要求): eval 参数是另一个字符串连接,产生“l.insert(0,5)”作为要解释的最终表达式。然后将整数值 5 插入到列表 l 中的点 0 上(向前推进 l 中已有的任何其他值)

    希望对你有帮助,继续加油!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多