python回调函数返回None

python回调函数返回None,python,Python,我有一个简单的类,添加了2个。在添加2个之前,我传递了一个附加2个零的helper函数并传递结果 当我试图打印add_nos.provide(append_zero)时,它总是显示None def append_zeros(x,y): x = int(str(x) + '00' ) y = int(str(y) + '00') print x+y return x + y class Add_Nos(): def __init__(self,input

我有一个简单的类,添加了2个。在添加2个之前,我传递了一个附加2个零的helper函数并传递结果

当我试图打印add_nos.provide(append_zero)时,它总是显示None

def append_zeros(x,y):
    x = int(str(x) + '00' ) 
    y = int(str(y) + '00')
    print x+y
    return x + y

class Add_Nos():
    def __init__(self,input_array):
        self.input_array = input_array 

    def provide(self,callback):
        for each in self.input_array:
            x,y = each
            callback(x,y)

add_nos = Add_Nos([(1,2),(3,4)])            
print add_nos.provide(append_zeros)

您想做什么还不完全清楚,但是
provide
不会返回任何内容。在python中,任何函数的默认返回类型都是
None
,因此隐式打印
add\u nos.provide(append\u zeros)
将执行函数调用,然后
在后台返回None

一个选项是返回self.input\u数组:

class Add_Nos():
    def __init__(self,input_array):
        self.input_array = input_array

    def provide(self,callback):
        for each in self.input_array:
            x,y = each
            callback(x,y)

        return self.input_array
注意,您也可以在self.input_数组中对x,y执行
:)

据推测,您实际上希望得到一个包含计算结果的新列表。在这种情况下,这是一个优秀的候选人:

这是一行相当于做的事情

def provide(self, callback):
    ret = []
    for x, y in self.input_array:
        ret.append(callback(x, y))
    return ret
add_nos.provide(self,callback)方法没有返回语句,因此它不返回任何内容,这在python中意味着它返回
None

为了避免这种情况,可以添加一个return语句来提供()或直接调用该方法而不打印。

您说过:


我希望结果一开始是300,一开始是700 下一个实例,生成一个迭代器对象

因此,您只需将
.provide
方法转换为生成器,然后适当地调用它。像这样:

def append_zeros(x,y):
    x = int(str(x) + '00') 
    y = int(str(y) + '00')
    #print x+y
    return x + y

class Add_Nos():
    def __init__(self,input_array):
        self.input_array = input_array 

    def provide(self,callback):
        for each in self.input_array:
            x,y = each
            yield callback(x,y)

add_nos = Add_Nos([(1,2),(3,4)]) 
for t in add_nos.provide(append_zeros):
    print t
输出

300
700

append_zeros
函数有点奇怪。与其将arg转换为字符串,这样您就可以附加零,然后将结果转换回
int
s来执行算术运算,相反,yu只需将每个arg乘以100即可

此外,通过使用“splat”解包,您还可以使
.provide
方法更加简化。正如前面提到的
tyteen4a03
一样,在Python 2中,您的
Add_Nos
类应该继承自
object
,这样您就得到了一个新样式的类,而不是不推荐使用的旧样式的类。所以这里有另一个版本的这些变化;它产生与上述代码相同的输出

def append_zeros(x, y):
    return x * 100 + y * 100

class Add_Nos(object):
    def __init__(self, input_array):
        self.input_array = input_array 

    def provide(self, callback):
        for each in self.input_array:
            yield callback(*each)

add_nos = Add_Nos([(1,2),(3,4)]) 
for t in add_nos.provide(append_zeros):
    print t

这是Python 2还是Python 3?您需要创建
Add\u Nos
子类
object
,否则它将创建一个旧式类。此外,来自
回调(x,y)
的结果将被丢弃。您希望返回值是什么样的?您希望打印什么
print add\u nos.provide(append\u zeros)
来打印?我希望结果在第一个实例中是300,在下一个实例中是700,这类似于生成一个迭代器对象。然后您需要将
.provide
方法转换为生成器。
def append_zeros(x, y):
    return x * 100 + y * 100

class Add_Nos(object):
    def __init__(self, input_array):
        self.input_array = input_array 

    def provide(self, callback):
        for each in self.input_array:
            yield callback(*each)

add_nos = Add_Nos([(1,2),(3,4)]) 
for t in add_nos.provide(append_zeros):
    print t