[英]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.