64

我想将一个数学运算符以及要比较的数值传递给一个函数。这是我损坏的代码:

def get_truth(inp,relate,cut):    
    if inp print(relate) cut:
        return True
    else:
        return False

并调用它

get_truth(1.0,'>',0.0)

应该返回 True。

4

5 回答 5

91

看看操作员模块

import operator
get_truth(1.0, operator.gt, 0.0)

...

def get_truth(inp, relate, cut):    
    return relate(inp, cut)
    # you don't actually need an if statement here
于 2013-09-03T12:01:39.693 回答
51

制作字符串和运算符函数的映射。此外,您不需要 if/else 条件:

import operator


def get_truth(inp, relate, cut):
    ops = {'>': operator.gt,
           '<': operator.lt,
           '>=': operator.ge,
           '<=': operator.le,
           '==': operator.eq}
    return ops[relate](inp, cut)


print(get_truth(1.0, '>', 0.0)) # prints True
print(get_truth(1.0, '<', 0.0)) # prints False
print(get_truth(1.0, '>=', 0.0)) # prints True
print(get_truth(1.0, '<=', 0.0)) # prints False
print(get_truth(1.0, '==', 0.0)) # prints False

仅供参考,eval()是邪恶的:为什么使用“评估”是一种不好的做法?

于 2013-09-03T12:02:37.230 回答
12

使用operator模块。它包含您可以在 python 中使用的所有标准运算符。然后将运算符用作函数:

import operator

def get_truth(inp, op, cut):
    return op(inp, cut):

get_truth(1.0, operator.gt, 0.0)

如果您真的想将字符串用作运算符,请按照@alecxe 的建议创建一个从字符串到运算符函数的字典映射。

于 2013-09-03T12:01:38.547 回答
-1

请改用该operator模块:

import operator
def get_truth(inp, relate, cut):
    rel_ops = {
        '>': operator.gt,
        '<': operator.lt,
        '>=': operator.ge,
        '<=': operator.le,
        '==': operator.eq,
        '!=': operator.ne
    }
    return rel_ops[relate](inp, cut)
于 2013-09-03T12:01:42.793 回答
-3
>>> def get_truth(inp,relate,cut):
...     if eval("%s%s%s" % (inp,relate,cut)):
...         return True
...     else:
...         return False
...
>>> get_truth(1.0,'>',0.0)
True
>>>
于 2013-09-03T12:07:00.453 回答