国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python 中的 else詳解

2020-01-04 17:31:00
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Python 中的 else詳解的相關資料,需要的朋友可以參考下
 

我們都知道 Python 中else的基本用法是在條件控制語句中的 if...elif...else...,但是 else 還有兩個其它的用途,一是用于循環的結尾,另一個是用在錯誤處理的 try 中。這原本是 Python 的標準語法,但由于和大部分其它編程語言的習慣不太一樣,致使人們有意或無意地忽略了這些用法。另外,對于這些用法是否符合 0×00 The Zen of Python 的原則以及該不該廣泛使用也存在很多爭議。例如在我看到的兩本書里(Effective Python VS Write Idiomatic Python),兩位作者就分別對其持有截然不同的態度。

循環中的 else

跟在循環后面的 else 語句只有在當循環內沒出現 break,也就是正常循環完成時才會執行。首先我們來看一個插入排序法的例子:

from random import randrangedef insertion_sort(seq):  if len(seq) 1:    return seq  _sorted = seq[:1]  for i in seq[1:]:    inserted = False    for j in range(len(_sorted)):      if i _sorted[j]:        _sorted = [*_sorted[:j], i, *_sorted[j:]]        inserted = True        break    if not inserted:      _sorted.append(i)  return _sorted print(insertion_sort([randrange(1, 100) for i in range(10)]))[8, 12, 12, 34, 38, 68, 72, 78, 84, 90]

在這個例子中,對已排序的 _sorted 元素逐個與 i 進行比較,若 i 比已排序的所有元素都大,則只能排在已排序列表的最后。這時我們就需要一個額外的狀態變量 inserted 來標記完成遍歷循環還是中途被 break,在這種情況下,我們可以用 else 來取代這一狀態變量:

def insertion_sort(seq):  if len(seq) 1:    return seq  _sorted = seq[:1]  for i in seq[1:]:    for j in range(len(_sorted)):      if i _sorted[j]:        _sorted = [*_sorted[:j], i, *_sorted[j:]]        break    else:      _sorted.append(i)  return _sortedprint(insertion_sort([randrange(1, 100) for i in range(10)]))[1, 10, 27, 32, 32, 43, 50, 55, 80, 94]

我認為這是一個非常酷的做法!不過要注意的是,除了 break 可以觸發后面的 else 語句,沒有循環的時候也會:

while False:  print("Will never print!")else:  print("Loop failed!")Loop failed!

錯誤捕捉中的 else

try...except...else...finally 流程控制語法用于捕捉可能出現的異常并進行相應的處理,其中 except 用于捕捉 try 語句中出現的錯誤;而 else 則用于處理沒有出現錯誤的情況;finally 負責 try 語句的”善后工作“ ,無論如何都會執行。可以通過一個簡單的例子來展示:

def divide(x, y):  try:    result = x / y  except ZeroDivisionError:    print("division by 0!")  else:    print("result = {}".format(result))  finally:    print("divide finished!")divide(5,2)print("*"*20)divide(5,0)

 

result = 2.5divide finished!********************division by 0!divide finished!

當然,也可以用狀態變量的做法來替代 else:

def divide(x, y):  result = None  try:    result = x / y  except ZeroDivisionError:    print("division by 0!")  if result is not None:    print("result = {}".format(result))  print("divide finished!") divide(5,2)print("*"*20)divide(5,0)

 

result = 2.5divide finished!********************division by 0!divide finished!

總結

有人覺得 else 的這些用法違反直覺或者是 implicit 而非 explicit,不值得提倡。但我覺得這種”判決“需要依賴具體的應用場景以及我們對 Python 的理解,并非一定要對新人友好的語法才算是 explicit 的。當然也不推薦在所有地方都使用這個語法,for/while...else 最大的缺點在于 else 是需要與 for/file 對齊的,如果是多層嵌套或者循環體太長的情況,就非常不適合用 else(回憶一下游標卡尺的梗就知道了:P)。只有在一些簡短的循環控制語句中,我們通過 else 擺脫一些累贅的狀態變量,這才是最 Pythonic 的應用場景!

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 拜城县| 泽州县| 绵竹市| 温泉县| 宁明县| 古浪县| 玛曲县| 丰城市| 天镇县| 永登县| 西平县| 丹东市| 贵溪市| 赤水市| 广宗县| 尉氏县| 九寨沟县| 新蔡县| 诸暨市| 神池县| 大洼县| 铜鼓县| 麻阳| 玛沁县| 承德市| 南昌县| 清水县| 金湖县| 塔城市| 山阴县| 德州市| 靖州| 宣威市| 涿州市| 烟台市| 独山县| 黄梅县| 龙游县| 景宁| 福安市| 正镶白旗|