如果elif一个班轮

时间:2017-09-06 10:43:06

标签: python-3.x

if i == len(a):
   tempList.extend(b[j:])
   break
elif j == len(b):
   tempList.extend(a[i:])
   break

我在Python的mergesort程序中使用它。有没有办法把它变成一个oneliner?

2 个答案:

答案 0 :(得分:7)

也许,但让我们给出一个专门的非答案:甚至不尝试。

您不会将代码编写为简短。你这样写:

  • 以直截了当的方式完成工作
  • 它清楚地将其含义传达给人类读者

上面的代码已经这样做了。

换句话说:当然精确是源代码的宝贵属性。所以,当你必须同样可读的代码片段做同样的事情,而一个版本是一个单行,而另一个版本更冗长 - 那么你选择短版本。

但是我非常怀疑上面的内容可以表达为,如上所述 - 代码更少。

答案 1 :(得分:1)

您可以使用cf.headand boolean operations制作一个非常易读的单行代码:

or

此示例使用下一个属性:

  

表达式l = [] a = [1,2,3,4] b = [8,9,10] i = 4 j = 2 l.extend(i == len(a) and b[j:] or j == len(b) and a[i:] or []) l == [10] i = 0 j = 3 l.extend(i == len(a) and b[j:] or j == len(b) and a[i:] or []) l == [10, 1, 2, 3, 4] 首先评估x and y;如果x为false,则返回其值;否则,将评估x并返回结果值。

     

表达式y首先评估x or y;如果x为真,则返回其值;否则,将评估x并返回结果值。

我们必须添加y以缓解or []时引发的TypeError: 'bool' object is not iterable异常(例如i == len(a) and j > len(b))。

我仍然喜欢扩展版本。