2017-02-14 41 views
2

我在這裏有一個「最佳實踐」的問題。我使用map的方式可能不會被使用 - 使用列表元素來改變不同對象的狀態。最終的列表輸出實際上並沒有改變。這是否合適?適合使用map(func,list)來轉換對象而不返回列表?

例如:

class ToBeChanged(object): 
     def __init__(self): 
      self.foo_lst = [1,2,3,4] 
     def mapfunc(self, arg): 
      if arg in ['foo', 'bar']: 
       self.foo_lst.append(arg) 
      else: 
       pass 

test = ToBeChanged() 
list_to_map = [1,2,37,'foo'] 

map(lambda x: test.mapfunc(x), list_to_map) 
+0

閱讀下列2,你就會有你的答案:http://stackoverflow.com/questions/ 1247486/python-list-comprehension-vs-map和http://stackoverflow.com/questions/5753597/is-it-pythonic-to-use-list-comprehensions-for-just-side-effects –

回答

4

這是不合適的。在Python 2中,您將創建一個與list_to_map相同長度的新列表,並立即丟棄它;浪費! lambda甚至使它更復雜。

最好使用一個for循環:

for x in list_to_map: 
    test.mapfunc(x) 

更簡明和易讀。

如果你仍然想在Python 3中使用它(通過強制懶惰對象以某種方式進行評估),請考慮那些將維護你的代碼的人; map給出了您想要從列表中創建新迭代的印象。

+0

好點;但在Python 3中,將調用映射生成新的列表? –

+1

但是在Python 3中,for循環會做更多的工作;浪費! :-P –

+0

@StefanPochmann這正是我提出這個問題的原因 - 我使用了地圖,因爲我的印象是地圖的工作量較少;此外,它只是一個解決方案 –

2

地圖是最差的。

因爲如果您嘗試在python3中運行代碼,它甚至不會執行調用,因爲在python3地圖是懶惰的。

在任何情況下,調用映射或列表理解都是表達式,表達式應儘可能無副作用,其目的是返回一個值。

所以,如果你沒有一個值來返回你應該只使用普通的語句:即明確了

相關問題