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请参阅有关 loops 子句的文档,这是有效的语法,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

for循环可以有一个else子句。

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

循环语句可能有一个 else 子句;它在循环因列表用尽而终止时(使用 for)或条件变为假(使用 while)时执行,但不是在循环由 break 语句终止时执行。

由于循环不包含break语句,因此将始终执行该else子句。

于 2012-09-18T17:05:49.340 回答
2

不确定您是否不了解 else 语句上的缩进(或缺少缩进),或者 for 循环中有“else”这一事实。如果是前一种情况...

格式是有效的,因为print >> out它是一个“简单的语句”。

这是for 语句的语法:

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

请注意,在可选的“else”块中的冒号之后,它需要一个“套件”,其语法是......

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

但是,我认为大多数人更愿意看到第二种语法。

于 2012-09-18T17:14:42.337 回答