python回调函数返回无

时间:2017-11-21 11:39:57

标签: python

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

当我尝试打印add_nos.provide(append_zeros)时,它总是显示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)

3 个答案:

答案 0 :(得分:0)

目前还不完全清楚你要做什么,但是provide并没有返回任何东西。在python中,任何函数的默认返回类型都是None,因此隐式打印add_nos.provide(append_zeros)将执行函数调用,然后在幕后执行return None

您有一个选择是返回self.input_array

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

请注意,您也可以执行for x, y in self.input_array::)

据推测,你实际上想要用计算结果得到一个新列表。在这种情况下,这是list comprehension

的绝佳候选人
def provide(self,callback):
    return [callback(x, y) for x, y in self.input_array]

这是一行等效的

def provide(self, callback):
    ret = []
    for x, y in self.input_array:
        ret.append(callback(x, y))
    return ret

答案 1 :(得分:0)

方法add_nos.provide(self,callback)没有return语句,因此它不返回任何内容,在python中它表示返回None

要避免这种情况,可以添加一个return语句来提供(),或者只是调用方法而不打印。

答案 2 :(得分:0)

你说:

  

我希望结果在第一个实例中为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函数有点奇怪。而不是将args转换为字符串,以便你可以附加零,然后将结果转换回int来进行算术yu应该简单地将每个arg乘以100。

此外,您可以使用&#34; splat&#34;使.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