1

次の単純な python コードを考えてみましょう。

f=open('raw1', 'r')
i=1
for line in f:
    line1=line.split()
    for word in line1:
        print word,
print '\n'

最初の for ループ、つまり「f: の for 行」では、単語や文字ではなく行を読みたいことを Python はどのように認識しますか?

line1 がリストであるため、2 番目のループはより明確になります。したがって、2 番目のループはリストの要素を反復処理します。

4

2 に答える 2

4

Python には、「イテラブル」と呼ばれるものの表記法があります。それらは、保持しているデータをトラバースする方法を知っているものです。いくつかの一般的な反復子は、リスト、セット、辞書、ほとんどすべてのデータ構造です。これはファイルも例外ではありません。

反復可能になる方法は、メソッドでオブジェクトを返すメソッドを定義することnextです。このnextメソッドは、繰り返し呼び出され、毎回次のデータを返すことを意図しています。for foo in barループは実際には、舞台裏でメソッドを繰り返し呼び出しているだけですnext

ファイルの場合、nextメソッドは行を返します。それだけです。行が必要であることを「認識」していません。常に行を返すだけです。その理由は、ファイル トラバーサルを含むケースの約 50% が行単位であるからです。単語が必要な場合は、

 for word in (word for line in f for word in line.split(' ')):
     ...

うまく動作します。

于 2013-08-02T10:34:00.023 に答える
3

Python では、 for..in 構文がイテラブル(反復可能な要素) に対して使用されます。ファイル オブジェクトの場合、反復子はファイル自体です。

next()メソッドのドキュメントを参照してください-抜粋を以下に貼り付けます。

ファイルオブジェクトはそれ自身の反復子です。たとえば、 iter(f) は f を返します (f が閉じられていない場合)。ファイルが反復子として使用される場合、通常は for ループ (たとえば、f: print 行の for 行) で、 next() メソッドが繰り返し呼び出されます。このメソッドは、次の入力行を返すか、ファイルが読み取り用に開かれているときに EOF にヒットすると StopIteration を発生させます (ファイルが書き込み用に開かれている場合の動作は未定義です)。for ループをファイルの行をループする最も効率的な方法 (非常に一般的な操作) にするために、next() メソッドは非表示の先読みバッファを使用します。先読みバッファを使用した結果、next() を他のファイル メソッド (readline() など) と組み合わせると正しく機能しません。ただし、seek() を使用してファイルを絶対位置に再配置すると、先読みバッファーがフラッシュされます。バージョン 2.3 の新機能。

于 2013-08-02T10:29:17.490 に答える