0

だから私はかなりくだらないコードを継承しました。インデントは私が見つけた通りです。else がエラーをスローしないのはなぜですか? 私が理解している限り、コードは決して到達しません。

    for l in range(1,9):
        indexes = pickle.load(open('%s_%d.pkl'%(fc,l)))

        clusters_sum = sum([indexes[i]['count'] for i in indexes])
        print >> out, 'Lane %d: %d clusters PF.\n%8s  %9s  %5s' % (l,clusters_sum,'Index','Count','%')
        for i in sorted(indexes, key=lambda x: indexes[x]['name']):
            pct = indexes[i]['count'] and indexes[i]['count']/clusters_sum*100 or 0
            if pct < 0.06: continue
            print >> out, '%8s  %9d  %5.1f' % (indexes[i]['name'], indexes[i]['count'], pct)
        else: print >> out
4

3 に答える 3

6

elseループ内の句に関するドキュメントを参照してください。これは有効な構文であり、ループ内に、、またはキャッチされない例外elseがない限り、ブロック内のコードが実行されます。breakreturn

この特定のケースelseでは、上記の条件 (例外以外) が発生しないため、句は常に実行されます。したがって、次のようになります。

    for l in range(1,9):
        indexes = pickle.load(open('%s_%d.pkl'%(fc,l)))

        clusters_sum = sum([indexes[i]['count'] for i in indexes])
        print >> out, 'Lane %d: %d clusters PF.\n%8s  %9s  %5s' % (l,clusters_sum,'Index','Count','%')
        for i in sorted(indexes, key=lambda x: indexes[x]['name']):
            pct = indexes[i]['count'] and indexes[i]['count']/clusters_sum*100 or 0
            if pct < 0.06: continue
            print >> out, '%8s  %9d  %5.1f' % (indexes[i]['name'], indexes[i]['count'], pct)
        
        print >> out
于 2012-09-18T17:04:33.267 に答える
2

else ステートメントのインデント (またはインデントの欠如) を理解していないのか、for ループに「else」があるという事実を理解していないのかは不明です。前者だと…

print >> out「単純なステートメント」であるため、フォーマットは有効です。

for ステートメントの文法は次のとおりです。

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

オプションの「else」ブロックのコロンの後に、「suite」が必要であることに注意してください。その文法は...

suite         ::=  stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement     ::=  stmt_list NEWLINE | compound_stmt
stmt_list     ::=  simple_stmt (";" simple_stmt)* [";"]

したがって、Python では、ステートメントのブロックの代わりに単純なステートメントのリストを作成することができます。これも有効...

for i in sorted(indexes, key=lambda x: indexes[x]['name']):
    pct = indexes[i]['count'] and indexes[i]['count']/clusters_sum*100 or 0
    if pct < 0.06: continue
    print >> out, '%8s  %9d  %5.1f' % (indexes[i]['name'], indexes[i]['count'], pct)
else: print >> out; print >> out; print >> out

と同等になります...

for i in sorted(indexes, key=lambda x: indexes[x]['name']):
    pct = indexes[i]['count'] and indexes[i]['count']/clusters_sum*100 or 0
    if pct < 0.06: continue
    print >> out, '%8s  %9d  %5.1f' % (indexes[i]['name'], indexes[i]['count'], pct)
else:
    print >> out
    print >> out
    print >> out

ただし、ほとんどの人は 2 番目の構文を好むと思います。

于 2012-09-18T17:14:42.337 に答える
2

forループにはelse句を含めることができます。

http://docs.python.org/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loopsから:

ループ ステートメントには、else 句を含めることができます。ループがリストの枯渇によって終了したとき (for を使用)、または条件が false になったとき (while を使用) に実行されますが、break ステートメントによってループが終了したときは実行されません。

breakループにはステートメントが含まれていないため、else句は常に実行されます。

于 2012-09-18T17:05:49.340 に答える