在Python中通过列表评估函数-无需使用循环

时间:2019-06-08 03:12:37

标签: python sympy

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熟悉,我还是选择使用列表。我将用单个return语句替换print语句;现在,我正在打印输出以确保它们正确。

唯一的问题是该问题阻止了循环的使用。因此,对于第一个和最后一个函数输出如何解决这样的问题,我不确定。

是否可以在不使用任何循环的情况下编写上述函数?

2 个答案:

答案 0 :(得分:2)

您可以使用列表推导:

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)

如果您愿意,也可以使用the itertools module docs中的pairwise食谱:

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)

答案 1 :(得分:2)

使用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))))

并且没有可见的“ for”。但正如@hpaulj所指出的,在引擎盖下的某个地方。