【问题标题】:Evaluating variable contain mathematical expression in f-strings评估变量包含 f 字符串中的数学表达式
【发布时间】:2018-05-07 07:41:19
【问题描述】:

我必须接受输入(使用raw_input())作为像10**5 这样的幂表达式,然后打印它的值。我已经尝试了几段代码,但这些都没有给出预期的结果:

print(f'{2**4}') #<-- prints 16 correctly
a = '{2**4}'
print(f'{{}}'.format(a)) #<-- prints {2**4}

是否有可能实现类似:

var = '2**4'
print(f'{<some way to expand var in here>}') #<-- prints 16

【问题讨论】:

  • eval 有帮助吗?
  • 是的@Megalng - 谢谢
  • 根据您的需要 a = 2**4 可能会有所帮助,如果 eval() 不是。

标签: python python-3.x expression-evaluation f-string


【解决方案1】:

在 f-strings 中,表达式被解析为:

ast.parse('(' + expression + ')', '<fstring>', 'eval')

https://docs.python.org/3/library/ast.html#ast.parse

但是变量将被替换为它们的实际值。您正在寻找的是一种 f-strings 不支持的嵌套评估。相反,作为一种安全的方法,您可以先使用 '**' 拆分,然后转换为 int,最后使用 power:

In [9]: s = "2**4"

In [10]: print(f"{pow(*map(int, s.split('**')))}")
16

【讨论】:

  • 在这种情况下是的,但在其他运算符或表达式链的情况下,它不会,例如print(f'{2**4}') a = '((2+4-10+88*2)/100)**5' print(eval ('f"{'+a+'}"'))
  • @BabyGroot 在这种情况下,请在此处查看答案stackoverflow.com/questions/2371436/…
  • 是的,但大多数解决方案都需要导入一些模块 - evalextrapolation 内置于 python - 无论如何感谢 (+1)
  • @BabyGroot 正如许多答案中提到的那样,不要在用户输入数据上使用eval。绝不!
  • 是的,我看到了——这就是为什么我想知道我们是否可以在内置支持的情况下使用 int(&lt;expr&gt;)
【解决方案2】:

所以这适用于所有表达式(例如((2+4-10+88*2)/100)**5),但我不确定这是否是正确的方法(因为不推荐使用eval

a = '2**4'
print(eval (a))  #<-- prints 16

【讨论】:

    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多