Оценка функции по списку в Python - без использования циклов - PullRequest
0 голосов
/ 08 июня 2019

В Python существует проблема, заключающаяся в оценке функции по списку чисел, которые предоставляются в качестве входных данных для следующей функции:

f (y) = sin (3y + pi / 3)+ cos (4y - pi / 7)

Я не думаю, что в StackOverflow доступны инструменты MathJax, поэтому вышесказанное - лучшее, что я могу сделать.

Для этой функции предусмотрено четыре выхода:Массив или список, содержащий значения, полученные функцией для каждого элемента входного списка, минимальное и максимальное значения в выходном массиве / списке и массив или список различий между последовательными значениями, полученными функцией.

Вот код на данный момент.Мы предполагаем, что только разумные входные данные передаются в функцию.

import sympy
def minMaxDiffValues(lst):
    y = sympy.symbols('y')
    f = sympy.sin(3*y + sympy.pi/3) + sympy.cos(4*y - sympy.pi/7)
    values = []
    for n in lst:
        values.append(f.subs(y,n))
    differences = []
    for i in range(len(values) - 1):
        differences.append(values[i + 1] - values[i])
    print values
    print min(values)
    print max(values)
    print differences

Насколько я знаю, приведенный выше код выполняет свою работу;Я решил работать со списками, хотя я знаком с NumPy.Я заменю операторы print одним оператором return;сейчас я печатаю выходные данные, чтобы убедиться, что они правильные.

Единственная проблема заключается в том, что проблема не позволяет использовать циклы;таким образом, я не уверен, как подойти к такой проблеме для первой и последней выходов функции.

Можно ли написать вышеуказанную функцию без использования каких-либо циклов?

Ответы [ 2 ]

2 голосов
/ 08 июня 2019

Использование map - это способ компактного применения функции к списку значений:

>>> from sympy import y, pi
>>> f = lambda y: sin(3*y + pi/3) + cos(4*y - pi/7)
>>> vals = list(map(f, lst))
>>> d = lambda i: vals[i] - vals[i-1]
>>> difs = list(map(d, range(1, len(vals))))

И видимого «для» нет.Но, как отмечает @hpaulj, под капотом где-то есть один.

2 голосов
/ 08 июня 2019

Вы можете использовать списочные выражения:

import sympy

def minMaxDiffValues(lst):
    y = sympy.symbols('y')
    f = sympy.sin(3*y + sympy.pi/3) + sympy.cos(4*y - sympy.pi/7)

    values = [f.subs(y,n) for n in lst]
    differences = [values[i+1] - values[i] for i in range(len(values)-1)]

    print(values)
    print(min(values))
    print(max(values))
    print(differences)

Если вы хотите, вы также можете использовать рецепт pairwise из документа модуля itertools :

import itertools
import sympy


def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)


def minMaxDiffValues(lst):
    y = sympy.symbols('y')
    f = sympy.sin(3*y + sympy.pi/3) + sympy.cos(4*y - sympy.pi/7)

    values = [f.subs(y,n) for n in lst]
    differences = [y - x for (x, y) in pairwise(values)]

    print(values)
    print(min(values))
    print(max(values))
    print(differences)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...