You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的问题,现有代码也没有实现多个宠物名之间用, 分隔拼接的逻辑,无法生成符合格式要求的多宠物列表字符串。

修正实现

正确的实现逻辑分为三步:

  1. 生成固定前缀:拼接所有者的全名和固定文案,这部分不需要放在循环内重复生成
  2. 收集所有宠物名:遍历宠物列表,把每个宠物的全名整理后存入列表
  3. 拼接最终结果:用, 把所有宠物名拼接成字符串,和前缀组合后返回

参考实现代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:57:25