web-dev-qa-db-ja.com

PythonのWhileループでの割り当て?

このコードに出会ったばかりです

while 1:
    line = data.readline()
    if not line:
        break
    #...

そして、考えてみてくださいmustこれを行うには、breakで無限ループを使用するよりも良い方法があります。

だから私は試しました:

while line = data.readline():
    #...

そして、明らかに、エラーが発生しました。

そのような状況でbreakの使用を避ける方法はありますか?

編集:

理想的には、readlineを2回言うのは避けたいと思うでしょう。特に、文が複雑な場合、繰り返しはbreakよりもさらに悪いです。

56
Mehrdad

後でさらに多くの行を読み込むなど、データを使いこなすのが面倒な場合は、常に次のようにします。

for line in data:
    ... do stuff ...
25
Ned Batchelder

これを試してください、open('filename')で開かれたファイルで動作します

for line in iter(data.readline, b''):
39
Niklas Claesson

これはそれほど良くありませんが、これは私が通常行う方法です。 Pythonは、他の言語(Javaなど)のように変数を割り当てたときに値を返しません。

line = data.readline()
while line:
    # ... do stuff ... 
    line = data.readline()
16
dfb

のように、

for line in data:
    # ...

dataオブジェクトのreadlineセマンティクスのセマンティクスに大きく依存します。 datafileオブジェクトである場合、それは機能します。

6
Kirk Strauser
for line in data:
    ... process line somehow....

fileを使用するのではなく、whileの各行を反復処理します。私の経験では(Pythonで)ファイルを読み取るタスクのはるかに一般的なイディオムです。

実際、dataはファイルである必要はなく、単に反復子を提供するだけです。

4
shelhamer

dataがファイルである場合、他の回答で述べられているように、for line in fileは正常に動作します。データがファイルではなく、ランダムなデータ読み取りオブジェクトである場合、イテレーターとして実装し、__iter__およびnextメソッド。

nextメソッドは読み取り値に対して、さらにデータがあるかどうかを確認し、ない場合はStopIterationを上げる必要があります。これを行う場合、for line in dataイディオム。

2
rafalotufo

Pythonのドキュメントの [〜#〜] faq [〜#〜] によると、for構文で入力を反復処理するか、無限のwhile Trueループを実行してbreakステートメントを終了するには、反復の優先される慣用的な方法です。

2
Mr. Deathless

Python 3.8の開始、および 代入式(PEP 572):=演算子)の導入により、条件値(data.readline())をキャプチャできるようになりました。変数としてのwhileループ(line)をループの本体内で再利用するために:

while line := data.readline():
  do_smthg(line)
2
Xavier Guihot

あなたができる:

line = 1
while line:
    line = data.readline()
2
brandon

datareadlineの代わりにイテレータを返す関数がある場合(たとえばdata.iterate)、あなたは簡単に行うことができます:

for line in data.iterate():
    #...
1
TorelTwiddler