美文网首页
if/else 三元表达式

if/else 三元表达式

作者: 一只爱运动的猪 | 来源:发表于2018-03-17 18:46 被阅读0次

    if/else 三元表达式

    问题

    items = [1,10,7,4,5,9]
    def sum(items):
        head,*tail = items
        return head + sum(tail) if tail else head
    
    print(sum(items))
    

    在看python cookbook 1.2节的时候,有这样一个代码段。有点看不懂 if/else是如何执行的,因为自己并没有手动计算到运行的结果。

    参考LearningPython

    if X:
      A= Y
    else:
      A= Z
    

    通过if/else三元表达式简化后就成了:

    A = Y if X else Z
    

    该书的解释:
    As in the statement equivalent, Python runs expression Y only if X turns out to be true, and runs expression Z only if X turns out to be false.
    意思就是如果X是真,就执行表达式Y;如果X是假,则执行表达式Z。
    举个例子:

    >>> A = 't' if 'spam' else 'f'       #对于字符串来说,非空为真
    >>> A
    't'
    >>> A = 't' if '' else 'f'
    >>> A
    'f'
    

    简化理解

    其实对于更好地理解if/else三元表达式来说,以上代码中的A是多余的。A的出现有时候会对理解造成困惑,毕竟咱们说的if/else三元表达式嘛!去除掉A的代码:

    if X:
      Y
    else:
      Z
    

    通过if/else三元表达式简化后就成了:

    Y if X else Z
    

    接着举个例子,看看打印:

    >>> print('t' if 'spam' else 'f')
    't'
    
    >>> print('t' if '' else 'f')
    'f'
    

    如果X为真,那么结果为Y;如果X为假,那么结果为Z。

    再看问题

    head,*tail = items
    

    是把可迭代的变量的第一个赋值个head,其余的都给tail。

    head + sum(tail) if tail else head
    

    再来看下这个if/else表达式。如果tail为真,那么sum(tail)执行,即结果为head + sum(tail);否则 head + head。
    错了,我刚看这行代码也是这样理解的。但是结果告诉我错了。

    其实应该是这样执行的:如果tail为真,那么(head + sum(tail))执行,即结果为(head + sum(tail));否则为 head。head + sum(tail) 是一个表达式,也就是上面

    Y if X else Z
    

    中的Y。
    这是个递归函数,通过不断调用自身提取出head,知道tail为空的时候不执行head + sum(tail),而执行head结束递归。

    测试一下

    A = 1
    B = 2
    C = 3
    D = 4
    print(C + D if A else B)
    

    结果为7。

    A = 1
    B = 2
    C = 3
    D = 4
    print(C + D if A else B)
    

    结果为2,而不是5。
    这也证实了我们的假设。

    最后还是得吐槽下LearningPython这本书,优点和缺点是同一个点:过于详尽,或者说是冗长吧。:)

    相关文章

      网友评论

          本文标题:if/else 三元表达式

          本文链接:https://www.haomeiwen.com/subject/scgjqftx.html