Python项目代码太多if-else? 这样优化才优雅!

2024-06-05 01:28

本文主要是介绍Python项目代码太多if-else? 这样优化才优雅!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

代码中不可避免地会出现复杂的if-else条件逻辑,而简化这些条件表达式是一种提高代码可读性极为实用的技巧。

在 Python 中,有多种方法可以避免复杂的 if-else 条件逻辑,使代码更加清晰和易于维护。

筑基期

提前 return,去掉多余的 else

在 Python 中,使用"提前返回"(early return)可以避免深层嵌套的if-else语句,并且使代码更加清晰。

场景:电商平台为首次购买的用户在结账时提供优惠券。如果用户不是首次购买,或者购物车中的商品总额低于某个阈值,则不提供优惠券。

未使用提前返回的原始代码

def apply_coupon(user, cart):if user.is_first_purchase:if cart.total_amount >= 100:cart.apply_discount(10)  # 应用10%的折扣print("A coupon has been applied to your purchase.")else:print("Your purchase does not meet the minimum amount for a coupon.")else:print("Coupons are only available for first-time purchases.")return cart

使用提前返回优化后的代码

def apply_coupon(user, cart):# 检查是否为首次购买if not user.is_first_purchase:print("Coupons are only available for first-time purchases.")return cart# 检查购物车总额是否满足条件if cart.total_amount < 100:print("Your purchase does not meet the minimum amount for a coupon.")return cart# 应用优惠券cart.apply_discount(10)  # 应用10%的折扣print("A coupon has been applied to your purchase.")return cart

首先,定义用户和购物车类,以及必要的属性和方法:

class User:def __init__(self, is_first_purchase):self.is_first_purchase = is_first_purchaseclass Cart:def __init__(self, total_amount):self.total_amount = total_amountself.discount = 0def apply_discount(self, percentage):self.discount = self.total_amount * (percentage / 100)self.total_amount -= self.discountdef __str__(self):return f"Cart(total_amount={self.total_amount}, discount={self.discount})"

然后,我们创建两个用户和两个购物车对象。

  • 第一个用户是首次购买,购物车总额为150,满足应用优惠券的条件,因此会看到优惠券被应用,并且购物车总额减少。
  • 第二个用户不是首次购买,购物车总额为50,不满足应用优惠券的条件,因此会看到相应的提示信息,购物车总额不变。
# 创建用户对象,假设是首次购买
user = User(is_first_purchase=True)# 创建购物车对象,假设购物车总额为150
cart = Cart(total_amount=150)# 打印原始购物车状态
print("原始购物车状态:", cart)# 调用apply_coupon函数
cart = apply_coupon(user, cart)# 打印应用优惠券后的购物车状态
print("应用优惠券后的购物车状态:", cart)# 再次创建一个购物车对象,假设购物车总额为50,且用户不是首次购买
another_user = User(is_first_purchase=False)
another_cart = Cart(total_amount=50)# 打印原始购物车状态
print("\n原始购物车状态:", another_cart)# 调用apply_coupon函数
another_cart = apply_coupon(another_user, another_cart)# 打印应用优惠券后的购物车状态(实际上不会应用优惠券)
print("应用优惠券后的购物车状态(实际上不会应用优惠券):", another_cart)

在这个优化后的版本中,我们使用了提前返回来简化逻辑流程:

  1. 首先检查用户是否为首次购买,如果不是,则立即返回,不再执行后续代码。
  2. 然后检查购物车总额是否满足优惠券的最低限额,如果不满足,同样立即返回。
  3. 只有当这两个条件都满足时,才应用优惠券并打印相应的消息。

提前返回的好处

  • 逻辑清晰:每个条件都被单独检查,并且不满足时立即返回,逻辑流程非常清晰。
  • 减少嵌套:避免了深层嵌套的if-else结构,使得代码更加扁平化。
  • 易于维护:当需要修改条件或者添加新的条件时,可以很容易地在函数开头添加新的检查。
  • 避免冗余:去掉了不必要的else语句,因为每个if语句都有明确的返回点。

通过这种方式,提前返回使得代码更加简洁、直观,并且易于理解和维护。

使用合适的逻辑运算符

Python开发中,逻辑运算符andorinbool()not等可以帮助我们简化条件判断,从而减少if语句的使用。以下是使用逻辑运算符优化if语句的一个电商例子。

