python条件赋值

python 专栏收录该内容
6 篇文章 0 订阅

有条件赋值语句

  • 假设有列表buf = [[1], [2], [5], None, [], [7], ()],求buf内的数的和

  • 这样有三种解决办法

    sum_buf = 0
    for i in buf:
        if i is not None:
            sum_buf += i[0]
    
    sum_buf = 0:
        for i in buf:
            sum_buf += i[0] if i else 0
    
    sum_buf = sum([i[0] for i in buf if i])
    

    显然第三种用列表推导是最简洁的,但不适用于循环体内操作过于复杂的情况。

    这时候第二种带if语句的赋值就更有效,既增加了程序的可读性又没有独立于循环体外增加复杂度

带if语句的赋值

  • 最有代表性的应用场景是做对象操作而不确定变量名是否贴在目标对象上的时候,比如上例中的None[]()都是不能做索引操作的

  • None、空列表、空元组、空字符串、0的bool值都是False,类通过支持__bool__方法就可以使类支持bool运算;从而支持if、while、and等语句

    buf = []
    a = buf.pop() if buf else 0
    # 这里a=0
    # 做buf.pop()操作前先进行if判断
    

实际对比

  • 做完leetcode(2)题,在解题里看到的这种赋值方式,用基本相同的思路,如果用这种方式,可读性和效率会有质的飞跃

  • 不用:

    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution(object):
        def addTwoNumbers(self, l1, l2):
            """
            :type l1: ListNode
            :type l2: ListNode
            :rtype: ListNode
            """
            flag = False
            
            res = ListNode(0)
            _res = res
            while True:
                if l1 is None and l2 is None:
                    if flag is 0:
                        p.next = None
                    else:
                        _res.val += flag
                    return res
                elif l1 is None:
                    val, flag = self.__add(l2.val, flag)
                    _res.val += val
                    _res.next = ListNode(0)
                    p = _res
                    _res, l2 = _res.next, l2.next
                    
                elif l2 is None:
                    val, flag = self.__add(l1.val, flag)
                    _res.val += val
                    _res.next = ListNode(0)
                    p = _res
                    _res, l1 = _res.next, l1.next
                    
                else:
                    val, flag = self.__add(l1.val, l2.val, flag)
                    _res.val += val
                    _res.next = ListNode(0)
                    p = _res
                    _res, l1, l2 = _res.next, l1.next, l2.next
    
        def __add(self, *args):
            add = sum(args)
            carry = add//10
            return add-10*carry, carry
    
  • 用带if语句的赋值:

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
            dummy = p = ListNode(None)
            s = 0
            while l1 or l2 or s:
                s += (l1.val if l1 else 0) + (l2.val if l2 else 0)
                p.next = ListNode(s % 10)
                p = p.next
                s //= 10
                l1 = l1.next if l1 else None
                l2 = l2.next if l2 else None
            return dummy.next
    
    # 作者:meng-zhi-hen-n
    # 链接:https://leetcode-cn.com/problems/add-two-numbers/solution/zui-zhi-bai-de-xie-fa-by-meng-zhi-hen-n-2/
    # 来源:力扣(LeetCode)
    # 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值