MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python if语句在函数中的条件分支

2023-04-096.7k 阅读

Python if 语句基础回顾

在深入探讨 if 语句在函数中的条件分支之前,我们先来回顾一下Python中 if 语句的基本语法。if 语句用于根据条件执行不同的代码块。其基本形式如下:

if condition:
    # 当条件为真时执行的代码
    code_block

这里的 condition 是一个表达式,其结果要么为 True,要么为 False。如果 conditionTrue,则缩进的 code_block 中的代码会被执行;如果为 False,则 code_block 会被跳过。

例如,下面的代码检查一个数字是否为正数:

num = 5
if num > 0:
    print(f"{num} 是正数")

在这个例子中,num > 0 是条件,由于 num 的值为 5,条件为 True,所以会打印出 "5 是正数"

if 语句还可以与 else 关键字结合使用,当 if 条件为 False 时,执行 else 后面的代码块:

num = -5
if num > 0:
    print(f"{num} 是正数")
else:
    print(f"{num} 不是正数")

这里,num 的值为 -5num > 0 条件为 False,所以会执行 else 块中的代码,打印出 " -5 不是正数"

另外,if 语句可以使用 elif(else if 的缩写)来检查多个条件:

num = 0
if num > 0:
    print(f"{num} 是正数")
elif num < 0:
    print(f"{num} 是负数")
else:
    print(f"{num} 是零")

在这个例子中,num 的值为 0num > 0False,所以跳过第一个代码块。接着检查 num < 0,也为 False,最后执行 else 块,打印出 "0 是零"

Python 函数中的 if 语句

函数内简单条件分支

函数是组织和重用代码的重要工具。在函数内部,if 语句可以根据传入的参数或函数内部计算的结果进行条件分支。

例如,我们定义一个函数来判断一个数是否为偶数:

def is_even(num):
    if num % 2 == 0:
        return True
    else:
        return False

在这个函数中,num % 2 == 0 是条件判断。如果 num 除以 2 的余数为 0,则条件为 True,函数返回 True,表示这个数是偶数;否则,条件为 False,函数返回 False

我们可以这样调用这个函数:

result = is_even(4)
print(result)

上述代码会输出 True,因为 4 是偶数。

多条件分支的函数

当函数需要根据多种不同的条件执行不同的操作时,可以使用多个 if - elif - else 分支。

比如,我们定义一个函数来判断一个成绩对应的等级:

def get_grade(score):
    if score >= 90:
        return 'A'
    elif score >= 80:
        return 'B'
    elif score >= 70:
        return 'C'
    elif score >= 60:
        return 'D'
    else:
        return 'F'

在这个函数中,首先检查 score 是否大于等于 90,如果是则返回 'A';否则继续检查是否大于等于 80,以此类推。如果所有前面的条件都不满足,即 score 小于 60,则返回 'F'

我们可以这样调用这个函数:

grade = get_grade(85)
print(grade)

这段代码会输出 'B',因为 85 分对应的等级是 B

条件分支中的复杂条件

在函数的 if 语句中,条件可以是复杂的逻辑表达式,包含多个逻辑运算符(如 andornot)。

例如,我们定义一个函数来判断一个年份是否为闰年。闰年的判断条件是:能被 4 整除但不能被 100 整除,或者能被 400 整除。

def is_leap_year(year):
    if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
        return True
    else:
        return False

在这个函数中,(year % 4 == 0 and year % 100 != 0) or (year % 400 == 0) 是一个复杂的条件。year % 4 == 0 and year % 100 != 0 表示能被 4 整除且不能被 100 整除,year % 400 == 0 表示能被 400 整除,这两个条件通过 or 连接,只要满足其中一个条件,年份就是闰年。

我们可以这样调用这个函数:

result = is_leap_year(2020)
print(result)

上述代码会输出 True,因为 2020 年是闰年。

嵌套的 if 语句在函数中

简单嵌套示例

在函数中,if 语句可以嵌套使用,即在一个 if 代码块中再包含另一个 if 语句。

例如,我们定义一个函数来判断一个点是否在特定的矩形区域内。假设矩形区域的左上角坐标为 (0, 0),右下角坐标为 (10, 10),并且我们还想进一步判断点是否在矩形的某个子区域(如 x 坐标在 37 之间,y 坐标在 37 之间)内。

def is_point_in_rectangle(x, y):
    if 0 <= x <= 10 and 0 <= y <= 10:
        if 3 <= x <= 7 and 3 <= y <= 7:
            return "在子区域内"
        else:
            return "在矩形内,但不在子区域内"
    else:
        return "不在矩形内"

