簡體   English   中英

而真實vs而{condition}

[英]while True vs while {condition}

我正在讀一本關於Python3的書(由Bill Lubanovic介紹Python),並且遇到了一些我不確定是Python偏好的東西,還是因為成為一本書而試圖描述其他東西的“簡化”。

它是關於如何使用塊而不是一次性寫入文件。

poem = '''There was a young lady named Bright,
Whose speed was far faster than light;
She started one day
In a relative way,
And returned on the previous night.'''

fout = open('relativity', 'wt')
size = len(poem)
offset = 0
chunk = 100
while True:
    if offset > size:
        break
    fout.write(poem[offset:offset+chunk])
    offset += chunk
fout.close()

我打算問為什么它有while True而不是while (offset > size) ,但是我決定自己嘗試一下,並且看到while (offset > size)實際上並沒有在我的Python控制台中做任何事情。

這只是控制台中的一個錯誤,還是Python真的要求你像這樣在while循環中移動條件? 通過所有更改使其盡可能小,這看起來非常冗長。

(我來自Java,C#和JavaScript的背景,其中作為循環定義的條件是標准的。)

編輯

感謝xnx的評論,我意識到我的邏輯不正確,我的條件是什么。

這讓我回到了一個更清晰的問題,我最初想要關注的是:

Python是否更喜歡做while True而且條件在循環中使用了一個break ,或者這只是對作者的疏忽,因為他試圖解釋一個不同的概念?

我正要問為什么它有True而不是while(offset <= size),但我決定自己嘗試一下,

這實際上就是我寫它的方式。 它應該在邏輯上是等同的。

並且看到while(offset> size)在我的Python控制台中實際上沒有做任何事情。

您需要使用(offset <= size) ,而不是(offset > size) 一旦offset量大於size ,當前邏輯就會停止,因此如果要將其置於while語句中,請反轉條件。

Python真的要求你像這樣在while循環中移動條件嗎?

不,Python允許你直接在while循環中寫入條件。 兩種選擇都很好,而且在編寫邏輯方面,這更多地取決於個人偏好。 正如你所建議的那樣,我更喜歡原始作者版本的簡單形式。

這應該工作正常:

while offset <= size:
    fout.write(poem[offset:offset+chunk])
    offset += chunk

有關詳細信息,請參閱while的文檔,其中明確指出可以在:之前使用任何表達式。


編輯:

Python是否更喜歡做True而且條件在循環中使用了一個中斷,或者這只是對作者的疏忽,因為他試圖解釋一個不同的概念?

Python不喜歡while True: . 兩個版本都很好,這完全是編碼器的首選問題。 我個人更喜歡將表達式保留在while語句中,因為我發現使用while offset <= size:代碼更清晰,更簡潔,更易於維護。

將條件放在循環中是合法的Python代碼。 我自己覺得:

while offset <= size:

比以下更清楚:

while True:
    if offset < size:
        break

我更喜歡第一種形式,因為有一個較少的分支要遵循,但邏輯並不復雜。 在所有其他條件相同的情況下,較低的縮進程度更易於閱讀。 如果有多個不同的條件會突破循環,那么最好采用while True語法。

至於使用不正確的循環邏輯觀察到的行為,請考慮以下代碼段:

size = len(poem)
offset = 0

while offset > size:
    #loop code

永遠不會輸入while循環,因為offset > size從false開始。

while True:
    if offset > size:
        break
    func(x)

完全等同於

while offset <= size:
    func(x)

它們都運行到偏移>大小。 它只是一種不同的表達方式 - 兩者都是可以接受的,而且我不知道任何性能差異。 如果你在while循環的底部有一個break條件(即在func(x) ),它們只會以不同的方式運行

編輯:

根據Python維基 ,在Python 2. *“它減慢了很多事情”將條件置於while循環中:“這是因為首先測試True條件,然后再次測試”中斷條件。 我不知道他們用什么措施“很多”,但它似乎微不足道。

Python是否更喜歡做True而且條件在循環中使用了一個中斷,或者這只是對作者的疏忽,因為他試圖解釋一個不同的概念?

不,它不是,這是作者自己的怪癖或錯誤。

在某些情況下,典型的Python風格(和Guido van Rossum)積極建議使用while True ,但這不是其中之一。 也就是說,他們也不會貶低它。 我想有些情況下,測試會更容易閱讀和理解為“說什么時候打破”而不是“說何時繼續”。 即使它們只是對彼此的邏輯否定,一個或另一個可能會更簡單地表達事物:

while not god_unwilling() and not creek_risen():
while not (god_unwilling() or creek_risen()):

while True:
    if god_unwilling() or creek_risen():
        break

我仍然更喜歡第一個,但YMMV。 更好地介紹與英語成語相對應的函數: god_willing()creek_dont_rise()

“必要的”用法是當你想在循環的結束或中間執行中斷測試時(也就是說,當你想第一次無條件地執行部分或全部循環時)。 在其他語言有更多種類更復雜的循環結構的情況下,其他示例使用變量來玩游戲來決定是否打破,Guido說“只使用while True ”。 以下是常見問題解答中的一個示例,用於以賦值開頭循環

C代碼:

while (line = readline(f)) {
    // do something with line
}

Python代碼:

while True:
    line = f.readline()
    if not line:
        break
    # do something with line

FAQ備注(這與典型的Python風格有關):

一個有趣的現象是,大多數有經驗的Python程序員都認識到while True成語,並且似乎並沒有錯過表達式構造中的賦值; 只有新人表達了強烈的願望才能將其添加到語言中。

它還指出,對於這個特定的例子,你實際上可以避免整個問題與for line in f

從文件中讀取時 ,通常會這樣做

output = []
while True:
    chunk = f.read(chunksize)
    if len(chunk) == 0:
        break
    output.append(chunk)

在我看來,作者更習慣於閱讀而不是寫作,在這種情況下,使用while True的閱讀習慣已經泄露到寫作代碼中。

正如回答這個問題的大多數人都可以證明的那樣,使用while offset <= size可能更像Pythonic而且更簡單,盡管更簡單可能只是做

f.write(poem)

因為底層I / O庫可以為您處理分塊寫入。

在我看來, 雖然True比其他方式更好,但在大型項目中; 它有很長的代碼。 因為你實際上看不到一個變量可能會因某些函數等改變, 而True意味着如果它的真值 啟動就意味着啟動這個循環除了關閉程序之外發生的任何事情 因此,這本書的作者可能希望你曾經使用過True ,但風險要小於其他人。

它最好用於True,並定義可能會停止此循環的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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