簡體   English   中英

為什么在python 2/3的同一行上不能使用for打印?

[英]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()不會返回任何有用的信息,新創建的列表或生成器無關緊要,並且立即被丟棄。

這種結構會使閱讀您的代碼的人感到困惑/誤導,當您不想構建列表時,您明確使用了“我要構建列表”格式。

這也與列表理解的原始思想及其在函數式編程中的起源背道而馳-當事情沒有副作用時,就更容易進行推理了。

Python禪宗

  • 顯式勝於隱式。

如果要遍歷序列並打印某些內容,請顯式遍歷列表並進行打印( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM