Python实现get_pets_string无法返回Owner实例全部宠物的问题
get_pets_string函数仅返回第一个宠物的问题排查
问题背景
练习Python面向对象编程时,需要实现名为get_pets_string的函数:
- 入参:唯一参数为
Owner类的实例 - 出参:按指定格式返回对应所有者的宠物列表字符串,格式示例如下:
David Joyner's pets are: Boggle Joyner, Artemis Joyner
题目预先给出的基础类定义代码:
class Name: def __init__(self, first, last): self.first = first self.last = last class Pet: def __init__(self, name, owner): self.name = name self.owner = owner class Owner: def __init__(self, name): self.name = name self.pets = []
函数实现正确时,运行测试代码的预期输出为:
David Joyner's pets are: Boggle Joyner, Artemis Joyner Audrey Hepburn's pets are: Pippin Hepburn
题目提供的测试代码如下:
owner_1 = Owner(Name("David", "Joyner")) owner_2 = Owner(Name("Audrey", "Hepburn")) pet_1 = Pet(Name("Boggle", "Joyner"), owner_1) pet_2 = Pet(Name("Artemis", "Joyner"), owner_1) pet_3 = Pet(Name("Pippin", "Hepburn"), owner_2) owner_1.pets.append(pet_1) owner_1.pets.append(pet_2) owner_2.pets.append(pet_3) print(get_pets_string(owner_1)) print(get_pets_string(owner_2))
错误表现
当前编写的函数实现代码如下:
def get_pets_string(owner): for obj in owner.pets: return owner.name.first + " " + owner.name.last + "'s pets are: " + obj.name.first + " " + obj.name.last
运行代码后仅能输出每个所有者的第一个宠物,实际输出不符合要求:
David Joyner's pets are: Boggle Joyner Audrey Hepburn's pets are: Pippin Hepburn
错误原因
代码存在两处核心问题:
- 循环内提前触发
return:Python中函数执行到return语句时会立刻终止运行,直接返回当前结果。当前代码在遍历owner.pets列表的第一次循环(即获取到第一个宠物对象时)就执行return,后续的宠物对象不会被遍历处理,自然只能返回第一个宠物的信息。 - 缺失多宠物拼接逻辑:即使移除提前return的问题,现有代码也没有实现多个宠物名之间用
,分隔拼接的逻辑,无法生成符合格式要求的多宠物列表字符串。
修正实现
正确的实现逻辑分为三步:
- 生成固定前缀:拼接所有者的全名和固定文案,这部分不需要放在循环内重复生成
- 收集所有宠物名:遍历宠物列表,把每个宠物的全名整理后存入列表
- 拼接最终结果:用
,把所有宠物名拼接成字符串,和前缀组合后返回
参考实现代码:
def get_pets_string(owner): # 拼接所有者前缀 owner_fullname = f"{owner.name.first} {owner.name.last}" prefix = f"{owner_fullname}'s pets are: " # 收集所有宠物的全名 pet_name_list = [] for pet in owner.pets: pet_fullname = f"{pet.name.first} {pet.name.last}" pet_name_list.append(pet_fullname) # 拼接最终结果返回 return prefix + ", ".join(pet_name_list)
运行上述修正代码,即可得到符合题目要求的输出结果。
内容的提问来源于stack exchange,提问作者Bonnie Zou
相关产品推荐
相关产品推荐

