在函数内部还是外部循环?

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),因为对我来说,在调用函数时它可以使代码更简洁,但也许这不是正确的方法。通常有什么方法比另一种更好吗?如果不是,每种方法的利弊是什么?

dec*_*eze 5

一个功能应具有定义的输入和输出,并遵循单一职责原则。您需要能够根据“我放入foo,我退回”明确定义函数。您需要在此语句中使用更多限定词来正确描述您的功能,这可能意味着您的功能做得太多。“我把foo放回去,除非我放baz,否则我也会放回去,除非我把foo-baz放回去,否则会出错”

在这种情况下,您可以传递一个对象或对象列表。尝试将其概括为一个值或值列表。如果要将列表作为值传递怎么办?现在,您的函数行为是模棱两可的。您希望将单个列表对象作为您的值,但是函数会将其视为多个参数。

因此,在实际应用中,采用一个带有一个参数的函数来处理多个值是微不足道的。没有理由通过使它适应多个参数来使函数的设计复杂化。尽可能简单,清晰地编写该函数,如果您需要它遍历所有事物,则可以遍历该函数之外的事物。

如果您尝试给函数描述一个实际有用的名称,这可能会变得更加清晰。您需要使用复数形式还是单数形式?foo_the_bar(bar)除了做其他的事情foo_the_bars(bars)


cam*_*amz -2

如果你实施B,那么你将更难实现A。

如果您实现 A,那么实现 B 并不太困难。您还可以使用许多工具来将此函数应用于参数列表(您描述的循环方法,使用诸如映射之类的东西,甚至如果需要的话可以使用多处理方法) )

因此,我会选择实现 A,如果它在给定情况下使事情变得更整洁或更容易,您可以考虑也实现 B(使用 A),以便两者兼得。