2016-08-18 82 views
0

在Haskell,我可以做如何在列表理解中定義一個變量?

Prelude> [(y*3, y+4) | x<-[0..5], let y=x^2] 
[(0,4),(3,5),(12,8),(27,13),(48,20),(75,29)] 

什麼是Python中的等價物,但不重複功率運行,因爲我需要在

>>> [((x**2)*3, (x**2)+4) for x in range(5)] 
[(0, 4), (3, 5), (12, 8), (27, 13), (48, 20)] 

我當然可以效仿的Haskell代碼以拉姆達,但那並不覺得Pythonic ...

>>> [(lambda y: (y*3, y+4))(x**2) for x in range(5)] 
+0

簡而言之:用嵌套的發生器。 '(a * 3,a + 4)for a(x ** 2 for x in range(5)]' – TigerhawkT3

回答

1

你不能在理解指定變量,但你可以使用嵌套發電機表達,做什麼,我想你想(沒有lambda函數)。

[(y*3, y+4) for y in (x**2 for x in range(5))] 
1

你不能那樣做。賦值總是Python中的一個語句;列表推導只能包含表達式。

+0

真的嗎?我可以用lambda達到目標,所以我並不真的買它可以只能用表達式來完成......只是......沒有比lambda更習慣的解決方案嗎? – leftaroundabout

1

如何:

>>> [(x*3, x + 4) for x in map(lambda y: y**2, range(5))] 
[(0, 4), (3, 5), (12, 8), (27, 13), (48, 20)]