python 使用else代替状态变量分分快三计划

作者:编程技术

else在try...except...else...finally的流程序调控制语法中相符适用,当程序没走进except时,就能够接纳else 中的代码,大家就不要求定义状态变量来记录程序是还是不是走入except,代码如下:

Python 中的 else详解,pythonelse详解

咱俩都知情 Python 中else的主导用法是在口径决定语句中的 if...elif...else...,可是 else 还应该有五个其余的用场,一是用于循环的结尾,另二个是用在错误管理的 try 中。这原本是 Python 的正统语法,但出于和大繁多其余编制程序语言的习贯不太相似,以致大家有意或无意识地忽略了这几个用法。其余,对于这么些用法是不是合乎 0×00 The Zen of Python 的基准甚至该不应当分布采纳也设有多数争论。举个例子在本身看见的两本书里(Effective Python VS Write Idiomatic Python卡塔 尔(英语:State of Qatar),两位小编就各自对其抱有迥然不一致的态度。

巡回中的 else

跟在循环后边的 else 语句唯有在当循环内没出现break,也正是常规循环完毕时才会实践。首先大家来看二个布置排序法的事例:

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 举行比较,若 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 _sorted
print(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.5
divide 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.5
divide finished!
********************
division by 0!
divide finished!

总结

有人以为 else 的那么些用法违反直觉也许是 implicit 而非 explicit,不值得一说倡。但自己感到这种”裁定“需求依附具体的采纳场景以至大家对 Python 的接头,并不是必然要对新人友好的语法才总算 explicit 的。当然也不引入在享有地点都施用那几个语法,for/while...else 最大的短处在于 else 是急需与 for/file 对齐的,假诺是多层嵌套只怕循环体太长的事态,就特不适合用 else(记忆一上游标卡尺的梗就明白了:P卡塔尔。唯有在有的归纳的巡回调节语句中,我们由此else 脱身一些累赘的状态变量,那才是最 Pythonic 的使用处景!

中的 else详细解释,pythonelse详细解释 大家都清楚 Python 中else的主题用法是在尺度决定语句中的 if...elif...else...,可是else 还恐怕有七个别的的用途,...

因为各类人的成为习贯区别,这种python唯有的语法并不被提倡,况兼风度翩翩旦代码嵌套了多层循环,那么使用else庖代状态变量也下滑了代码的可读性。不过要是python使用丰富熟谙,在部分洗练的循环调整语句中,大家经过else解脱一些累赘的状态变量,还是优点的。

def insertion_sort1(input_list):
    if len(input_list) <= 1:
        return input_list
    _sorted = input_list[:1]

    for i in input_list[1:]:
        for j in xrange(len(_sorted)):
            if i <= _sorted[j]:
                _sorted.insert(j, i)
                break
        else:
            _sorted.append(i)
    return _sorted

翻看公司的代码文书档案,在代码风格文档中,写着:为了拉长代码的可维护性,代码中减掉flag那类状态变量的使用。这几个主题素材,平日实在未有想过,直面这种要求时,第后生可畏影响正是使用flag标识状态。那么使用什么的技艺或代码构造工夫,本事替代状态变量的施用呢?笔者想开的章程是应用else。

谈到else,最常用的语法是if-elif-else,实际上else是足以与巡回和try搭配使用的,下边小编写了七个else替换状态变量的例子,使用插入法对数组排序。首先利用状态变量实现,代码如下:

下边给出使用else替换inserted的代码达成:

 

 

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError:
        print("error: division by 0!")
    else:
        print "result = %s" % result
    finally:
        print("divide finished!")
def insertion_sort(input_list):
    if len(input_list) <= 1:
        return input_list
    _sorted = input_list[:1]

    for i in input_list[1:]:
        inserted = False
        for j in xrange(len(_sorted)):
            if i <= _sorted[j]:
                _sorted.insert(j, i)
                inserted = True
                break
        if not inserted:
            _sorted.append(i)
    return _sorted

当for循环推行总体,中途未有break的话,就能实践else操作,也就起到了和inserted相近的效劳。

选取inserted来标识新成分是或不是施行了插入操作,假使未推行的话,将成分插入到倒数一位。

 

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划