7

/句のelseブロックは、反復が終了しても によって中断されない場合に実行されるので、を読みました。forelsebreak

forループが反復を開始しなかった場合にのみ実行される何かを記述できる言語構造はありますか? tupleまたはを使用していた場合list、次のようにします。

if seq:
    for x in seq:
         # something
else:
    # something else

しかし、ジェネレーターを使用すると、必要な動作が得られません。

>>> g = (x for x in range(2))
>>> for x in g:
...     print x
... else:
...     print "done"
... 
0
1
done    # I don't want "done" here
>>> g = (x for x in range(2) if x > 1)
>>> if g:
...     for x in g:
...         print x
... else:
...     print "done"
... 
>>>     # I was expecting "done" here

ループを使用しながら、ジェネレーターからatupleまたは aを作成し尽くすことなくこれを行うにはどうすればよいですか? ループで使用してをキャッチしようとすることもできますが、 でそれを行う良い方法があるかどうかを確認したいと思います。listfornext()whileStopIterationfor

4

7 に答える 7

6
n = -1
for n, i in enumerate(it):
    do_stuff()
if n < 0:
    print 'Done'
于 2013-08-07T19:40:04.970 に答える
5

forループ内でブール値を更新するよりも良い方法は考えられません。

any_results = False
for x in g:
    any_results = True
    print x
if not any_results:
    print 'Done'
于 2013-08-07T19:35:17.843 に答える
2

ジェネレーター関数を使用できます。

nextオプションの 2 番目の引数を受け入れます。これは、反復子が使い果たされた場合にデフォルト値を指定するために使用できます。

def func(lis):
    g = (x for x in lis if x > 1)
    flag = object()      # expected to be unique
    nex = next(g, flag)  # will return flag if genexp is empty
    if nex is not flag:
        yield nex
        for item in g:
            yield item
    else:
        yield "done"

for x in func(range(2)):
    print x
print "------"
for x in func(range(4)):
    print x

出力:

done
------
2
3
于 2013-08-07T19:38:29.353 に答える
0

ループが実際に実行されたかどうかを知る良い方法は、ループ変数を使用することだと思います

lv= 1
for x in g:
    lv = lv+1
    print x
if (lv == 1):
    print 'Done'

私の構文は間違っているかもしれません.私はpythonの男ではないので..

于 2013-08-07T19:38:21.127 に答える
0

反復回数をカウントするラッパーを作成できます。よりエキゾチックな列挙で機能するという利点があります。Python3 では、次のようになります。

import sys
from glob import iglob

class GenCount(object):

    def __init__(self, gen):
        self._iter = iter(gen)
        self.count = 0

    def __next__(self):
        val = self._iter.__next__()
        self.count += 1
        return val

    def __iter__(self):
       return self

c = GenCount(iglob(sys.argv[1]))
for fn in c:
    print(fn)
print(c.count)


c = GenCount(iglob(sys.argv[1]))
print([fn for fn in c])
print(c.count)
于 2013-08-07T20:10:37.620 に答える
-1

この例では、追加の構造が必要ですか?

caught = None
for item in x:
    caught = item
    print caught
if caught != None: print "done"

*OPコメント編集*t

于 2013-08-07T19:40:29.740 に答える