首頁>技術>

很多人說 Python 是給很優雅的語言,但凡事都有個弱點,有些時候對於某種情況,用 Python 實現起來卻不那麼"優雅"。

例如下面的例子,我們想要跳出這個巢狀迴圈:

關鍵詞 break 只能跳出這個迴圈中的內迴圈。那有沒有什麼方法一次性跳出所有迴圈? Python 裡有沒有哪個內建的關鍵詞可以實現呢?

不幸的的是,沒有。

有句老話講的好,"沒有對比就沒有傷害", Python 做不到,其它的語言卻可以,比如萬人鄙視的 PHP:

在 PHP 裡 break 關鍵詞後面跟著一個數組,表示要跳出迴圈的次數,預設值是1,表示跳出一次迴圈。

這是一個很簡潔命令的解決方案,這裡必須誇一句 PHP,這裡它表現的不錯。

不過 Python 畢竟是很靈活的語言,我們有很多方法可以解決上面的問題,下面我就介紹 5 中跳出巢狀迴圈的方法。

1. 使用"旗幟"變數

這是個有效的解決方案,我們定義一個變數,作為一個"旗幟",例如:

如上面的程式碼,break_out_flag 作為一個"旗手"告訴這個程式該跳出這個外迴圈了。

這個程式碼在執行上沒什麼問題,不過這顯得我們的程式碼有點亂,因為我們引用了新的變數去解決這個問題,這個新變數並非非要引入的。

2. 引發異常

如果 break 關鍵詞不能達到我們的期望,那麼是否可以引入其他的操作呢,比如 Python 的異常處理技術,我們可以使用它跳出巢狀迴圈:

就如上面程式碼所示,我們把異常"exception"當做關鍵詞 break 使用,這樣就可以一次跳出所有迴圈。

3. 使用相同的條件語句

由於一個條件語句可以中斷一次迴圈,那麼使用相同的條件語句同樣也可以再一次中斷一個迴圈,例如:

上面的程式碼可行,但並不是一個好的解決方案,至少在效率上很差,因為重複執行一個條件語句會浪費很多時間。

4. 使用 For-Else 語句

Python 裡有一個很特殊的語句:"for-else"。 它並不流行以至於很少有人知道它,因為習慣上 else 是搭配 if 來使用。

不過對於這個問題,它卻是很有幫助:

上面的程式碼中顯示了 for-else 語句的優勢,因為 else 下面的語句只有當內迴圈執行完成並沒有任何中斷的時候才執行。

如果對 for-else 還不熟悉,可以看一下下面的程式碼,是 for-else "翻譯"過來的寫法:

總之,這個方法很可以,就是 for-else 這種形式不好理解。

5. 將巢狀迴圈放在一個函數里

如果我們將巢狀迴圈放在一個函式中,那麼跳出巢狀迴圈是非常簡單的,因為我們可以使用 return 這個關鍵詞替代 break

如上所示,這個解決方案就顯得更加優雅了,既不需要"旗幟"變數,也不需要異常處理或是 for-else 語法以及多餘的條件判斷。

函式的用法在 Python 裡是很靈活的,我們可以很容易的建立一個巢狀函式或是一個閉包函式。如果這個跳出巢狀迴圈的函式在呼叫它的函數里只使用一次,那麼我們可以這樣寫:

不過,使用巢狀函式看起來並不怎麼"優雅"。

總結

這裡我們瞭解了5種跳出巢狀迴圈的方法,雖然每種方法都沒有 PHP 來的簡單直接,但我們也是可以實現這樣的操作地。作為程式設計人員我們應該瞭解語言的特性,在不同情況下用不同的方法解決問題。

66
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 專案開發框架原理總結