2017-09-05 11 views
1

ジェネレータ関数を使用してファイルから行を読み取る利点はありますか?私はスクリプトの中でこのような何かを見たので、私はこれを聞いてるのよ:ファイルから行を読み取るジェネレータ

with open(file, 'r') as f: 
    liter = (l.rstrip("\r\n") for l in f) # <generator object <genexpr> at 0x10617c728> 
    for line in liter: 

このアプローチのような単純なブロックよりも良い(あるいはどのような状況では)次のようになります。

with open(file, 'r') as f: 
    for line in f: 
     line = line.rstrip("\r\n") 
+0

連鎖発生器の解説を使用してコードを1行に書くことができない限り、利点はありません。 –

+0

テキストモードで既に 'rstrip(' \ r ")'を実行する必要はないことに注意してください。 –

+0

私は、組み込みの 'iter'関数を変数名でシャドーしません。 'stripped_lines'のような表現的なもの –

答えて

1

最初のアプローチをdoesnの「Tはずっと持って来る:

  • をループ
  • がありますので、それは(それが完全なループコードではない完全な理解の構文ではありません初心者には難しいティムを持っていますので、電子あなたがせずに1行にループあなたのコードを書くことができれば

はそれが興味を持っているでしょう)、それを理解する:

result = [x for x in (l.rstrip("\n") for l in f) if x] 

(非空行のリストを作成し、それは、ありますそしてサイドノートとして、テキストモードはすでにそれをしないので、もちろんである以上1つの\r文字がある場合を除き、行の末尾から\rを除去する必要はありません非標準)

またはIN lambdaこれらのいまいましい改行を削除し忘れを防ぐためにすべてのコード上で使用します。あなたが側を持っている場合(ループを使用する必要が場合

stripped_lines = lambda f : (l.rstrip("\n") for l in f) 

はその後

for l in stripped_lines(f): 
    ... 

第2のアプローチは、明確かつ簡単です-effect呼び出しの場合は、補完を避けてループを使用することをお勧めします)

関連する問題