2013-11-21 3 views
4

Я пишу простую программу на Python для Проекта Эйлер вопроса, и он включает создание пространства поиска над операциями, например:Python отливать характер операцию

8 = (4 * (1 + 3))/2 
14 = 4 * (3 + 1/2) 
19 = 4 * (2 + 3) − 1 
36 = 3 * 4 * (2 + 1) 

Я храню возможные операции в массиве:

op = ['+', '-', '*', '/'] 

мне было интересно, есть ли способ в Python, чтобы бросить характер операции, так что я мог бы просто сделать что-то вроде:

for operation in op: 
    num1 foo(operation) num2 

ответ

-2

Нет, вы не можете этого сделать.

Вам нужно будет создать функции, которые будут выполнять все необходимые операции.

8

Вы можете использовать модуль operator, чтобы получить функциональность, которую вы ищете. Модуль operator имеет "набор эффективных функций, соответствующих собственных операторов Python":

>>> import operator as op 
>>> ops = {"+": op.add, "-": op.sub, "/": op.div, "*": op.mul} 
>>> num1, num2 = 3, 6 
>>> for name, fn in ops.iteritems(): 
...  print "{} {} {} = {}".format(num1, name, num2, fn(num1, num2)) 
... 
3 + 6 = 9 
3 * 6 = 18 
3 - 6 = -3 
3/6 = 0 
1

Eval может помочь:

op = ['+', '-', '*', '/'] 
num1, num2 = 3, 6 
for operation in op: 
    print eval("{} {} {}".format(num1, operation, num2)) 

Выдает:

9 
-3 
18 
0 

или может используйте таблицу op:

def add(x,y) : return x + y 
def sub(x,y) : return x - y 
def mul(x,y) : return x * y 
def div(x,y) : return x/y 

op = {'+' : add, '-': sub, '*' : mul, '/' : div } 
num1, num2 = 3, 6 
for operation in op.keys(): 
    print op[operation](num1, num2) 
3

Что вы думаете о:

In [1]: add = lambda x,y: x+y 

In [2]: sub = lambda x,y: x-y 

In [3]: mult = lambda x,y: x*y 

In [4]: divs = lambda x,y: x/y 

In [5]: ops = [add,sub,mult,divs] 

In [6]: for op in ops: 
    ...:  print op(1,2) 
    ...:  
3 
-1 
2 
0 

UPDATE: после публикации моего ответа я заметил ответ @mdml «S - я думаю, что это более элегантно, чем моя ТВН :)

+1

сладкое использование лямбды !! –

+2

@ mdml's является немного более кратким, но ваш предлагает отличную практику в функциях первого порядка. –

+1

@AlexSpangher Cheers –

Смежные вопросы