【问题标题】:Using the eval function使用评估功能
【发布时间】:2018-01-16 16:51:12
【问题描述】:

我正在尝试在以下场景中使用eval 函数:

  • 假设我有两个表达式:

    1. A ← A * 3
    2. A ← 3 * A

    在这些表达式的后半部分,我希望得到 True,因为它们是相等的。

  • 假设我还有其他两个表达式:

    1. A ← A % 3
    2. A ← 3 % A

在这些表达式的后半部分,我希望得到 False,因为它们不相等。

在 Stack Overflow 的帮助下,我完成了一个大程序,我好奇的部分是:

import sys
def main() :

opt1_raw = "A ← T + 2"
opt2_raw = "A ← 2 + T"

opt1 = opt1_raw.split("←")[1]
opt2 = opt2_raw.split("←")[1] 


for char in opt1 : 
    if char.isdigit() or char.isalpha() :        
        ascii_exp1 = ''.join(str(ord(char)))
    x = eval(ascii_exp1)

对于带有 y 变量的 opt2 也是如此,然后我比较两个变量 x 和 y。

在我的程序结束时,我有以下几行:

if  ( x != y ) :
    sys.exit()
else :
    print("Equals")

此示例的结果不是“等于”。

为什么它不起作用?

【问题讨论】:

  • 什么不起作用?
  • 比较 x 和 y 我得到了错误的结果。
  • 您愿意分享一下预期结果和实际结果吗?实际上这个问题涉及的整个代码及其输出(如[SO]: mcve所述)
  • 提示:在运行 eval 之前查看 ascii_exp1 的值。 (编辑:实际上,我完全不确定您要对整个 for 块做什么。花点时间手动逐步完成它,看看它实际上在做什么。)
  • 谢谢,我这样做了,但 x 只保存最后一个数据,即使我把它放在“for in”之外。

标签: python python-3.x


【解决方案1】:

主要问题是你有ascii_exp1 = ''.join(str(ord(char)))而不是ascii_exp1 += ''.join(str(ord(char))),也就是说,你是替换整个东西而不是附加到它。因此,您只是比较每个字符串中最后一个字符的值,它们不相等。 (请注意,您需要在循环上方声明 ascii_exp1 以便在循环内附加到它。)

str(ord(char)) 对数字来说也是一件非常奇怪的事情,你的 2 变成了 '50' 而不是你想要的 '2'。我认为您应该省略 char.isdigit() 部分并保持原样,eval 会正确读取它们。

编辑回应评论:啊,是的,你也错过了 else 案例。这是固定的代码:

opt1_raw = "A ^ T + 2"
opt2_raw = "A ^ 2 + T"

opt1 = opt1_raw.split("^")[1]
opt2 = opt2_raw.split("^")[1] 

ascii_exp1 = ''
for char in opt1 : 
    if char.isdigit() or char.isalpha() :        
        ascii_exp1 += ''.join(str(ord(char)))
    else:
        ascii_exp1 += char
x = eval(ascii_exp1)

ascii_exp2 = ''
for char in opt2 : 
    if char.isdigit() or char.isalpha() :        
        ascii_exp2 += ''.join(str(ord(char)))
    else:
        ascii_exp2 += char

y = eval(ascii_exp2)

print x == y

【讨论】:

  • 谢谢,我试过了,不成功。下面的代码多行的等价物是什么? ascii_exp = ''.join([str(ord(char)) if char.isdigit() or char.isalpha() else char for char in a]) 我从“for char in a”开始。实际上这就是我正在寻找解决此问题的方法,因为使用上面的一行代码它可以正常工作。
  • 谢谢,它有效,我不知道如何将单行代码转换为多行代码(我还有一些其他代码,这就是我更喜欢该代码的原因)。因为我是新成员,所以我认为我还不能接受它作为解决方案。 (它记录但不会改变分数)
猜你喜欢
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多