gpt4 book ai didi

Python风格: nested vs extra function

转载 作者:行者123 更新时间:2023-12-01 05:12:53 25 4
gpt4 key购买 nike

我对 python (2.7) 很陌生,并且有一个关于做某事最 Pythonic 的方法是什么的问题;我的代码(类的一部分)看起来像这样(有点幼稚的版本):

def calc_pump_height(self):
for i in range(len(self.primary_)):
for j in range(len(self.primary_)):
if self.connections_[i][j].sub_kind_ in [1,4]:
self.calc_spec_pump_height(i,j)

def calc_spec_pump_height(self,i,j):
pass

(显然pass会被替换成别的东西,操作这个类的对象的属性,而不产生返回值)

我想问我应该如何做到这一点:我可以避免第二个函数并将额外的代码直接写入第一个函数,摆脱一个函数(简单比复杂更好),但创建一个严重嵌套的函数同时发挥作用(扁平比嵌套更好)。

我还可以创建某种列表理解以避免使用双循环,例如:

def calc_pump_height(self):
ra = range(len(self.primary_))
[self.calc_spec_pump_height(i,j) for i,j in zip(ra, ra)]

(我必须将 if 条件移动到第二个函数中;这也会创建一个空列表,但我不关心这一点,因为 calc_spec_pump_height 应该操纵该对象,不返回有用的东西)

本质上:我正在迭代一个 2D 列表,测试每个对象的特定特征,然后对该对象执行某些操作。

上述哪种方法是“最好的”?或者我还缺少另一种方式吗?

最佳答案

函数/方法的关键是它们应该做一件事。

calc_pump_height 实现了两件事:它在 2D 列表中查找与某些条件匹配的元素,然后计算每个元素的值。如果这对对象的公共(public) API 有意义,那么将其他两个操作结合起来是可以的,但它不能实现其中一个或两个。

  • 查找符合条件的元素是一个离散的步骤;这应该是一个函数。
  • 计算您的值(value)显然是一个离散的步骤;这应该是一个函数。

我会将元素匹配器实现为(私有(private))生成器,它将测试条件作为参数,并生成所有匹配的元素。它只是数据结构上的迭代器,被逻辑测试掩盖。您可以将其包装在名为 get_1_4_subkinds() 的命名公共(public)方法中,或者在您的域中更有意义的方法中。这概括了代码,并使您能够灵活地在将来实现其他条件。此外,您的 i 和 j 紧密耦合,因此将它们作为单个概念传递是有意义的。那么你的代码就变成了:

def calc_pump_height(self):
for subkind_indices in self.get_1_4_subkinds():
self.calc_pump_spec_height(subkind_indices)

关于Python风格: nested vs extra function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23798399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com