【问题标题】:Why does my function give up early?为什么我的功能会提前放弃?
【发布时间】:2016-11-21 05:32:49
【问题描述】:

我有一个小程序,它应该是细胞从出生到减数分裂到死亡的生命周期的基本模型。尽管我已经弄清楚了其中的大部分,但我仍然坚持以下几点:

class cell:
    def __init__(self):
        self.name = random.randint(1,1000) 
        self.type = [random.choice(b)] 
        self.age = 0
        self.evos = random.randint(1,5) #<-- need to access this attr

def displayEvolutions(pop): # one of many methods, this one is a problem
    p = []
    for i in pop:
        p.append(i.evos)
        return p

community = [#a bunch of class instances]
cells_that_evolved = displayEvolutions(community)  

它应该遍历类实例列表community,访问它们的evo 属性,用该数据填充cells_that_evolved,然后将该列表显示给用户。

应该是这样的:

cells_that_evolved = displayEvolutions(community)
print(cells_that_evolved)

[3, 4, 5, 6, 7, 8, 3, 1, 5] #<--- 9 instances, 9 values = instance.evos

但是,无论我尝试什么,它只会将第一个值附加到列表中,因此列表看起来像这样:

[3]

为什么?

【问题讨论】:

    标签: python list class python-3.x for-loop


    【解决方案1】:

    你有一个缩进问题:

    def displayEvolutions(pop):
        p = []
        for i in pop:
            p.append(i.evos)
            return p
    

    第一次通过你的循环,当遇到return p 时,返回p 的当前值并且函数终止。相反,您应该在循环完成后通过取消缩进该行来返回 p

    def displayEvolutions(pop):
        p = []
        for i in pop:
            p.append(i.evos)
        return p
    

    编写函数的更优雅的方法是使用list comprehension

    def displayEvolutions(pop):
        return [i.evos for i in pop]
    

    【讨论】:

    • 当然,更简洁的方法是使用列表推导:def displayEvolutions(pop): return [i.evos for i in pop]。这还有一个额外的好处,就是不允许出现缩进问题。
    • @SethMMorton 你是对的,当然 - 在这个答案中,我决定为 self-described 初学者提供最简单的解决方案。
    • 是的,我知道。我只是想,既然列表理解正是为此目的而创建的,我认为将这个概念引入 OP 是值得的。
    • @SethMMorton 好的,你扭伤了我的胳膊 ;-)
    • 哈!该死的,它总是最简单的事情。哈哈,谢谢大家
    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2011-06-30
    • 2013-09-08
    • 1970-01-01
    • 2012-10-20
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多