Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从具有多个参数的函数创建具有单个参数的函数的最佳方法是什么?_Python - Fatal编程技术网

Python 从具有多个参数的函数创建具有单个参数的函数的最佳方法是什么?

Python 从具有多个参数的函数创建具有单个参数的函数的最佳方法是什么?,python,Python,在python中,我有一个函数f(x,y)定义为 def f(x,y): return x + y 现在我想定义一个函数g(x)=f(x,y),它的y值是在运行时确定的。在我的具体案例中,我循环了y的几个值,并且需要为每次迭代生成这个函数g(x): for y in range(0,10): def g(x): return f(x,y) #do something with g(x)... 上面的代码是有效的,但我的问题是,是否有更有效的方法来实现这

在python中,我有一个函数f(x,y)定义为

def f(x,y):
    return x + y
现在我想定义一个函数g(x)=f(x,y),它的y值是在运行时确定的。在我的具体案例中,我循环了y的几个值,并且需要为每次迭代生成这个函数g(x):

for y in range(0,10):
    def g(x):
        return f(x,y)
    #do something with g(x)...
上面的代码是有效的,但我的问题是,是否有更有效的方法来实现这一点?在我看来,在每次循环迭代中创建函数对象可能会在内存/计算时间方面变得效率低下。

使用:

使用:


functools
模块正好满足您的需要:

从functools导入部分

def add(a,b):
    return a+b

plus5 = partial(add,5)
print plus5(10) # outputs 15

functools
模块正好满足您的需要:

从functools导入部分

def add(a,b):
    return a+b

plus5 = partial(add,5)
print plus5(10) # outputs 15

它不是一个真正的函数,但根据
实际执行的操作,使用lambda表达式可能就足够了:

>>> def f(x, y):
...   return x * y
...
>>> g = lambda x: f(x, 2)
>>> g(3)
6
就性能而言,它似乎比
functools.partial
偶数(使用Python 2.7.5)稍微快一点:


它不是一个真正的函数,但根据
实际执行的操作,使用lambda表达式可能就足够了:

>>> def f(x, y):
...   return x * y
...
>>> g = lambda x: f(x, 2)
>>> g(3)
6
就性能而言,它似乎比
functools.partial
偶数(使用Python 2.7.5)稍微快一点:



谢谢,这看起来正是我需要的。不过,接下来的问题是,这比我原来的问题中定义一个新函数更有效吗?@user3208430您如何定义效率;速度内存使用情况?您是否有特定的性能问题?在速度和内存使用方面的效率。我只是想知道使用这个分部类是否比我在原始问题中所做的有优势,因为它不需要任何导入,而且人们可能会说它更可读。
timeit
表明
lambda
def g
大致相同,但是
分部
速度快了20-25%。酷,谢谢你真的经历了时间安排的麻烦!谢谢,这看起来正是我需要的。不过,接下来的问题是,这比我原来的问题中定义一个新函数更有效吗?@user3208430您如何定义效率;速度内存使用情况?您是否有特定的性能问题?在速度和内存使用方面的效率。我只是想知道使用这个分部类是否比我在原始问题中所做的有优势,因为它不需要任何导入,而且人们可能会说它更可读。
timeit
表明
lambda
def g
大致相同,但是
分部
速度快了20-25%。酷,谢谢你真的经历了时间安排的麻烦!你说“不是一个真正的函数”是什么意思?我的做法是为函数g(x)调用scipy.integrate.quad,在这种情况下它会工作吗?如果是,它是否更有效?@DSM-Well lambda表达式就是-表达式。它们不像函数那样包含语句。不幸的是,Python(不必要地)区分了lambda表达式和函数。@FrerichRaabe:我想我的意思是,无论语法限制如何,使用
lambda
的结果都是一个完全正常的函数。没有理由编写
g=lambda x:f(x,2)
,它构建了一个匿名函数,然后立即为它命名。@DSM为这个小练习命名的唯一原因是调用它。实际上,如果您想部分应用一个函数,那是因为您正在将部分应用的函数传递给其他函数,然后它将提供剩余的参数。阅读:在实践中,您不需要名称(在本例中,lambda似乎可以直接传递给
scipy.integrate.quad
)。您所说的“不是真正的函数”是什么意思?我的做法是为该函数g(x)调用scipy.integrate.quad,在这种情况下它会工作吗?如果是,它是否更有效?@DSM-Well lambda表达式就是-表达式。它们不像函数那样包含语句。不幸的是,Python(不必要地)区分了lambda表达式和函数。@FrerichRaabe:我想我的意思是,无论语法限制如何,使用
lambda
的结果都是一个完全正常的函数。没有理由编写
g=lambda x:f(x,2)
,它构建了一个匿名函数,然后立即为它命名。@DSM为这个小练习命名的唯一原因是调用它。实际上,如果您想部分应用一个函数,那是因为您正在将部分应用的函数传递给其他函数,然后它将提供剩余的参数。阅读:实际上,您不需要名称(在本例中,lambda似乎可以直接传递给
scipy.integrate.quad
)。