如何定义两种根据输入进行迭代的方式

时间:2019-04-29 15:37:17

标签: python python-3.x iterator iteration

定义两种迭代方式的最Python形式是什么。例如,我有以下原始代码:

refs/tags/*

但是,根据def f1(cat_gen): for (a, b), c in cat_gen: if some condition: yield (a, b), c ,我需要以这种方式进行迭代:

cat_gen

是否有一种方法可以在def f1(cat_gen): for a, b, c in cat_gen: if some condition: yield a, b, c 语句中有条件地将(a, b), c更改为a, b, c

3 个答案:

答案 0 :(得分:1)

您可以这样定义它

def f1(cat_gen):
    # Figure out how to iterate, store it in condition_to_iterate
    for item in cat_gen:
        if condition_to_iterate:
            (a, b), c = item
        else:
            a, b, c = item
        # Do whatever you need with a, b, c

答案 1 :(得分:1)

传递一个可以正确评估条件的函数:

def f1(cat_gen, pred):
    for item in cat_gen:
        if pred(item):
            yield item

f1(flat, lambda a, b, c: ...)
f1(nested, lambda ab, c: ...)

或者,在将迭代器传递给f1之前,将嵌套的元组展平:

def f1(cat_gen):
    for a, b, c in cat_gen:
        if ...:
            yield a, b, c

f1(map(lambda ab, c: (ab[0], ab[1], c), nested))

答案 2 :(得分:0)

如果您希望将其保留为1个函数,并且具有两种不同的返回形式(也许不是最干净的决定,但取决于实现),您可能想要执行以下操作:

def f1(cat_gen, yield_method = 0):
    for a, b, c in cat_gen:
        if some condition:
            if yield_method:
                yield a, b, c
            else:
                yield (a, b), c

并使用户知道第二个参数的返回方式。