代码之家  ›  专栏  ›  技术社区  ›  cap

有条件地输入for循环

  •  2
  • cap  · 技术社区  · 6 年前

    如果参数是序列(列表、元组),有什么方法可以避免代码重复循环,或者跳过循环只执行一次操作?

    def foo(arg1,sequence=None):
        # If possible, loop, else do it once
            if isinstance(sequence,(list,tuple)):
                for value in sequence:
                    do_something(arg1)
            else:
                do_something(arg1)
    

    编辑: In Python, how do I determine if an object is iterable? ,如建议。我不想介绍一个不同的情况。我想避免重复。

    4 回复  |  直到 6 年前
        1
  •  6
  •   deceze    6 年前

    if not isinstance(sequence, (list, tuple)):
        sequence = [sequence]
    
    for value in sequence:
        do_something(value)
    
        2
  •  3
  •   Dietrich Epp    6 年前

    我能想到的唯一其他合理的方法是将所有内容转换为序列,然后无条件地迭代。这在Python代码中是比较常见的,它通常被提取到helper函数中。

    if not isinstance(sequence, (list, tuple)):
        sequence = [sequence]
    for value in sequence:
        ...
    
        3
  •  3
  •   willeM_ Van Onsem    6 年前

    软件设计 从另一个角度来看,将其分为两个功能可能很有趣:

    1. 一个函数,在我们将其设为可iterable之后对项进行迭代,并进行处理,如:
    def make_iterable(iterable):
        if not isinstance(iteable, (list,tuple)):
            return (iterable, )
        return iterable
    
    def foo(arg1 ,sequence=None):
        for item in make_iterable(sequence):
            do_something(arg1, item)

    所以现在我们可以很容易地让更多的事情变得更容易。例如,我们可以为 None ,以便 没有 作为避免任何迭代的一种方法:

    def make_iterable(iterable):
        if iterable is None:
            return ()
        if not isinstance(iteable, (list,tuple)):
            return (iterable, )
        return iterable

    这也很容易理解 重新使用 上述方法在各种方法中都允许输入单个对象和iterable。

    str ing是一个iterable(您可以迭代它的字符)。在这种情况下 In Python, how do I determine if an object is iterable? 将成功,但“解包”字符串可能不是一个好主意。但是当您将字符串称为 foo(4, 'foobar') ,但将其视为单个元素。

        4
  •  1
  •   blue_note    6 年前

    一种常见的方法是“请求宽恕而不是允许”。也就是说,试着把它当作一个不可数,并且 ,假设不是

    try:
        for value in sequence:
             do_something(arg1)
    except TypeError:
        do_something(arg1)
    

    我知道,当您来自另一种语言时,这似乎是违反直觉的,但在python中这是一种常见的方法。