2013-10-22 11 views
2

創建在Python調試或Django的殼循環單行很簡單:如何創建一個單行腳本兩個for循環,在調試器,在Python 2.7

>>>> for x in (1,2,3,4):print(x); 
>>>> for x in Obj.objects.all():something(x); 

但我怎麼能在那裏獲得第二個循環?

>>>> for x in (1,2,3,4):print x;for y in (5,6):print x,y; 
SyntaxError: invalid syntax 

我不在乎,因爲它是不錯的了先前命令的箭頭編輯,交互工作時(這是不使用單行在其他任何情況下命令的嘗試)。

注意:「打印」只是一個例子。在實際使用中,我會迭代對象或執行其他編程或調試任務,例如在s.children():print j'中的Section.objects.all()中爲's'。我正在使用Python 2.7。

回答

6

對於倍列表理解也做不了

for x in (1,2,3,4):print x;exec("for y in (5,6):print x,y;") 

for s in Section.objects.all():exec("for j in s.children():print j") 

有時你可以使用itertools.product(但是沒有方式得到print x)這樣

for x, y in itertools.product((1,2,3,4), (5,6)):print x,y) 
+0

除非您對該部分進行了硬編碼,否則我會嚴格建議不要使用exec。 –

+2

@KaranGoel,這個用例就是你正在調試時想要使用向上箭頭編輯和重新運行該行。我認爲'exec'在這裏是可以的 –

+0

我真正想要做的更像是's in Section.objects.all():for s in s.children():print j' – Bryce

3

列表理解可用於實現你想要的。你想確切是不可能的。

>>> [(x, y) for x in (1, 2, 3, 4) for y in (5, 6)] 
[(1, 5), (1, 6), (2, 5), (2, 6), (3, 5), (3, 6), (4, 5), (4, 6)] 

相關:Single Line Nested For Loops

+0

但是這會忽略'print x'部分 –

+0

因爲列表解析會生成帶有可選條件的列表,所以無法在其中打印。 –

+1

'print'是Python3中的一個函數,但是一旦你這樣做了,它會比使用'exec' –

0

您可能最終將命令放在第一位。例如。

>>> [print("hi") for x in (1, 2, 3, 4) for y in (5, 6)] 

然而,你最終會遇到一個問題。除非你想在開始時調用一個函數,否則我不相信有一種方法。例如。

>>> [doSomething(x, y) for x in (1, 2, 3, 4) for y in (5, 6)] 
+0

>>> [print(「hi」)for x in(1,2,3,4)for y in(5,6)] SyntaxError:無效的語法 – Bryce

+0

您是使用python 3.0還是更高?我只是使用Python 2.7.4嘗試了這個完全相同的東西,它在'print'函數上引發了一個SyntaxError,但是當我在Python 3.3.1中嘗試它時,它工作得很好。 – KodyVanRy

+0

我在Python 2.7級別,可能會很長一段時間。 – Bryce

相關問題