如何在其他基中计算表达式?

2024-04-19 21:47:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个计算器,用户输入一个表达式,比如3*2+1/20,我用eval来显示答案。你知道吗

是否有一个函数允许我在其他基(bin、oct、hex)中执行相同的操作?你知道吗


Tags: 函数答案用户bin表达式evaloct计算器
2条回答

否;eval用于解析Python和the base of numbers in Python code is fixed。你知道吗

如果您坚持使用这个方法,您可以使用regex replace以0x作为数字的前缀,但是最好构建一个解析器,利用int(string, base)来生成数字。你知道吗

如果您真的想沿着Python的路线走下去,下面是一个基于令牌的转换:

import tokenize
from io import BytesIO

def tokens_with_base(tokens, base):
    for token in tokens:
        if token.type == tokenize.NUMBER:
            try:
                value = int(token.string, base)
            except ValueError:
                # Not transformable
                pass
            else:
                # Transformable
                token = tokenize.TokenInfo(
                    type   = tokenize.NUMBER,
                    string = str(value),
                    start  = token.start,
                    end    = token.end,
                    line   = token.line
                )

        yield token

def python_change_default_base(string, base):
    tokens = tokenize.tokenize(BytesIO(string.encode()).readline)
    transformed = tokens_with_base(tokens, base)
    return tokenize.untokenize(transformed)

eval(python_change_default_base("3*2+1/20", 16))
#>>> 6.03125

0x3*0x2+0x1/0x20
#>>> 6.03125

这样更安全,因为它尊重字符串之类的东西。你知道吗

如果它们以十六进制、二进制等形式输入值,eval将工作:

eval("0xa + 8 + 0b11")
# 21

不过要小心,eval can be dangerous。你知道吗

相关问题 更多 >