遍历一系列运算符

3

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

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

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

3个回答

7
你可以使用操作符模块。
for op in [('+', operator.add), ('-', operator.sub), ('*', operator.mul), ('/', operator.div)]:
    print("{} {} {} = {}".format(a, op[0], b, op[1](a, b)))

我更喜欢这种方式,因为我不需要重写各种运算符,谢谢。 - green diod

1
你可以创建自己的操作,然后对它们进行迭代。
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))

1
https://dev59.com/dXI-5IYBdhLWcg3weoTR - Remi Guan
2
eval方法对于简单的(二元中缀)操作更为直接,避免了定义所有这些函数。现在,当操作更加复杂时,我当然无法避免这种情况。承认“避免使用eval”的部分。 - green diod
@zetysz:是的 :),关于 eval ,它真的很危险。所以永远不要使用它。 - Remi Guan
1
@KevinGuan 在我上面提到的使用情况中,也就是为了测试目的,eval 只会被限制在测试代码中。但是,如果可以避免使用它,我们还是尽量避免。 - green diod

0

试试这个:

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

希望这能帮到你!


嗨@Douglas,谢谢,但execeval基本相同。 - green diod
@绿色二极管,这个页面上有什么我没看到的东西吗?那条评论似乎有点随意,我错过了什么吗? - Douglas - 15 year old Pythoner
@绿色二极管,没事了,我刚刚找到了注释。谢谢你的指引。为什么exec和eval这么危险?我经常使用它们,我不知道这一点。 - Douglas - 15 year old Pythoner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接