跳至主要內容

生信中的Python——如何处理一大堆判断?

Haopeng Yu大约 5 分钟

好久没更新博客了! 前段时间我突然来了兴致,把博客的后端彻底翻新了一遍。现在用的是一个比较新的博客框架,界面看着还挺养眼的。昨天看到一个很有意思的话题,怎么简化一大堆判断?所以准备写这个博客简单讨论一下。

写在前面

昨天我和薏米看了动画片《Coco》,中文是《寻梦环游记》,看完后感触颇深。片中的一个观点让我印象深刻:一个人的死亡并不意味着真正的消失,因为ta的灵魂会到达另一个世界。作为一个搞科研的,我当然明白这种说法缺乏依据。但更让我感到惋惜的是,一个人离世后,在人间可能就没几个人会记得ta了。我忽然想到,对于上一辈,特别是更早以前的老人们来说,受限于时代,他们在世时留下的痕迹可能寥寥无几,最多是些家中为数不多的遗物。像我对爷爷的印象已经相当模糊,对太爷就基本只能从父亲的只言片语中拼凑些许。那个年代,很多人连张像样的照片都没机会留下。

我们这个时代就幸运的多,有了互联网很多人可以写点东西。如果那个公司不倒闭,那么数据就永远存下来了。更不用说github的北极代码库平台。未来会不会有人看不知道,AI应该能读好几遍 😏 反正我的代码也在里面。

总之, 我下定决心要重新开始写博客。除了想着给后人留下点啥,主要是想借此机会更新一下自己的生活状态。

代码中的if

在Python中,if语句是最基本的条件控制结构。它允许我们根据某个条件来决定是否执行某段代码。如果条件为真,那么if下面的代码块就会被执行;如果条件为假,那么if下面的代码块就会被跳过。除了if,还有elif(相当于其他语言中的else if)和else,它们可以用来处理多个条件。当有多个条件需要检查时,我们可以使用一连串的if-elif-else语句。Python中的条件表达式不需要用括号括起来,而且也不需要用大括号来表示代码块,而是使用缩进来表示代码块的开始和结束。这是Python的一个独特的语法特点。

除了if语句,Python还支持三元表达式,也叫条件表达式。三元表达式可以让我们在一行代码中根据某个条件来决定一个值。它的语法是value_if_true if condition else value_if_false。也就是说,如果condition为真,就返回value_if_true,否则返回value_if_false。三元表达式可以使代码更加简洁,特别是在需要根据条件来设置变量值的时候。

大佬不用else?

我忘了在哪里看到了文章说一些大的公司非常不希望程序员在写code的时候用else,不知道这是因为什么考虑的但是反正自从看到那篇文章之后,我写代码就不用else了。但是不用else总得表示判断吧,那很简单,就用continue呗。

比如,我们要在一个列表中找到第一个偶数,如果用if-else,代码可能会是这样的:

numbers = [1, 3, 5, 6, 7, 9, 10]

for num in numbers:
    if num % 2 == 0:
        print(f"第一个偶数是:{num}")
        break
    else:
        continue

但是如果不用else,我们可以这样写:

numbers = [1, 3, 5, 6, 7, 9, 10]

for num in numbers:
    if num % 2 != 0:
        continue
    print(f"第一个偶数是:{num}")
    break

在这个例子中,我们先判断数字是否不是偶数,如果不是偶数,就用continue跳过当前循环,继续下一次循环。如果是偶数,就打印出来,然后用break跳出整个循环。

这样写的好处是,代码的"正向逻辑"更清晰,我们关注的是"找到偶数"这个条件,而不是"不是偶数"这个条件。虽然这个例子很简单,但在更复杂的情况下,避免使用else可以让代码的逻辑更清晰,更容易理解和维护。

如何解决很多if一起用?

你写代码的时候,是不是经常会用到很多很多的if语句啊?比如说,你要判断用户的年龄,然后给他分个组什么的:

def set_age_group(age):
    if age <= 6:
        age_group = '学龄前儿童'
    elif age <= 12:
        age_group = '儿童'
    elif age <= 18:
        age_group = '青少年'
    elif age <= 60:
        age_group = '成年人'
    else:
        age_group = '老年人'
    
    print(f'此人属于{age_group}。')

看起来挺简单的,对吧?但是你有没有发现,这里面有好多重复的代码啊,比如都是在判断age,然后给ageGroup赋值。

Switch大法好!

开玩笑的,不是这个switch
开玩笑的,不是这个switch

这时候呢,有些语言,比如javascript,你可以用switch来改写一下,类似:

const setAgeGroup = (age) => {
    let ageGroup = '';
    switch(true) {
        case age <= 6:
            ageGroup = '学龄前儿童';
            break;
        case age <= 12: 
            ageGroup = '儿童';
            break;
        case age <= 18:
            ageGroup = '青少年'; 
            break;
        case age <= 60:
            ageGroup = '成年人';
            break;
        default:
            ageGroup = '老年人';
    };
    console.log(`此人属于${ageGroup}`);
};

是不是好一点了?

然而,一些语言,比如python里面是没有switch的,怎么办呢?

查表才是王道!

其实啊,我们可以把这些判断条件和结果都放到一个dict里面,像这样:

def set_age_group(age):
    age_groups = {
        6: '学龄前儿童',
        12: '儿童',
        18: '青少年',
        60: '成年人',
        float('inf'): '老年人'
    }
    
    for max_age, group in age_groups.items():
        if age <= max_age:
            age_group = group
            break
        else:
            age_group='老年人'
    
    print(f'此人属于{age_group}。')

这样一来,代码是不是简洁了很多?

总结一下

所以啊,下次你写代码的时候,如果发现自己用了很多if语句,不妨停下来想一想,是不是可以用其他的方式来改写一下呢?比如用switch,或者是查找表之类的。这样会让你的代码更简洁,更易读,也更容易维护!

好啦,今天就讲到这里。希望对你有帮助!