在这个函数中,首先有一个外层的 if 语句,判断点是否在大矩形内。如果在大矩形内,再通过内层的 if 语句判断是否在子区域内。

我们可以这样调用这个函数:

result1 = is_point_in_rectangle(5, 5)
print(result1)
result2 = is_point_in_rectangle(15, 5)
print(result2)

第一个调用会输出 "在子区域内",因为点 (5, 5) 既在大矩形内,也在子区域内;第二个调用会输出 "不在矩形内",因为点 (15, 5)x 坐标超出了大矩形范围。

嵌套的多层 if 语句

函数中可以有多层嵌套的 if 语句,尽管这种情况在实际应用中应尽量避免,因为过多的嵌套会使代码可读性变差。

例如,我们定义一个函数来根据用户输入的年龄、性别和职业判断是否符合某种复杂的会员资格条件。假设年龄在 1860 岁之间,男性且职业为工程师,或者女性且职业为教师的用户符合会员资格。如果符合会员资格,再根据年龄进一步判断是普通会员还是高级会员(1830 岁为普通会员,3160 岁为高级会员)。

def check_membership(age, gender, profession):
    if 18 <= age <= 60:
        if gender =='male':
            if profession == 'engineer':
                if 18 <= age <= 30:
                    return "普通会员(男性工程师)"
                else:
                    return "高级会员(男性工程师)"
        elif gender == 'female':
            if profession == 'teacher':
                if 18 <= age <= 30:
                    return "普通会员(女性教师)"
                else:
                    return "高级会员(女性教师)"
    return "不符合会员资格"

在这个函数中,有多层嵌套的 if 语句。外层 if 语句先检查年龄是否在范围内,然后根据性别进行分支,再根据职业进一步分支,最后根据年龄判断会员级别。

我们可以这样调用这个函数:

result1 = check_membership(25,'male', 'engineer')
print(result1)
result2 = check_membership(35, 'female', 'doctor')
print(result2)

第一个调用会输出 "普通会员(男性工程师)",因为年龄、性别和职业都符合条件且年龄在普通会员范围内;第二个调用会输出 "不符合会员资格",因为职业不符合条件。

if 语句在函数中的返回值优化

单一返回点的理念

在编写函数时,遵循单一返回点的理念可以使代码更易读和维护。单一返回点意味着函数只有一个 return 语句,或者所有的 return 语句都在函数的末尾。

例如,我们重新审视前面判断数字是否为偶数的函数:

def is_even_better(num):
    result = False
    if num % 2 == 0:
        result = True
    return result

在这个版本中,函数先初始化 resultFalse,然后根据条件修改 result 的值,最后在函数末尾返回 result。这样就实现了单一返回点。

虽然这种方式对于简单的函数可能显得有些繁琐,但在更复杂的函数中,它可以使代码逻辑更清晰,尤其是当函数中有多个条件分支和复杂的计算时。

简化返回值的条件表达式

Python 支持在 return 语句中使用条件表达式(也称为三元运算符)来简化代码。

例如,我们可以进一步优化判断数字是否为偶数的函数:

def is_even_optimized(num):
    return True if num % 2 == 0 else False

这里,True if num % 2 == 0 else False 是一个条件表达式。如果 num % 2 == 0True,则整个表达式的值为 True,否则为 False。这种写法更加简洁明了。

再比如,我们前面判断成绩等级的函数也可以用条件表达式优化:

def get_grade_optimized(score):
    return 'A' if score >= 90 else 'B' if score >= 80 else 'C' if score >= 70 else 'D' if score >= 60 else 'F'

这个优化后的函数使用了多个条件表达式,使得代码更加紧凑。不过,对于过于复杂的条件,这种写法可能会降低代码的可读性,所以需要根据实际情况权衡。

if 语句与函数的错误处理

输入验证

在函数中,if 语句常用于对输入参数进行验证,以确保函数在合理的输入下运行。如果输入不符合要求,函数可以返回错误信息或引发异常。

例如,我们定义一个函数来计算两个数的除法:

def divide(a, b):
    if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
        raise ValueError("输入参数必须是数字")
    if b == 0:
        raise ZeroDivisionError("除数不能为零")
    return a / b

在这个函数中,首先使用 isinstance 函数检查 ab 是否为数字类型。如果不是,引发 ValueError 异常。然后检查 b 是否为零,如果是,引发 ZeroDivisionError 异常。只有在输入参数都合法的情况下,才执行除法运算并返回结果。

