-1

我是一个相对的 python 初学者,现在对这种语言相当熟悉,但仍在努力解决什么是“pythonic”而不是什么的问题。我想知道人们对这个问题的想法是什么。

例如,使用这行代码来计算从 peewee 数据库中提取的出租物业每周的平均成本:

    Rental_avg_costperweek = sum([calcCostPerWeek(rental.price,rental.rental_freq) 用于出租
                                 [LLSRental.select(LLSRental.id == this_id) for this_id in nearest_rental_ids]]) \
                             / len(closest_rental_ids)

它使用嵌套列表推导,这可能会造成混淆。

或者,我可以将内部理解粘贴到一个临时变量中:

    most_rental_records = [LLSRental.select(LLSRental.id == this_id) for this_id in nearest_rental_ids]
    Rental_avg_costperweek = sum([calcCostPerWeek(rental.price,rental.rental_freq) 用于在最近租借记录中的租借]) \
                             / len(closest_rental_ids)

这可能(有点)更容易阅读,但作为一名前 C++ 程序员,我不喜欢纯粹为了可读性而创建临时变量,因为它会使命名空间变得混乱,并可能为垃圾收集器带来更多工作。

另外我认为,如果读者不理解该变量纯粹是暂时的,如果有很多这样的变量,可能会使代码更加混乱。

因此,尽管有“平面比嵌套更好”的指导,我还是倾向于选择第一个选项而不是第二个选项……但是你们蟒蛇老手怎么看?

谢谢!
通用电气

4

1 回答 1

1

我认为两者都是错误的。看起来您正在做内部理解,因为您想避免重新计算 LLSRental.select()。如果您适当地使用推导,您应该很少需要内部推导,因为您可以嵌套它们,例如

all_the_inputs = [ process_value(x) for y in all_the_stuff for x in y ]

或者其他的东西。这是一篇很好但很短的文章,很好地解释了这一点。

反正。就像是

rental_avg_costperweek = 0
for this_id in closest_rental_ids:
    rental = LLSRental.select(LLSRental.id == this_id)
    rental_avg_costperweek += calcCostPerWeek(rental.price, rental.rental_freq)
rental_avg_costperweek /= len(closest_rental_ids)

似乎是一种更合适的计算方式。实际上,我创建的对象比您的代码,因为我没有无缘无故制作的两个列表,而您的代码为中间计算创建了两个列表,然后将它们丢弃。

于 2013-04-03T12:34:58.207 回答