簡體   English   中英

Python 在 while 循環中的條件期間為變量賦值

[英]Python Assign value to variable during condition in while Loop

關於 Python 語法的一個簡單問題。 我想在 while 循環的條件期間將一個函數的值分配給一個變量。 當函數返回的值為 false 時,循環應該中斷。 我知道如何在 PHP 中做到這一點。

while (($data = fgetcsv($fh, 1000, ",")) !== FALSE) 

但是,當我在 Python 中嘗試類似的語法時,出現語法錯誤。

不能在表達式中使用賦值。 賦值本身就是一個語句,不能組合 Python 語句。

這是語言設計者做出的明確選擇; 很容易不小心使用一個=並賦值,而您打算使用兩個==並測試相等性。

將賦值移到循環中,或循環之前賦值,並在循環本身中賦值新值。

對於您的具體示例,Python csv模塊為您提供了一個更高級別的 API,而您將在csv.reader()循環:

with open(csvfilename, 'rb') as csvfh:
    reader = csv.reader(csvfh)
    for row in reader:

很少(如果有的話)需要在循環結構中進行分配。 通常有一種(好得多)更好的方法來解決手頭的問題。

也就是說,從 Python 3.8 開始,該語言實際上將具有賦值表達式,使用:=作為賦值運算符。 參見PEP 572 賦值表達式在列表推導中實際上很有用,例如,當您需要在正在構建的列表中包含一個方法返回值並且需要能夠在測試中使用該值時。

現在,您必須使用生成器表達式:

absolute = (os.path.abspath(p) for p in files)
filtered = [abs for abs in absolute if included(abs)]

但是使用賦值表達式,您可以內聯os.path.abspath()調用:

filtered = [abs for p in files if included(abs := os.path.abspath(p))]

2020 答案:

從 Python 3.8 開始, “海象運算符” :=存在,它完全符合您的要求:

while data := fgetcsv(fh, 1000, ",") != False:
    pass

(如果存在 fgetcsv 函數)

2013 年答案:您不能在 Python 中做到這一點,表達式中沒有賦值。 至少這意味着您不會意外地鍵入 == 而不是 = 或相反地使其工作。

傳統的 Python 風格只是使用 while True 和 break:

while True:
    data = fgetcsv(fh, 1000, ",")
    if not data:
        break
    # Use data here

但現在我把它放在一個發電機中:

def data_parts(fh):
    while True:
        data = fgetcsv(fh, 1000, ",")
        if not data:
            break
        yield data

這樣在使用該文件的代碼中,丑陋就被隱藏了:

for data in data_parts(fh):
    # Use data here

當然,如果它實際上是您正在執行的 CSV 讀取,請使用 csv 模塊。

我寫了一個小的 Python 模塊,我稱之為let ,它允許你在允許函數的任何地方執行變量賦值。

像這樣安裝它:

pip install let

我相信以下將完成您正在尋找的內容:

from let import let

while let(data = fgetcsv(fh, 1000, ',')):
    # Do whatever you'd like with data here

但是...... Duncan 的評論說使用iter的原始問題很有趣。 直到他提出這個功能我才意識到它,現在我相信它可能是比我更好的解決方案。 這是有爭議的 - iter需要明確提供一個哨兵,而我的不在乎,只是等待fgetcsv返回任何False y 值。

Python 3.8 pep-0572現在使用新符號:=解決這種情況。 看一看 :)

例如:

while chunk := file.read(8192):
   process(chunk)

暫無
暫無

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

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