场景:电商平台想要为特定条件下的用户提供优惠券。条件包括:

  • 用户必须是新用户(is_new 属性为 True)。
  • 用户的购物车中必须包含至少一种电子产品(category 属性为 "electronics")。
  • 用户的购物车总价必须超过一定金额(例如200元)。

未使用逻辑运算符的原始代码

from collections import namedtupledef apply_coupon(_cart_items, _user):if _user.is_new:if any(item['category'] == 'electronics' for item in _cart_items):if sum(item['price'] * item['quantity'] for item in _cart_items) > 200:# 应用优惠券逻辑print("Coupon applied!")else:print("Cart total is less than 200.")else:print("No electronics in cart.")else:print("User is not new.")# 示例用户和购物车
User = namedtuple('User', ["is_new"])
user = User(is_new=True)
cart_items = [{'name': 'Laptop', 'category': 'electronics', 'price': 150, 'quantity': 1},{'name': 'Book', 'category': 'books', 'price': 50, 'quantity': 2},
]apply_coupon(cart_items, user)  # Coupon applied!

使用逻辑运算符优化后的代码

from collections import namedtupledef apply_coupon(cart_items, user):# 使用逻辑运算符组合条件new_user = user.is_newhas_electronics = any(item['category'] == 'electronics' for item in cart_items)cart_total = sum(item['price'] * item['quantity'] for item in cart_items) > 200# 如果所有条件都满足,则应用优惠券if new_user and has_electronics and cart_total:print("Coupon applied!")else:print("Coupon not applied.")# 示例用户和购物车
User = namedtuple('User', ["is_new"])
user = User(is_new=True)
cart_items = [{'name': 'Laptop', 'category': 'electronics', 'price': 150, 'quantity': 1},{'name': 'Book', 'category': 'books', 'price': 50, 'quantity': 2},
]apply_coupon(cart_items, user)  # Coupon applied!

在这个优化后的版本中,我们首先使用逻辑运算符来单独评估每个条件:

  • new_user 检查用户是否为新用户。
  • has_electronics 检查购物车中是否有电子产品。
  • cart_total 检查购物车总价是否超过 200 元。

然后,我们使用and运算符来确保所有条件都满足,只有当这个组合条件为真时,才应用优惠券。

使用逻辑运算符的好处包括:

  1. 代码简化:减少了嵌套的if语句,使代码更加简洁。
  2. 逻辑清晰:每个条件的评估清晰明了,易于理解和维护。
  3. 易于调整:如果需要修改条件或添加新条件,只需调整逻辑表达式即可。

通过这种方式,逻辑运算符帮助我们编写出更加Pythonic和易于维护的代码。

提炼条件判断逻辑

当条件判断变得过于复杂时,它不仅难以理解,还可能导致代码维护困难。将复杂的条件判断逻辑提炼成独立的函数是一种很好的实践,这样可以使代码更加清晰、可读性更高,并且易于维护。

假设我们有一个函数,根据用户的购物车中的商品种类和数量来决定是否提供折扣。原始的代码可能包含多个嵌套的if-else语句,如下所示:

def calculate_discount(_cart_items):discount = 0if 'electronics' in _cart_items:if len(_cart_items['electronics']) >= 3:discount += 10if 'laptop' in _cart_items['electronics']:discount += 5elif 'clothing' in _cart_items:if len(_cart_items['clothing']) >= 5:discount += 15# ... 更多条件return discount

这个函数的可读性很差,很难一眼看出它在做什么。我们可以将复杂的条件判断逻辑提炼成独立的函数,如下所示:

# 定义检查商品的函数
def has_bulk_electronic_items(_cart_items):return len(_cart_items.get('electronics', [])) >= 3def has_laptop_in_electronics(_cart_items):return 'laptop' in _cart_items.get('electronics', [])def has_many_clothing_items(_cart_items):return len(_cart_items.get('clothing', [])) >= 5# 定义计算折扣的函数
def calculate_discount(_cart_items):discount = 0if has_bulk_electronic_items(_cart_items):discount += 10  # 电子产品数量超过3个,折扣10%if has_laptop_in_electronics(_cart_items):discount += 5  # 电子产品中有笔记本电脑,额外折扣5%if has_many_clothing_items(_cart_items):discount += 15  # 服装数量超过5个,折扣15%

这篇关于Python项目代码太多if-else? 这样优化才优雅!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031688

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的