私はRaymond Hettingerさんのお話Transforming Code into Beautiful, Idiomatic Pythonを見ていましたが、彼は私が決して知らなかったこの形のiter
を持ってきます。彼の例は以下の通りである。iter(callable、sentinel)の用途は何ですか?
の代わりに:
blocks = []
while True:
block = f.read(32)
if block == '':
break
blocks.append(block)
用途:
blocks = []
read_block = partial(f.read, 32)
for block in iter(read_block, ''):
blocks.append(block)
iter
のdocumentationを確認した後、私は同様の例が見つかりました:
with open('mydata.txt') as fp:
for line in iter(fp.readline, ''):
process_line(line)
この私にはかなり役立つように見えますが、私はあなたのことをPythonis I/O-readループを伴わないこの構造の例を知っていますか?おそらく標準ライブラリですか?
私は次のような非常に不自然な例、と考えることができます:
>>> def f():
... f.count += 1
... return f.count
...
>>> f.count = 0
>>> list(iter(f,20))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>>
しかし、明らかに、これは任意のより便利なビルトインイテラブルものではありません。また、関数に状態を代入しているときに、コードの臭いのように思えます。その時点で、私はおそらくクラスで作業する必要がありますが、クラスを書くつもりなら、私が達成したいもののイテレータプロトコルを実装することもできます。ここで
は、私はより良いこの質問をする方法についてのいくつかのフィードバックをいただければ幸いです。 –