この C コンストラクトに最適な Python イディオムは何ですか?
while ((x = next()) != END) {
....
}
next() を再コーディングする機能がありません。
更新:そしてからの答えは次のようです:
for x in iter(next, END):
....
@マークハリソンの答え:
for x in iter(next_, END):
....
Python のドキュメントからの抜粋を次に示します。
iter(o[, sentinel])
イテレータ オブジェクトを返します。 ...(中略)... 2 番目の引数 ,
sentinel
が指定されている場合はo
、呼び出し可能なオブジェクトでなければなりません。この場合に作成された反復子は、そのメソッドo
への呼び出しごとに引数なしで呼び出し ます。next()
返された値が と等しい場合は が発生しsentinel
、StopIteration
そうでない場合は値が返されます。
それはあなたが何をしたいかによって少し異なります。あなたの例に可能な限り一致させるために、次のジェネレーターを作成し、それを繰り返します。
def next():
for num in range(10):
yield num
for x in next():
print x
簡単な答え: Python の while ループでインライン変数代入を行う方法はありません。私が言うことができないことを意味します:
while x=next():
// do something here!
それは不可能なので、これを行うための「慣用的に正しい」方法がいくつかあります。
while 1:
x = next()
if x != END:
// Blah
else:
break
明らかに、これはちょっと醜いです。上記の「反復子」アプローチのいずれかを使用することもできますが、これも理想的ではない可能性があります。最後に、グーグルで見つけた「ピタポケット」アプローチを使用できます。
class Pita( object ):
__slots__ = ('pocket',)
marker = object()
def __init__(self, v=marker):
if v is not self.marker:
self.pocket = v
def __call__(self, v=marker):
if v is not self.marker:
self.pocket = v
return self.pocket
これで、次のことができます。
p = Pita()
while p( next() ) != END:
// do stuff with p.pocket!
この質問をありがとう。イディオムについて学ぶの__call__
は本当にクールでした!:)
編集:クレジットが必要な場合はクレジットを提供したいと思います。「ピタポケット」のイディオムはここで見つかりました
多分それはひどく慣用的ではないかもしれませんが、私は一緒に行く傾向があります
x = next()
while x != END:
do_something_with_x
x = next()
……でも、そういうのは読みやすいから
ここで何をしようとしていますか?リストを繰り返し処理している場合はfor e in L
、e が要素で L がリストである場所を使用できます。リストをフィルタリングする場合は、リスト内包表記を使用できます (つまり[ e for e in L if e % 2 == 0 ]
、リスト内のすべての偶数を取得する)。
これを複数回行う必要がある場合、pythonic の方法ではイテレータを使用します。
for x in iternext():
do_something_with_x
whereiternext
は次のようなものを使用して定義されます (明示的は暗黙的よりも優れています! ):
def iternext():
x = next()
while x != END:
yield x
x = next()
あなたが達成しようとしていることについて、より多くの情報を提供できますか? なぜあなたがただ言うことができないのか、私には明らかではありません
for x in everything():
...
一度に 1 つずつ返すように next 関数を記述する代わりに、everything 関数がすべてを返すようにします。ジェネレーターはこれを非常に効率的に行うことさえできます。