当在编写复杂的业务逻辑需要大量嵌套if-else语句时,会导致代码可读性很差,并且难以维护。
使用bisect简化表达式:
比如我们需要编写一个电影评分的判断,小于6分的评分为D,6-7评分为C,7-8评分为B,8-8.5评分为A,8.5以上评分为S。我们可以使用python内置的二分查找包
import bisect
class Movie:
"""电影对象数据类"""
def __init__(self, name, year, rating):
self.name = name
self.year = year
self.rating = rating
@property
def rank(self):
break_points = (6, 7, 8, 8.5)
grades = ('D', 'C', 'B', 'A', 'S')
index = bisect.bisect(break_points, float(self.rating))
return grades[index]
使用两个元组。只需要将对应的区间与评分对齐即可,这时python会自动完成相应区间查找,并返回对应的评分。
使用提前返回扁平化函数:
before
def buy_fruit(nerd, store):
# 活动:如果活动还在开放,并且活动剩余名额大于 10,为所有性别为女性,或者级别大于
# 3 的活跃用户发放 10000 个金币
if (
activity.is_active
and activity.remaining > 10
and user.is_active
and (user.sex == 'female' or user.level > 3)
):
user.add_coins(10000)
return
after
def buy_fruit(nerd, store):
# 活动:如果活动还在开放,并且活动剩余名额大于 10,为所有性别为女性,或者级别大于
# 3 的活跃用户发放 10000 个金币
if not store.is_open():
raise MadAtNoFruit("store is closed!")
if not store.has_stocks("apple"):
raise MadAtNoFruit("no apple in store!")
if nerd.can_afford(store.price("apple", amount=1)):
nerd.buy(store, "apple, amount=1")
return
else:
nerd.go_home_and_get_money()
return buy_fruit(nerd, store)
我们也可以使用函数封装,复用代码:
if activity.allow_new_user() and user.match_activity_condition():
user.add_coins(10000)
return