我们可以这样调用这个函数:

try:
    result = divide(10, 2)
    print(result)
    result = divide(10, 0)
    print(result)
    result = divide('10', 2)
    print(result)
except ValueError as ve:
    print(f"值错误: {ve}")
except ZeroDivisionError as zde:
    print(f"除零错误: { zde}")

在这个例子中,第一次调用 divide(10, 2) 会成功执行并输出 5.0。第二次调用 divide(10, 0) 会引发 ZeroDivisionError,被捕获后输出 "除零错误: 除数不能为零"。第三次调用 divide('10', 2) 会引发 ValueError,被捕获后输出 "值错误: 输入参数必须是数字"

处理函数内部计算结果

除了对输入参数进行验证,if 语句还可以用于处理函数内部计算的结果。如果计算结果不符合预期,函数可以采取相应的措施,如返回默认值或进行修正。

例如,我们定义一个函数来计算一个数的平方根:

import math


def square_root(num):
    if num < 0:
        return None
    return math.sqrt(num)

在这个函数中,如果输入的 num 是负数,由于在实数范围内负数没有平方根,函数返回 None。否则,使用 math.sqrt 函数计算并返回平方根。

我们可以这样调用这个函数:

result1 = square_root(25)
print(result1)
result2 = square_root(-25)
print(result2)

第一个调用 square_root(25) 会返回 5.0,第二个调用 square_root(-25) 会返回 None

if 语句在函数式编程风格中的应用

条件函数的使用

在函数式编程风格中,我们可以将条件判断封装成函数,然后根据条件调用不同的函数。

例如,我们有两个简单的函数 addsubtract,分别用于加法和减法运算。我们再定义一个函数 operate,根据传入的操作符决定调用哪个函数。

def add(a, b):
    return a + b


def subtract(a, b):
    return a - b


def operate(a, b, operator):
    if operator == '+':
        return add(a, b)
    elif operator == '-':
        return subtract(a, b)
    else:
        raise ValueError("不支持的操作符")

在这个函数中,根据 operator 的值,operate 函数决定调用 add 还是 subtract 函数。如果 operator 不是 '+''-',则引发 ValueError

我们可以这样调用这个函数:

result1 = operate(5, 3, '+')
print(result1)
result2 = operate(5, 3, '-')
print(result2)
try:
    result3 = operate(5, 3, '*')
    print(result3)
except ValueError as ve:
    print(f"值错误: {ve}")

第一个调用 operate(5, 3, '+') 会调用 add 函数并返回 8。第二个调用 operate(5, 3, '-') 会调用 subtract 函数并返回 2。第三个调用 operate(5, 3, '*') 会引发 ValueError,被捕获后输出 "值错误: 不支持的操作符"

高阶函数与条件分支

高阶函数是指接受一个或多个函数作为参数,或者返回一个函数的函数。在高阶函数中,if 语句可以用于根据条件选择不同的函数进行操作。

例如,我们定义一个高阶函数 apply_function,它接受一个数字列表和一个操作函数作为参数,并对列表中的每个元素应用该操作函数。同时,我们可以添加条件判断,根据列表长度选择不同的操作函数。

def double(x):
    return x * 2


def triple(x):
    return x * 3


def apply_function(lst, func):
    if len(lst) <= 5:
        func = double
    else:
        func = triple
    return [func(num) for num in lst]

在这个函数中,如果列表 lst 的长度小于等于 5,则将 func 重新赋值为 double 函数;否则赋值为 triple 函数。然后对列表中的每个元素应用选定的函数,并返回结果列表。

我们可以这样调用这个函数:

list1 = [1, 2, 3, 4]
result1 = apply_function(list1, None)
print(result1)
list2 = [1, 2, 3, 4, 5, 6]
result2 = apply_function(list2, None)
print(result2)

第一个调用 apply_function(list1, None),因为 list1 的长度为 4 小于等于 5,所以会对列表元素应用 double 函数,输出 [2, 4, 6, 8]。第二个调用 apply_function(list2, None),因为 list2 的长度为 6 大于 5,所以会对列表元素应用 triple 函数,输出 [3, 6, 9, 12, 15, 18]

通过以上对Python函数中 if 语句条件分支的详细探讨,我们了解了其在不同场景下的应用、优化方法以及与错误处理和函数式编程风格的结合。合理运用 if 语句的条件分支,可以使我们编写的函数更加灵活、健壮且易于维护。