2013-05-01 138 views
3

所以我想拉過一招其實我第一次聽說這個網站的中間調用打印。在Python列表理解

[i for i in range(0, 10) if True or print(i)] 

的想法是,你可以堅持到底的「如果」語句,將始終返回true內部在listcomp的每一步調用任意函數。但是,該代碼給出了語法錯誤。

如果我換我想這樣調用的函數,雖然:

def f(i): 
    print i 

[i for i in range(0, 10) if True or f(i)] 

它產生所需的輸出。所以我想知道在Python的思想中,兩者之間有什麼區別,因爲我不知道它可能是什麼 - 兩個函數都返回「無」,對吧?

+2

'從__future__進口print_function';但爲什麼你需要有副作用呢? – 2013-05-01 14:51:06

+2

如果您實際上不需要它生成的列表,請不要使用列表解析來代替for-loop。 – chepner 2013-05-01 14:55:37

回答

6

你不能(在Python 2類似print)與列表理解混合語句。在你的文件的頂部

from __future__ import print_function 

但是,您可以使一個print()功能加入。這將print()變成整個模塊的功能。

但是,你正在使用的語句True or something和永遠不會評估「東西」因爲Python布爾表達式的短路。要圍繞轉:

if print(something) or True 

有評價,如果左側已經評價True一個or表達的右側沒有任何意義;右邊的任何東西都不會讓整個表達式成爲False

你真的想要避免這樣的副作用,但在列表理解。使用適當的循環,並保持代碼不會出現這樣的驚喜,使用if something or True實際上是一種黑客,它會混淆未來的代碼維護人員(包括您)。

+0

啊,有道理。我不知道print()不是函數。關於短路的事情你是對的:我提供的代碼實際上並沒有產生正確的輸出 - 我想的是「不是f(i)」。 – 2013-05-01 15:05:32

5

在Python 2.x中,打印是不是一個函數。它成爲一個功能在Python 3

1

print是py2x聲明中沒有表達,因此不能用在表達式的預期。

您需要以使其工作從__future__導入print_function

In [105]: from __future__ import print_function 

In [107]: [i for i in range(0, 10) if print(i) or True] 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
Out[107]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

注意,作爲print()回報None所以在您or條件是必須放在第一或使用and條件:if True and not print(i)

+0

這是列表理解的返回值; 'print()'*不叫*。 – 2013-05-01 14:55:09

+0

'真和印(i)'不會做你想要的;它會評估爲「False」,而不會在結果列表中添加任何內容。 – 2013-05-01 15:00:08

+0

@MartijnPieters啊!是的,忘了在它之前加一個'not'。 – 2013-05-01 15:01:35