代码之家  ›  专栏  ›  技术社区  ›  Bonnie Zou

如何在python中返回类中调用的列表

  •  -2
  • Bonnie Zou  · 技术社区  · 2 年前

    与此抗争:

    编写一个名为get\u pets\u string的函数。get\u pets\u字符串应该 有一个参数,即所有者的实例。获取\u pets\u字符串 应根据 以下格式:

    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
    
    4 回复  |  直到 2 年前
        1
  •  0
  •   Eric Jin sud    2 年前

    您可以实现一个快速助手函数来更改字符串的显示方式,只需显示名称即可:

    def repr_name(name):
        return name.first + " " + name.last
    

    然后您可以同时显示所有宠物:

    def get_pets_string(owner):
       return f"{repr_name(owner.name)}'s pets are: {', '.join([repr_name(pet.name) for pet in owner.pets])}"
    

    这个 ', '.join([str(pet.name) for pet in owner.pets]) 将每个宠物的名字放入列表中,然后用逗号分隔每个宠物。

        2
  •  0
  •   Chris    2 年前

    您可以使用 str.join 在生成格式化字符串的生成器表达式上。

    ', '.join(f"{pet.name.first} {pet.name.first}" for pet in owner_1.pets)
    

    这将产生:

    'Boggle Boggle, Artemis Artemis'
    

    因为这是家庭作业,我不想给你完整的解决方案,所以我将把这部分和其余部分放在一起。

        3
  •  0
  •   Lucas Masiero    2 年前

    问题是函数正在返回值。Return表示函数结束,因此它不会遍历其他pet。

    函数应该如下所示。。。

    def get_pets_string(owner):
        owner_string = f"{owner.name.first} {owner.name.last}'s pets are: "
        
        pets_string = ""
        for obj in owner.pets:
            pet_name = f"{obj.name.first} {obj.name.last}"
            pets_string += pet_name + " "
        
        return owner_string + pets_string
    

    实际上,您可以通过在每个类上返回全名作为methon来重构代码

        4
  •  0
  •   Copperfield    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
            #^ here is the problem, you need to iterate over your whole list but this stop after the first iteration
    

    你需要累积构建你的结果,就像这样

    def get_pets_string(owner):
        owner_name = owner.name.first + " " + owner.name.last + "'s pets are: "
        pets = []
        for obj in owner.pets:
           pets.append(obj.name.first + " " + obj.name.last) #gather all the pets names in a list
        return  owner_name + ", ".join(pets) #use join to put together all the pets name we build previously
    
        5
  •  0
  •   Bonnie Zou    2 年前

    非常感谢您对以上所有回复!!我非常感谢你的投入和知识。我确实对每个回复都发表了评论,但我不知道为什么我的评论消失了。。。 所以我把它写在这里是为了感谢大家的帮助和建议!!