在函数内部或外部循环?

时间:2015-06-10 14:35:17

标签: python function loops 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)

B:LOOP OUTSIDE FUNCTION

函数只处理一个对象,当处理更多对象时,必须多次调用。

    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)

我个人更喜欢第一个(A),因为对我来说,它在调用函数时会产生更干净的代码,但也许它不是正确的方法。是否有一些方法通常比另一方更好?如果没有,每种方法的缺点和优点是什么?

2 个答案:

答案 0 :(得分:4)

函数应具有已定义的输入和输出,并遵循single responsibility principle。你需要能够根据“我把foo放入,我得到回酒”来清楚地定义你的功能。您需要在此语句中进行的更多限定符才能正确描述您的函数,这可能意味着您的函数执行过多。 “我把foo放进去并取回吧,除非我把baz放进去然后我也会回来,除非我把foo-baz放进去然后它会错误”

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

因此,在实践中采用一个参数来处理多个值的函数是微不足道的。没有理由通过使其适应多个参数来使函数的设计复杂化。尽可能简单明了地编写函数,如果需要它来处理事物列表,那么可以通过 outside 函数列表循环它。

如果您尝试为函数指定一个实际有用的名称来描述它的作用,这可能会变得更加清晰。您需要使用复数或单数术语吗? foo_the_bar(bar)除了foo_the_bars(bars)之外还有其他功能。

答案 1 :(得分:-1)

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

如果你实现了A,那么实现B并不是很困难。你也有很多工具可以将这个函数应用到一个参数列表中(你描述的循环方法,使用像map这样的东西,甚至如果需要,可以采用多处理方法)

因此我会选择实现A,如果它在某个特定情况下使事情变得更整洁或更容易,你也可以考虑实现B(使用A),这样你就可以同时使用。

相关问题