Python 你可能不知道的 Boolean 表达式b( ̄▽ ̄)d

Python 你可能不知道的 Boolean 表达式b( ̄▽ ̄)d


一、Boolean 表达式😺

Python 的语法相当的简明,有时只用一条表达式就能实现许多逻辑
Boolean 表达式 (布尔表达式) 用 Python 的语法写起来很简单,因为 Python 在对表达式求值的适合,会把空白字符串、空列表、空字典、以及 0,全部当成 False 来看待,所以根据这个原理能哦轻而易举实现 Boolean 表达式

根据一个问题来引入Boolean 表达式👇🏻

现有关于 张三、李四 信息的数据,但其中有每个人的信息各有缺失,如果在获缺失值的话得将缺失内容变成 0,那么要怎么做呢?

peoples = {
    "张三": {"身高": 180, "性别": "男", "爱好": "法外狂徒"},
    "李四": {"身高": 178, "体重": "58kg", "性别": "男"}
}

1)、if 语句

可以看到,张三缺少体重信息,李四缺少爱好信息,对于这种缺少元素最容易想到的是使用 if 语句

if "体重" not in peoples["张三"]:
    zhangsan_weight = 0
else:
    zhangsan_weight = peoples["张三"]["体重"]

if "爱好" not in peoples["李四"]:
    lisi_likes = 0
else:
    lisi_likes = peoples["爱好"]["爱好"]

可以发现的是,明明只是一个小小的逻辑却写的异常复杂,这很不符合Python 简洁的特点,使用 Boolean 表达式再来看看

2)、Boolean 表达式

原本多行的代码,瞬间就变成了两行代码,字典的 get 方法在获取不存在的key 值时会返回被 Python 判定为 FalseNone 值。所以,只需要把 get 方法查找到的结果放到 or 操作符左边,并且在右边写上个 0 就行了

zhangsan_weight = peoples["张三"].get("体重") or 0
lisi_likes = peoples["李四"].get("爱好") or 0

3)、字典 get 方法还能这样

上述关于 2)、Boolean 表达式 是为了便于讲解演示才这么去写,因为使用到了 字典的 get 方法,我们只需要在这个方法中再传入一个参数作为 key 值不存在时返回值即可

zhangsan_weight = peoples["张三"].get("体重", 0)
lisi_likes = peoples["李四"].get("爱好", 0)

二、Boolean 表达式适用范围

Boolean 表达式 (布尔表达式) 看起来是很简洁,但这个表达式可不能乱用,只适合简单的逻辑判断使用,再换一个相对复杂一点点的问题来看看

需求:判断用户输入是否为空,否则变为 0 值

1)、先来判断用户是否输入为空

输入为空的情况包含 全是空格以及直接回车

原理:
先对input 返回的数据使用 strip 内置函数去除内容两边的空白符,如果处理后的返回结果为空字符串,那即为空内容,同时在 Python 中会被当做 False 类型看待,只需一个简单的逻辑判断即可

enter = input("请输入:").strip()
num = enter or 0

2)、转换为整数

上面只是判断了是否为空,但这还没完全实现我们想要的效果,还得将其转化为能够直接参与数学运算的整数,先来看看 Boolean 表达式

enter = input("请输入:").strip()
num = int(enter or 0)

相信看到这就以及发现了问题,Boolean 表达式 看起来很别扭,比原来的更难读

如果是第一次阅读此代码,这意味着得把整个表达式逐层拆分,才能明白这行代码的意思。代码当然应该写短点,但这不意味着非得挤成一行

Python 还能用 if/else 结果实现 三元的条件表达式,这样写会比刚才那种写法更清晰,且能保持代码简短

enter = input("请输入:").strip()
# num = int(enter or 0)
num = int(enter) if enter else 0

这里思考一个问题,如果还需要判断用户输入的是否为整数,或则判断是否为指定范围内的整数,使用 Boolean 表达式 能实现吗?


三、使用辅助函数取代复杂的表达式😝

还是以 二、Boolean 表达式适用范围 中的需求为例,我们将所有的要求都写到一个 辅助函数,以后就只用调用这个函数即可,这种写法要比使用 or 的复杂表达式与使用 if/else 的条件表达式清晰很多

三种方法进行对比👺

  • Boolean 表达式

    enter = input("请输入:").strip()
    num = int(enter or 0)	
    
  • 三元表达式

    enter = input("请输入:").strip()
    num = int(enter) if enter else 0	
    
  • 编写辅助函数
    虽然使用辅助函数,需要多编几行代码,但可以让程序更加清晰,所以总体来说还是值得的

    def standard(string: str):
        if string:
            return int(string)
        else:
            return 0
    
    
    enter = input("请输入:").strip()
    num = standard(enter)
    

语法简洁的 Python 虽然可以写出很多浓缩的语句,但应该避免让这样的写法把表达式弄的太复杂,应以清晰为主,同时要遵守 DRY 原则(Don‘t Repeat Yourself),也就是不要重复自己写过的代码

要点:👇🏻

  1. Python 的语法很容易把复杂的意思挤到同一行里,这样写很难懂
  2. 复杂的表达式,尤其是那种需要重复使用的复杂表达式,应该写到辅助函数里面
  3. if/else 三元表达式,要比用 orand 写成的 Boolean 表达式 更好懂

参考资料💌

  • 书籍:
    • Effective 系列丛书 《Effective Python》
      这算是我最喜欢的 Python 书之一,非常推荐给大家

由衷感谢💖


相关博客😏

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值