このコードに出会ったばかりです
while 1:
line = data.readline()
if not line:
break
#...
そして、考えてみてくださいmustこれを行うには、break
で無限ループを使用するよりも良い方法があります。
だから私は試しました:
while line = data.readline():
#...
そして、明らかに、エラーが発生しました。
そのような状況でbreak
の使用を避ける方法はありますか?
理想的には、readline
を2回言うのは避けたいと思うでしょう。特に、文が複雑な場合、繰り返しはbreak
よりもさらに悪いです。
後でさらに多くの行を読み込むなど、データを使いこなすのが面倒な場合は、常に次のようにします。
for line in data:
... do stuff ...
これを試してください、open('filename')
で開かれたファイルで動作します
for line in iter(data.readline, b''):
これはそれほど良くありませんが、これは私が通常行う方法です。 Pythonは、他の言語(Javaなど)のように変数を割り当てたときに値を返しません。
line = data.readline()
while line:
# ... do stuff ...
line = data.readline()
のように、
for line in data:
# ...
? data
オブジェクトのreadlineセマンティクスのセマンティクスに大きく依存します。 data
がfile
オブジェクトである場合、それは機能します。
for line in data:
... process line somehow....
file
を使用するのではなく、while
の各行を反復処理します。私の経験では(Pythonで)ファイルを読み取るタスクのはるかに一般的なイディオムです。
実際、data
はファイルである必要はなく、単に反復子を提供するだけです。
data
がファイルである場合、他の回答で述べられているように、for line in file
は正常に動作します。データがファイルではなく、ランダムなデータ読み取りオブジェクトである場合、イテレーターとして実装し、__iter__
およびnext
メソッド。
next
メソッドは読み取り値に対して、さらにデータがあるかどうかを確認し、ない場合はStopIteration
を上げる必要があります。これを行う場合、for line in data
イディオム。
Pythonのドキュメントの [〜#〜] faq [〜#〜] によると、for
構文で入力を反復処理するか、無限のwhile True
ループを実行してbreak
ステートメントを終了するには、反復の優先される慣用的な方法です。
Python 3.8
の開始、および 代入式(PEP 572) (:=
演算子)の導入により、条件値(data.readline()
)をキャプチャできるようになりました。変数としてのwhileループ(line
)をループの本体内で再利用するために:
while line := data.readline():
do_smthg(line)
あなたができる:
line = 1
while line:
line = data.readline()
data
にreadline
の代わりにイテレータを返す関数がある場合(たとえばdata.iterate
)、あなたは簡単に行うことができます:
for line in data.iterate():
#...