12

この C コンストラクトに最適な Python イディオムは何ですか?

while ((x = next()) != END) {
    ....
}

next() を再コーディングする機能がありません。

更新:そしてからの答えは次のようです:

for x in iter(next, END):
    ....
4

7 に答える 7

14

@マークハリソンの答え:

for x in iter(next_, END):
    ....

Python のドキュメントからの抜粋を次に示します。

iter(o[, sentinel])

イテレータ オブジェクトを返します。 ...(中略)... 2 番目の引数 ,sentinelが指定されている場合はo、呼び出し可能なオブジェクトでなければなりません。この場合に作成された反復子は、そのメソッドo への呼び出しごとに引数なしで呼び出し ます。next()返された値が と等しい場合は が発生しsentinelStopIterationそうでない場合は値が返されます。

于 2009-01-08T23:06:34.307 に答える
5

それはあなたが何をしたいかによって少し異なります。あなたの例に可能な限り一致させるために、次のジェネレーターを作成し、それを繰り返します。

def next():
   for num in range(10):
      yield num

for x in next():
   print x
于 2008-08-26T16:44:42.200 に答える
4

簡単な答え: 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__は本当にクールでした!:)

編集:クレジットが必要な場合はクレジットを提供したいと思います。「ピタポケット」のイディオムはここで見つかりました

于 2008-08-26T17:50:30.357 に答える
2

多分それはひどく慣用的ではないかもしれませんが、私は一緒に行く傾向があります

x = next()
while x != END:
    do_something_with_x
    x = next()

……でも、そういうのは読みやすいから

于 2008-08-26T16:42:27.760 に答える
1

ここで何をしようとしていますか?リストを繰り返し処理している場合はfor e in L、e が要素で L がリストである場所を使用できます。リストをフィルタリングする場合は、リスト内包表記を使用できます (つまり[ e for e in L if e % 2 == 0 ]、リスト内のすべての偶数を取得する)。

于 2008-08-26T16:42:49.473 に答える
1

これを複数回行う必要がある場合、pythonic の方法ではイテレータを使用します。

for x in iternext():
    do_something_with_x

whereiternextは次のようなものを使用して定義されます (明示的は暗黙的よりも優れています! ):

def iternext():
    x = next()
    while x != END:
        yield x
        x = next()        
于 2008-08-26T16:49:52.623 に答える
1

あなたが達成しようとしていることについて、より多くの情報を提供できますか? なぜあなたがただ言うことができないのか、私には明らかではありません

for x in everything():
    ...

一度に 1 つずつ返すように next 関数を記述する代わりに、everything 関数がすべてを返すようにします。ジェネレーターはこれを非常に効率的に行うことさえできます。

于 2008-08-26T18:18:42.443 に答える