【问题标题】: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-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 的本地。
发生的事情如下:
- 空列表 l 已创建。
- “命令”(
cmd) 单值列表通过切片 (cmd = s[0]) 从行中解析出来,因为每一行都以列表方法开头或只有一个列表方法
- 其他参数放在
args
-
第 8 行(按要求): 然后将这些其他参数连接到一个字符串元组中。所以 "insert 0 5" 为
l 和 "(0, 5)" 为 cmd 提供 "insert"
-
第 8 行 继续(按要求): 然后使用字符串连接将
cmd 与 args 组合(阅读 here 以了解好的和坏的示例)导致“插入(0,5)“作为cmd的值
-
第 9 行(按要求): eval 参数是另一个字符串连接,产生“l.insert(0,5)”作为要解释的最终表达式。然后将整数值
5 插入到列表 l 中的点 0 上(向前推进 l 中已有的任何其他值)
希望对你有帮助,继续加油!