2016-12-07 221 views
0

说我有一个功能,像这样:地图kwargs返回nonetype蟒蛇

def test(*args, **kwargs): 
    print(args, kwargs) 

,我想它调用地图对象,像这样:

obj = map(lambda var: test(var+1, var = var), [1, 2, 3]) 

当我打印值显示为:

>>> for i in obj: 
    print(i) 


(2,) {'var': 1} 
None 
(3,) {'var': 2} 
None 
(4,) {'var': 3} 
None 

None值从哪里来?

回答

1

你映射功能是打印,没有返回值,所以当你迭代map对象,i被设置为None遍地(None由没有明确return别的任何函数返回)。要解决,你的函数定义更改为类似:

def test(*args, **kwargs): 
    return args, kwargs 

所以返回值,而不是打印和你的循环的print会看到他们,而不是None秒。

或者,离开此功能原样,并改变环路:

for i in obj: 
    pass 

这样你就不会从test. This is generally bad style mind you;地图's mapping function should be side-effect free (打印​​地图. In general, functions that打印instead of回报ing are bad ideas; if you返回, the caller can打印打印无用None小号if they want to, or use a返回value programmatically, but if you print`,调用者无法真正做很多事情(即使他们通过俗气的黑客捕获它,他们坚持解析它做任何有用的事情)。

+0

谢谢!但现在它返回一个元组,如'((2,),{'var':1})''。有什么办法可以解决这个问题吗?我在下一行尝试'返回args'和'return kwargs',但它只返回'args'。 – rassar

+1

@rassar:多个返回值总是'tuple's,你不能避免('return'只能返回一个东西,逗号只是让它产生一个所有东西的'元组') “)。但是你可以改变你的循环到'for a,b in obj:print(a,b)'来重新编译循环,或者'for in in obj:print(* i)'在'print'调用中解压缩。 Python的序列解包是使得多重返回能够以隐藏'元组'方面的方式被使用的原因。 – ShadowRanger

1

您的功能test不返回任何内容,因此它返回None。所以运行

obj = map(lambda var: test(var+1, var = var), [1, 2, 3]) 

后,您会真正得到obj[None, None, None]

也许你想,而不是返回打印在你的函数:

def test(*args, **kwargs): 
    return (args, kwargs) 
+0

有没有办法让它不返回一个元组? – rassar

+0

@rassar你想要它返回什么? –

+0

只是'args'和'kwargs'不在元组中,就像它在原文中一样。 '(2,),{'var':1}'而不是'((2,),{'var':1})''。那不是python的返回工作吗?返回多个值的 – rassar