如何避免使用大量if语句实现多变量条件判断?
避免大量if-elif的优化方案
Great question! Your current approach works, but those repetitive if-elif blocks get messy fast—especially if you ever need to add more nutrition metrics later. Let's refactor this to be cleaner, more maintainable, and avoid manual pairwise checks entirely.
The Core Idea
Instead of writing a condition for every single combination of deficiencies, we can:
- Structure our data so we can iterate through each nutrition metric
- Collect all deficiencies in one pass
- React based on how many deficiencies we found (none, one, or multiple)
Fixed & Refactored Code
First, let's fix a couple of bugs in your original class (like missing __init__ parameters) and rewrite the comparison logic:
class Nutrition(): def __init__(self, pro, vit, carb, fat, mineral): # Store the user's current nutrition intake self.pro = pro self.vit = vit self.carb = carb self.fat = fat self.mineral = mineral def comp_nut(self, req_pro, req_vit, req_fat, req_carb, req_min): # Bundle each nutrient with its name, current value, and required value nutrient_checks = [ ("Protein", self.pro, req_pro), ("Vitamin", self.vit, req_vit), ("Fat", self.fat, req_fat), ("Carbs", self.carb, req_carb), ("Mineral", self.mineral, req_min) ] # Collect all nutrients that are below the required amount deficiencies = [] for nutrient_name, current_val, required_val in nutrient_checks: if current_val < required_val: deficiencies.append((nutrient_name, required_val)) # Handle results based on deficiency count if not deficiencies: print("You are healthy") elif len(deficiencies) == 1: name, req_amount = deficiencies[0] print(f"{name} is low!") print(f"Require Amount is {req_amount}") else: print('More than 1') # Get user's current intake user_pro = int(input("Enter Protein: ")) user_vit = int(input("Enter Vitamin: ")) user_fat = int(input("Enter Fat: ")) user_carb = int(input("Enter Carbs: ")) user_mineral = int(input("Enter Mineral: ")) # Create a Nutrition instance for the user user_nutrition = Nutrition(user_pro, user_vit, user_carb, user_fat, user_mineral) # Example required values (you can also let users input these!) req_pro = 50 req_vit = 100 req_fat = 30 req_carb = 150 req_min = 20 # Run the comparison user_nutrition.comp_nut(req_pro, req_vit, req_fat, req_carb, req_min)
Why This Works Better
- No more repetitive conditionals: We don't need an
eliffor every single possible single-deficiency case. - Easy to extend: If you add a new nutrient (like fiber), just add one line to the
nutrient_checkslist—no other code changes needed. - Clearer logic: We first gather all problems, then decide how to respond, which makes the code easier to debug and read.
- Less error-prone: Manual
if-elifchains are ripe for typos or missing cases; this approach eliminates that risk.
Bonus: Make Required Values Dynamic
If you want users to input their required values instead of hardcoding them, just add input prompts for those too:
# Get required nutrition values from user req_pro = int(input("Enter Required Protein: ")) req_vit = int(input("Enter Required Vitamin: ")) req_fat = int(input("Enter Required Fat: ")) req_carb = int(input("Enter Required Carbs: ")) req_min = int(input("Enter Required Mineral: "))
内容的提问来源于stack exchange,提问作者FirmCiti Inc
相关产品推荐
相关产品推荐

