1つのパラメータ、つまりの反復可能関数を入力とし、iterableに対して複数回繰り返したいとします。可能な限りイテレータをリストに変換しないようにする
私はこのようにそれを記述する場合:
def a_function(an_iterable):
for x in an_iterable:
print(x)
for x in an_iterable:
print(x)
第二のループは、実行するか、しないかことがあります。反復可能カスタムジェネレータ関数またはf=open("file")
を用いて得られたファイル・オブジェクト(のため
list
、set
、dict
、またはrange
ある場合、それが実行され
- )。もちろん(ファイルイテレータの再利用は、ここでSOでの多くの質問の主題である)
必要でない場合、私は不要なlist
を作成しないようにこれを行うことができます:
def a_function(an_iterable):
if any(lambda x : type(an_iterable==x) for x in (range,list,set,dict))):
# use as-is
pass
else:
an_iterable = list(an_iterable)
for x in an_iterable:
print(x)
for x in an_iterable:
print(x)
多くの一般的なケースではありますが、一般的なケースではありません。
繰り返し可能なオブジェクトに対して何度も繰り返し処理できるかどうかを検出するきれいな方法はありますか?
別の精度:私は 'yield'を使用して関数を作成する場合はどのような
__next__
がある場合は、あなたがそれが呼び出し可能であることを確認する必要があります属性?それには '__next__'はありませんが、「元に戻す」ことはできません。それは特別な場合ですか? 'hasattr(it、" __ code __ ")' –@ Jean-FrançoisFabreが 'callable'であるかどうかを確認するだけで確認できますか?問題はあなたがそれを呼び出すためのパラメータを知らないということです... – Bakuriu
もちろん!その後は起こり得ません。ありがとう。 –