所以我继承了一段相当糟糕的代码。缩进就像我发现的那样。为什么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
答案 0 :(得分:6)
请参阅else
clauses on loops上的文档,这是有效的语法,只要没有else
,break
或未被删除,就会执行return
块中的代码循环中的异常。
在这种特殊情况下,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
答案 1 :(得分:2)
for
个循环可以有一个else
子句。
循环语句可能有一个else子句;当循环通过列表耗尽(with for)或条件变为false(with while)时终止,但是当循环被break语句终止时,执行它。
由于循环不包含break
语句,else
子句将始终执行。
答案 2 :(得分:2)
不确定你是否理解else语句中的缩进(或缺少缩进),或者for循环中存在“else”的事实。如果是前一种情况......
格式化有效,因为print >> out
是一个“简单陈述”。
以下是for statement的语法:
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
但是,我认为大多数人更愿意看到第二种语法。