我在HackerRank上找到这个问题,我无法理解讨论页面中显示的代码(解决方案)。在
问题是: 考虑一个列表(list=[])。您可以执行以下命令:
插入即:在位置插入整数。 打印:打印列表。 删除e:删除第一个出现的整数。 append e:在列表末尾插入整数。 排序:对列表进行排序。 pop:从列表中弹出最后一个元素。 反转:反转列表。在
尽管我已经使用if-else解决了问题,但我不明白这段代码是如何工作的:
n = input()
slist = []
for _ in range(n):
s = input().split()
cmd = s[0]
args = s[1:]
if cmd !="print":
cmd += "("+ ",".join(args) +")"
eval("slist."+cmd)
else:
print slist
是肮脏的代码在滥用
eval
。在基本上,当您输入
"remove 1"
时,它会创建一些看起来像sList.remove(1)
的代码,然后将创建的代码赋给eval
。这让Python解释它。在不过,这可能是在编码竞赛之外解决这个问题的最糟糕的方法。这里完全没有必要使用
eval
。在好吧,代码利用了Python的
eval
函数。许多语言都有这样的特性:eval
,是“evaluate”的缩写,它接受一段文本并将其当作程序的一部分来执行,而不仅仅是一段输入程序的数据。这条线:从用户读取一行输入并基于空格将其拆分为单词,因此如果键入“insert 12”,
s
将设置为列表["insert","1","2"]
。然后通过以下行将其转换为"insert(1,2)"
,然后将其附加到"slist."
并传递给eval
,从而执行方法调用slist.insert(1,2)
。因此,基本上,这段代码利用了这样一个事实:Python已经有了执行所需函数的方法,这些方法恰好与问题中使用的名称相同。它所要做的就是从输入行中获取名称和参数,并将它们转换成Python语法。(print
选项是特殊大小写的,因为没有方法slist.print()
;对于这种情况,它使用全局命令:print slist
。)在实际的代码中,您几乎不应该使用
eval
;这是一个非常危险的特性,因为它允许应用程序的用户潜在地让应用程序运行他们想要的任何代码。对于黑客来说,这无疑是更容易破解的功能之一。在实际上,我在代码中发现了一些错误,但我对代码的运行方式有了一个了解。这是它:
输入:
然后
^{pr2}$eval(cmd)
,即eval("1 + (2 + 3)")
,它给出一个输出6 另一个输入:相关问题 更多 >
编程相关推荐