最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 中的 else詳解

 更新時(shí)間:2016年04月23日 16:26:57   投稿:hebedich  
這篇文章主要介紹了Python 中的 else詳解的相關(guān)資料,需要的朋友可以參考下

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

循環(huán)中的 else

跟在循環(huán)后面的 else 語(yǔ)句只有在當(dāng)循環(huán)內(nèi)沒(méi)出現(xiàn) break,也就是正常循環(huán)完成時(shí)才會(huì)執(zhí)行。首先我們來(lái)看一個(gè)插入排序法的例子:

from random import randrange
def 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]

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

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 _sorted
print(insertion_sort([randrange(1, 100) for i in range(10)]))

[1, 10, 27, 32, 32, 43, 50, 55, 80, 94]

我認(rèn)為這是一個(gè)非常酷的做法!不過(guò)要注意的是,除了 break 可以觸發(fā)后面的 else 語(yǔ)句,沒(méi)有循環(huán)的時(shí)候也會(huì):

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


Loop failed!

錯(cuò)誤捕捉中的 else

try...except...else...finally 流程控制語(yǔ)法用于捕捉可能出現(xiàn)的異常并進(jìn)行相應(yīng)的處理,其中 except 用于捕捉 try 語(yǔ)句中出現(xiàn)的錯(cuò)誤;而 else 則用于處理沒(méi)有出現(xiàn)錯(cuò)誤的情況;finally 負(fù)責(zé) try 語(yǔ)句的”善后工作“ ,無(wú)論如何都會(huì)執(zhí)行??梢酝ㄟ^(guò)一個(gè)簡(jiǎn)單的例子來(lái)展示:

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.5
divide finished!
********************
division by 0!
divide finished!

當(dāng)然,也可以用狀態(tài)變量的做法來(lái)替代 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.5
divide finished!
********************
division by 0!
divide finished!

總結(jié)

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

相關(guān)文章

最新評(píng)論

铜陵市| 保靖县| 安阳市| 徐汇区| 南阳市| 邵武市| 垫江县| 贡嘎县| 安西县| 南投市| 嘉禾县| 鄯善县| 鲁甸县| 凤山市| 军事| 伊川县| 正阳县| 儋州市| 新营市| 邯郸县| 林芝县| 白朗县| 马关县| 云安县| 琼海市| 南川市| 镇巴县| 太白县| 娱乐| 武穴市| 辉南县| 西宁市| 上杭县| 铜陵市| 黄龙县| 信阳市| 土默特左旗| 台中县| 万宁市| 河西区| 财经|