簡體   English   中英

有人可以解釋這個python代碼如何不會給出錯誤

[英]can someone explain how this python code doesn't give an error

因此,我繼承了一段相當糟糕的代碼。 縮進是我發現的。 為什么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

請參閱有關循環的else子句的文檔,這是有效的語法,只要循環中沒有breakreturn或未捕獲的異常,就會執行else塊中的代碼。

在這種特殊情況下,將始終執行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

for循環可以具有else子句。

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

循環語句可以包含else子句; 當循環通過用盡列表而終止時(帶有for)或條件變為假(具有while時),則執行此命令,但當循環由break語句終止時,則不執行該命令。

由於循環不包含break語句,因此else子句將始終執行。

不知道您是否不了解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

但是,我認為大多數人都希望看到第二種語法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM