Я пытаюсь написать общую функцию для добавления / умножения терминов в последовательности - PullRequest
0 голосов
/ 09 сентября 2011

Я пытаюсь написать функцию с 4 аргументами в python

def sequence(operation, start, n, term):

, где операция - это функция, start - начальный номер последовательности, а n - последний номер последовательности,term - это функция, которая управляет терминами в последовательности.

Например,

>>> sequence(add, 2, 10, square)

вернет сумму квадрата 2, 3, 4, ..., 10

учитывая, что:

def square(x):
    return x * x

Ответы [ 4 ]

2 голосов
/ 09 сентября 2011
reduce(lambda a,b: a+b, map(square, range(2,11)))
1 голос
/ 09 сентября 2011
def sequence(operation, start, n, term):
    return reduce(operation, map(term, range(start, n+1)))

Функция диапазона в Python наполовину открыта, т.е.range (start, stop) возвращает список целых чисел от начала до остановки-1.Так, например:

>>> range(2,10)
[2,3,4,5,6,7,8,9]

Поэтому для решения вашей проблемы вам понадобится диапазон (start, n + 1).

Чтобы применить функцию «term» к каждому целому числу в этомдиапазон, в котором вы бы использовали карту встроенной функции, например:

>>> map(square,range(2,11))
[4, 9, 16, 25, 36, 49, 64, 81, 100]

В последней части функции требуется встроенная функция lower, которая принимает в качестве аргументов функцию, итеративное и необязательное начальное значение (что не требуется в этом случае).

lower применяет данную функцию к первым двум элементам итерируемого;затем она применяет функцию к результату первого вычисления и третьему элементу итерируемого и т. д.

Так, например:

>>> from operator import add
>>> reduce(add, [4, 9, 16, 25])

... эквивалентно:

>>> add( add( add(4, 9), 16), 25)

... и:

>>> reduce(add, [4, 9, 16, 25, 36, 49, 64, 81, 100])

... эквивалентно:

>>> add( add( add( add( add( add( add( add(4, 9), 16), 25), 36), 49), 64), 81), 100)   
0 голосов
/ 09 сентября 2011
from operator import add,mul

def square(x):  return x * x


def sequence(oper,m,n,func):
    if oper not in (add,mul):
        return None
    return reduce(lambda a,b: oper(a,func(b)),
                  xrange(m,n+1),
                  0 if oper==add else 1)


print sequence(add, 3,4, square)
print sequence(mul,2,3,square)
print sequence('qq',10,110,square)

результат

25
36
None
0 голосов
/ 09 сентября 2011

Вы можете определить последовательность в одной строке, используя Встроенные функции Python range, reduce и map.

...