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

首頁 > 編程 > Python > 正文

Python 中的 else詳解

2019-11-25 16:49:40
字體:
來源:轉載
供稿:網友

我們都知道 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 的應用場景!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中山市| 洛南县| 涞水县| 汶上县| 绥阳县| 昭苏县| 海伦市| 郁南县| 上虞市| 丰台区| 饶平县| 鹿邑县| 富顺县| 沅陵县| 屯昌县| 涟源市| 镇赉县| 三穗县| 吉水县| 香港| 行唐县| 望谟县| 崇仁县| 林周县| 垣曲县| 靖安县| 焦作市| 江安县| 绥德县| 嘉峪关市| 铁力市| 丹阳市| 郴州市| 新建县| 廊坊市| 保山市| 乌拉特中旗| 兴安盟| 海宁市| 忻城县| 大埔县|