ato*_*c44 0 python loops function python-3.x
当一次处理更多对象(但可以选择仅处理一个对象)时,哪种方法更好呢?
A:内部功能循环
可以使用一个或多个对象调用函数,并且该函数在函数内部进行迭代:
class Object:
def __init__(self, a, b):
self.var_a = a
self.var_b = b
var_a = ""
var_b = ""
def func(obj_list):
if type(obj_list) != list:
obj_list = [obj_list]
for obj in obj_list:
# do whatever with an object
print(obj.var_a, obj.var_b)
obj_list = [Object("a1", "a2"), Object("b1", "b2")]
obj_alone = Object("c1", "c2")
func(obj_list)
func(obj_alone)
Run Code Online (Sandbox Code Playgroud)
B:圈外功能
函数仅处理一个对象,并且在处理多个对象时必须多次调用。
class Object:
def __init__(self, a, b):
self.var_a = a
self.var_b = b
var_a = ""
var_b = ""
def func(obj):
# do whatever with an object
print(obj.var_a, obj.var_b)
obj_list = [Object("a1", "a2"), Object("b1", "b2")]
obj_alone = Object("c1", "c2")
for obj in obj_list:
func(obj)
func(obj_alone)
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢第一个(A),因为对我来说,在调用函数时它可以使代码更简洁,但也许这不是正确的方法。通常有什么方法比另一种更好吗?如果不是,每种方法的利弊是什么?
一个功能应具有定义的输入和输出,并遵循单一职责原则。您需要能够根据“我放入foo,我退回”明确定义函数。您需要在此语句中使用更多限定词来正确描述您的功能,这可能意味着您的功能做得太多。“我把foo放回去,除非我放baz,否则我也会放回去,除非我把foo-baz放回去,否则会出错”。
在这种情况下,您可以传递一个对象或对象列表。尝试将其概括为一个值或值列表。如果要将列表作为值传递怎么办?现在,您的函数行为是模棱两可的。您希望将单个列表对象作为您的值,但是函数会将其视为多个参数。
因此,在实际应用中,采用一个带有一个参数的函数来处理多个值是微不足道的。没有理由通过使它适应多个参数来使函数的设计复杂化。尽可能简单,清晰地编写该函数,如果您需要它遍历所有事物,则可以遍历该函数之外的事物。
如果您尝试给函数描述一个实际有用的名称,这可能会变得更加清晰。您需要使用复数形式还是单数形式?foo_the_bar(bar)除了做其他的事情foo_the_bars(bars)。
cam*_*amz -2
如果你实施B,那么你将更难实现A。
如果您实现 A,那么实现 B 并不太困难。您还可以使用许多工具来将此函数应用于参数列表(您描述的循环方法,使用诸如映射之类的东西,甚至如果需要的话可以使用多处理方法) )
因此,我会选择实现 A,如果它在给定情况下使事情变得更整洁或更容易,您可以考虑也实现 B(使用 A),以便两者兼得。
| 归档时间: |
|
| 查看次数: |
4060 次 |
| 最近记录: |