[英]Why print cannot be used with for on the same line in python 2/3?
我很想實現以下目標:
print(i) for i in xrange(10)
但是,這在python2和python3中都不起作用。 語言的局限性是什么? 還是我做錯了什么?
像這樣:
for i in xrange(10): print(i)
您也可以執行類似的操作,但只能在Python 3中使用print
作為函數。 但是,這是對生成器表達式的濫用。
any(print(i) for i in range(10))
集構建器符號 (在Python中稱為生成器表達式)僅在構建集時起作用。 您使用的表示法是set builder表示法(生成器表達式)(類似於x for x in range(10) if ...
)。 話雖如此,您可以使用常規的for循環
for i in xrange(10):
print(i)
或構建空集的集構建器符號:
>>> x = [print(i) for i in xrange(10)]
0
1
2
3
4
5
6
7
8
9
>>> x
[None, None, None, None, None, None, None, None, None, None]
>>>
集合具有所有none值的原因是因為您從不添加到集合,而僅打印出東西。
x for x in <sequence>
形式旨在產生一個列表。 原來是這樣的:
>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
在Python 2.0中引入的Python增強建議202 ,來自對map()和filter()的用法變化。 這些功能和列表理解源於功能編程環境,該環境傾向於無副作用和無意外狀態變化等。
在列表推導支持函數調用的情況下,它打算用於這種簡單的轉換:
>>> [math.sin(x) for x in whatever]
[0.1, 0.2, ...]
該功能旨在將一個列表項更改為新的列表項-輸出仍然是列表。
幾年后, PEP289中這種語法丟失了方括號[ ]
,因為它們在Python 2.4中變得對內存效率更高的Generator Comprehensions。 它們用於不需要完整列表作為列表的情況,因為您一獲得所有內容就立即對其進行處理-例如sum(i for i in range(10))
可以將所有數字加起來為它們出現,而無需等待整個序列先完成計算。
您要使用它的方式- print(x) for x in <sequence>
采用生成器理解的形式,但是您不希望生成器,列表和序列。 您只希望這樣做,以免在調用該函數時發生副作用。
這並非不可能,您可以在Python 2中執行此操作
import sys
[sys.stdout.write(str(i) + '\n') for i in range(10)]
正如@wim在注釋中指出的那樣,這在Python 3中:
[print(i) for i in range(10)]
但是,print()不會返回任何有用的信息,新創建的列表或生成器無關緊要,並且立即被丟棄。
這種結構會使閱讀您的代碼的人感到困惑/誤導,當您不想構建列表時,您明確使用了“我要構建列表”格式。
這也與列表理解的原始思想及其在函數式編程中的起源背道而馳-當事情沒有副作用時,就更容易進行推理了。
如果要遍歷序列並打印某些內容,請顯式遍歷列表並進行打印( for item in sequence: print(item)
)。 不要以“我要建立一個新列表,哦,我偷偷地打印一些東西作為副作用,然后將列表扔掉”開頭。
很難讀懂您的意圖-您是要這樣做嗎? 您想要它做什么?
很難解釋-此代碼是做什么的? “它建立了一個None
的新列表,這些列表是打印列表項的返回值”。 這就是所有錯誤地方發生的事情的重點。
您的嘗試在語法上是不正確的,但是您實際上可以使用print作為函數在一行中完成它,而無需顯式的for循環:
print(*range(10), sep="\n")
等效於:
for i in range(10):
print(i)
並輸出:
In [32]: print(*range(10),sep="\n")
0
1
2
3
4
5
6
7
8
9
In [2]: print(*range(10))
0 1 2 3 4 5 6 7 8 9
在python2中,您只需要導入print_function
:
from __future__ import print_function
In [3]: print(*xrange(10),sep="\n")
0
1
2
3
4
5
6
7
8
In [4]: print(*xrange(10))
0 1 2 3 4 5 6 7 8 9
或使用str.join
:
print("\n".join(map(str,range(10))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.