Python函数可以作为另一个函数的参数吗?
说:
def myfunc(anotherfunc, extraArgs):
# run anotherfunc and also pass the values from extraArgs to it
pass
Run Code Online (Sandbox Code Playgroud)
所以这基本上是两个问题:
BTW,extraArgs是anotherfunc参数的列表/元组.
这对我来说是这样的:
class SomeName:
def __init__(self):
self.value = "something"
def some_method(self):
print self.value
def external_func(instance, method):
method(instance)
external_func(SomeName(), SomeName.some_method)
Run Code Online (Sandbox Code Playgroud)
这似乎正常工作。这是正确的方法吗?
我在函数中传递方法时遇到问题.我已经看过上一篇文章了.
这是我尝试过的一个简单例子.
def passMethod(obj, method):
return obj.method()
passMethod('Hi', lower)
Run Code Online (Sandbox Code Playgroud)
最后,我将使用它来帮助编写处理GIS(地理信息系统)数据的函数.数据就像一个数组.我想在数组中添加一个新列NAME1.然后该数组有一个方法来调用列array.NAME1.
问候,亚历克斯
该代码完全相同,所以我想以简单的方式重构它以减少行数.有一点不同的是最小/最大功能执行.是否可以在python中使用函数指针调用min/max作为指向函数的指针,就像在C中一样?
def calculate_min(a, b, c, d, e, f):
try:
v = a[e][f]
b[d] = v if np.isnan(b[d]) else min(b[d], v) #min()
except KeyError as exc:
logger.error("keyerror")
def calculate_max(a, b, c, d, e, f):
try:
v = a[e][f]
b[d] = v if np.isnan(b[d]) else max(b[d], v) #max()
except KeyError as exc:
logger.error("keyerror")
Run Code Online (Sandbox Code Playgroud) 我有一个计算 pandas 数据框的列模式的函数:
def my_func(df):
for col in df.columns:
stat = df[col].mode()
print(stat)
Run Code Online (Sandbox Code Playgroud)
但我想让它更通用,以便我可以更改我计算的统计数据,例如平均值,最大值,...我尝试将方法 mode() 作为参数传递给我的函数:
def my_func(df, pandas_stat):
for col in df.columns:
stat = df[col].pandas_stat()
print(stat)
Run Code Online (Sandbox Code Playgroud)
然而这似乎对我不起作用。使用一个简单的例子:
> A
a b
0 1.0 2.0
1 2.0 4.0
2 2.0 6.0
3 3.0 NaN
4 NaN 4.0
5 3.0 NaN
6 2.0 6.0
7 4.0 6.0
Run Code Online (Sandbox Code Playgroud)
它无法识别命令模式:
> my_func(A, mode)
Traceback (most recent call last):
File "<ipython-input-332-c137de83a530>", line 1, in <module>
my_func(A, mode)
NameError: name 'mode' …Run Code Online (Sandbox Code Playgroud) 我知道在Python中,如果你想要将两个参数传递给一个函数,一个是一个对象,另一个指定必须在对象上调用的实例方法,那么用户可以轻松地传递对象本身,以及方法的名称(作为字符串)然后使用getattr对象上的函数和字符串来调用对象上的方法.
现在,我想知道是否有一种方法(如在C++中,对于那些知道的人)传递对象的位置,以及实际方法(或者更确切地说是对方法的引用,但不是方法名称作为字符串).一个例子:
def func(obj, method):
obj.method();
Run Code Online (Sandbox Code Playgroud)
我试过传递如下:
func(obj, obj.method)
Run Code Online (Sandbox Code Playgroud)
或者作为
func(obj, classname.method)
Run Code Online (Sandbox Code Playgroud)
但是都不起作用(我认识的第二个是一个很长的镜头,但无论如何我试过了)
我知道您也可以定义一个只接受该方法的函数,然后将其称为
func2(obj.method)
Run Code Online (Sandbox Code Playgroud)
但我特别询问您希望引用对象本身的实例,以及对要在对象上调用的所需类实例(非静态)方法的引用.
编辑:
对于那些感兴趣的人,我发现了一个非常优雅的方式,受到下面接受的答案的"启发".我只是定义func为
def func(obj, method):
#more code here
method(obj, parameter); #call method on object obj
Run Code Online (Sandbox Code Playgroud)
并称之为
func(obj_ref, obj_class.method);
Run Code Online (Sandbox Code Playgroud)
其中obj_class是obj_ref是其实例的实际类.
是否可以调用在 Python 中作为参数传递的函数?我试过这样做,但它给出了错误
代码:
def doStuff():
print("doing stuff")
def doWork():
print("doing work")
def call_function(func):
func()
call_function(doStuff())
call_function(doWork())
Run Code Online (Sandbox Code Playgroud)
错误:
TypeError: 'NoneType' object is not callable
Run Code Online (Sandbox Code Playgroud) python ×7
arguments ×2
class ×2
coding-style ×1
function ×1
methods ×1
object ×1
pandas ×1
parameters ×1
pointers ×1
refactoring ×1