python条件赋值

本文探讨了在Python编程中,如何使用有条件赋值语句来提高代码的可读性和效率。通过比较不同赋值方法,尤其是带if语句的赋值在处理列表和算法问题时的应用,阐述了其在避免额外复杂度和增强可读性方面的优势。在解决LeetCode问题时,使用这种赋值方式可以显著提升解题的可读性和效率。
部署运行你感兴趣的模型镜像

有条件赋值语句

  • 假设有列表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)
    # 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

Python 中有多种循环条件赋值的方法,下面详细介绍不同循环的情况及示例: ### for 循环条件赋值 for 循环用于针对集合中的每个元素执行一个代码块。可以在 for 循环里给变量赋值,示例代码如下: ```python # 给 a 赋值,a 的为 range 生成的序列中元素 for a in range(8, 12): # 判断 a 的符合 while 循环条件,执行 while 的命令,否则 while 循环结束,再执行 for 循环 while type(a) == int and a <= 10: if (a % 2) != 0: print("奇数:{}".format(a)) else: print("偶数:{}".format(a)) a += 1 else: print('end') ``` 此代码里,for 循环遍历 `range(8, 12)` 生成的序列,将元素依次赋值给 `a`,接着在 while 循环中依据条件对 `a` 进行操作[^2]。 ### while 循环条件赋值 while 循环能在满足条件时持续运行,使用时必须指定结束条件,不然会形成死循环。要在循环中给变量赋值,让变量在某个时刻不满足条件从而终止循环,示例代码如下: ```python i = 1 while i <= 5: print(i) i = i + 1 ``` 该代码中,`i` 初始为 1,在 while 循环里每次循环都对 `i` 加 1,当 `i` 大于 5 时,循环终止[^1]。 ### 赋值表达式(Python 3.8 及以后) 从 Python 3.8 开始,语言支持赋值表达式,使用 `:=` 作为赋值运算符。赋值表达式在列表推导中很有用,示例代码如下: ```python numbers = [1, 2, 3, 4, 5] result = [square for num in numbers if (square := num ** 2) > 10] print(result) ``` 这段代码里,在列表推导式中使用赋值表达式 `(square := num ** 2)`,将 `num` 的平方赋值给 `square`,并在条件判断中使用 `square`,最后将满足条件的 `square` 存入 `result` 列表[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值