如何用Python编写递归函数实现无限层级物品清单打印?
问题描述
我正在尝试编写一个简短的Python 3函数,该函数接收两类物品并输出一份清单。一类是普通对象(称为item类),另一类是可容纳其他对象的容器(称为container类)。需要打印清单中的所有物品(包括容器内的物品),预期输出格式如下:
You are carrying: an apple a basket, containing: an orange a glass bottle, containing: a quantity of water
目前通过手动嵌套循环实现,代码如下:
if(object.type=='container'): for object1 in object.inventory: print(object.name) if(object1.type=='container'): for object2 in object1: print(object2.name)
这种方式扩展性差,无法支持无限层级嵌套,需要一个简单易懂的解决方案。
解决方案
针对嵌套容器的无限层级遍历,最适合的方法是递归——让函数自己调用自己处理每一层的容器内容,同时用缩进级别控制输出格式,非常适合新手理解和实现。
步骤1:定义物品类结构
先明确Item和Container的基础结构(符合你描述的逻辑),方便后续测试:
class Item: def __init__(self, name): self.name = name self.type = 'item' class Container(Item): def __init__(self, name): super().__init__(name) self.type = 'container' self.inventory = [] # 存储容器内的物品
步骤2:编写递归打印函数
函数接收物品列表和当前缩进级别(默认0,控制输出空格数),逻辑简单直接:
def print_inventory(items, indent=0): # 仅最外层调用时打印开头提示语 if indent == 0: print("You are carrying:") # 遍历当前层级的所有物品 for item in items: prefix = ' ' * indent if item.type == 'container': # 容器直接打印带提示的行 print(f"{prefix}{item.name}, containing:") # 递归处理容器内的物品,缩进+1 print_inventory(item.inventory, indent + 1) else: # 普通物品直接打印 print(f"{prefix}{item.name}")
步骤3:测试验证
创建物品实例并调用函数,就能得到你想要的输出:
# 创建普通物品 apple = Item("an apple") orange = Item("an orange") water = Item("a quantity of water") # 创建嵌套容器 glass_bottle = Container("a glass bottle") glass_bottle.inventory.append(water) basket = Container("a basket") basket.inventory.append(orange) basket.inventory.append(glass_bottle) # 整理成携带的物品列表 carrying = [apple, basket] # 打印清单 print_inventory(carrying)
运行后输出结果与预期完全一致:
You are carrying: an apple a basket, containing: an orange a glass bottle, containing: a quantity of water
方案优势
- 递归天然支持无限层级嵌套,不管容器套多少层都能自动遍历
- 缩进参数控制输出格式,层级清晰直观
- 代码逻辑简单,新手容易修改和扩展(比如调整缩进空格数、修改提示语等)
内容的提问来源于stack exchange,提问作者Audrey Sims-Hunt
相关产品推荐
相关产品推荐

