【问题标题】:Iterate through a sequence of operators遍历一系列运算符
【发布时间】:2016-03-22 15:18:42
【问题描述】:

有可能/有没有办法像下面的例子那样遍历一系列运算符?

a, b = 5, 7
for op in (+, -, *, /):
    print(a, str(op), b, a op b)

一个可能的用例是在某些抽象数据类型上测试各种运算符的实现,其中这些运算符被重载。

【问题讨论】:

    标签: python testing operator-keyword


    【解决方案1】:

    您可以使用操作员模块。

    for op in [('+', operator.add), ('-', operator.sub), ('*', operator.mul), ('/', operator.div)]:
        print("{} {} {} = {}".format(a, op[0], b, op[1](a, b)))
    

    【讨论】:

    • 我更喜欢这个,因为我不需要重写各种运算符,谢谢。
    【解决方案2】:

    您可以创建自己的操作,然后对它们进行迭代。

    def add(a, b):
        return a + b
    
    def sub(a, b):
        return a - b
    
    def mult(a, b):
        return a * b
    
    def div(a, b):
        return a / b
    a, b = 5, 7
    
    operations = {'+': add,'-': sub, '*':mult, '/': div}
    for op in operations:
        print(a, op, b, operations[op](a, b))
    

    【讨论】:

    • 对于简单的(二进制中缀)操作,eval 方法更直接,并且避免了定义所有这些函数。现在,当然,当操作更复杂时,我无法避免这种情况。承认“避免评估”部分。
    • @zetysz:是的:),关于eval,真的很危险。所以不要使用它永远
    • @KevinGuan 在我上面提到的用例中,即出于测试目的, eval 只会被限制在测试代码中。但是,如果可以避免,我们还是避免吧。
    【解决方案3】:

    试试这个:

    a,b=5,7
    for op in ['+','-','*','/']:
        exec 'print a' + op + 'b'
    

    希望这会有所帮助!

    【讨论】:

    • 嗨@Douglas,谢谢,但execeval 几乎相同。
    • @green diod,这个页面上有什么我没看到的吗?这个评论似乎有点随意,我错过了什么吗?
    • @green diod,没关系,我刚刚找到了 cmets。感谢您的指点。为什么 exec 和 eval 如此危险?我用过很多次,我没有意识到这一点。
    猜你喜欢
    • 2018-08-29
    • 2020-08-20
    • 2018-10-20
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多