2015-02-04 3 views
1

Привет, поэтому я пытаюсь создать функцию, в которой я вычитаю первое число со вторым, а затем добавляю третье, а затем вычитаем четвертое, т.е. x1-x2+x3-x4+x5-x6...Последовательность добавления/вычитания Python

До сих пор у меня это, я могу добавить только две переменные x и y. Думал делать

>>> reduce(lambda x,y: (x-y) +x, [2,5,8,10] 

До сих пор не получают его

довольно простые вещи просто запутался ..

+0

Вы не сможете использовать 'сокращение', чтобы решить эту проблему. Как насчет цикла? – nneonneo

+0

Вы хотите понять, как использовать 'lambda's в Python или просто как написать функцию для вычисления' x1-x2 + x3-x4 + x5-x6'? – YXD

+0

Вычисление функции – Berp12

ответ

1

Используйте множитель, что вы вернуться к + - после каждого добавления.

result = 0 
mult = 1 
for i in [2,5,8,10]: 
    result += i*mult 
    mult *= -1 
3

В этом же случае было бы проще использовать суммы:

a = [2,5,8,10] 
sum(a[::2])-sum(a[1::2]) 
-5 
1

Вы можете следить за положением (и, таким образом, делать ли + или -) с enumerate, и вы могли бы использовать тот факт, что -1 2n является +1 и -1 2n + 1 - -1. Используйте это как фактор и sum все условия.

>>> sum(e * (-1)**i for i, e in enumerate([2,5,8,10])) 
-5 
0

Или просто использовать сумму и генератор:

In [18]: xs 
Out[18]: [1, 2, 3, 4, 5] 

In [19]: def plusminus(iterable): 
    ....:  for i, x in enumerate(iterable): 
    ....:   if i%2 == 0: 
    ....:    yield x 
    ....:   else: 
    ....:    yield -x 
    ....:    

In [20]: sum(plusminus(xs)) 
Out[20]: 3 

Что также может быть выражено как:

sum(map(lambda x: operator.mul(*x), zip(xs, itertools.cycle([1, -1])))) 
0

Если вы действительно хотите использовать сокращение, по какой-то причине, вы можете сделать что-то вроде этого:

class plusminus(object): 
    def __init__(self): 
     self._plus = True 
    def __call__(self, a, b): 
     self._plus ^= True 
     if self._plus: 
      return a+b 
     return a-b 

reduce(plusminus(), [2,5,8,10]) # output: -5 
Смежные вопросы