亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python 中的 else詳解

系統(tǒng) 2094 0

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

循環(huán)中的 else

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

            
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]


          

在這個例子中,對已排序的 _sorted 元素逐個與 i 進(jìn)行比較,若 i 比已排序的所有元素都大,則只能排在已排序列表的最后。這時我們就需要一個額外的狀態(tài)變量 inserted 來標(biāo)記完成遍歷循環(huán)還是中途被 break,在這種情況下,我們可以用 else 來取代這一狀態(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)為這是一個非常酷的做法!不過要注意的是,除了 break 可以觸發(fā)后面的 else 語句,沒有循環(huán)的時候也會:

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


Loop failed!


          

錯誤捕捉中的 else

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

            
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)變量的做法來替代 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é)

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 四虎精品在线观看 | 国产一级淫片a | 日韩欧美中文字幕在线播放 | 国产呦精品系列在线 | 日韩综合图区 | 国产一区二区中文字幕 | 日批视频网址免费观看 | 欧美性色福利视频在线观看 | 国产一区二区播放 | 99热精品国产三级在线观看 | 福利视频在线免费观看 | 国产欧美日韩在线播放 | 福利入口在线观看 | 亚州国产 | 草草影院国产第一页 | 久久久久久a亚洲欧洲aⅴ | 国产精品国产自线拍手机观看 | 国产亚洲精品久久久久久小说 | www.91色.com| 欧美激情日本一道免费视频 | 亚洲羞羞视频 | 国产精品一区二区资源 | 色偷偷成人网免费视频男人的天堂 | 狠狠叉 | 色综合久久亚洲国产日韩 | 天天干人人 | 一级片亚洲 | 欧美精品国产日韩综合在线 | 天天干天天操天天射 | 国产精品高清一区二区不卡 | 成人黄色网址 | 日本成人二区 | 青青青爽在线视频观看 | a级毛片在线观看 | 国产在线视频不卡 | 国产综合欧美日韩视频一区 | 四虎影视永久地址www成人污 | 一级免费毛片 | 欧美激情视频二区 | 香蕉国产人午夜视频在线 | 久久精品中文字幕第一页 |