2016-12-07 131 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