Python函数参数:tuple / list

时间:2010-11-17 20:01:33

标签: python list coding-style tuples

我的函数需要列表或元组作为参数。它并不关心它是什么,它只是将它传递给另一个接受列表或元组的函数:

def func(arg): # arg is tuple or list
  another_func(x)
  # do other stuff here

现在我需要稍微修改一下这个函数来处理一个额外的元素:

def func(arg): #arg is tuple or list
  another_func(x + ['a'])
  # etc

不幸的是,这不起作用:如果arg是元组,我必须说x + ('a',)

显然,我可以通过强制arg列表来使其工作。但它并不整洁。

有更好的方法吗?当然,我不能强迫呼叫者总是传递一个元组,因为它只是转移到他们身上。

9 个答案:

答案 0 :(得分:7)

如果another_func只想要一个可迭代的,你可以将itertools.chain(x,'a')传递给它。

答案 1 :(得分:4)

如何更改其他功能以接受params列表呢?

def func(arg): # arg is tuple or list
  another_func('a', *x)

答案 2 :(得分:3)

怎么样:

l = ['a']
l.extend(x)

编辑: 重新阅读问题,我认为这更符合您的要求(使用argx有点令人困惑):

tuple(arg) + ('a',)

正如其他人所说,这可能不是最有效的方式,但它非常清楚。如果您的元组/列表很小,我可能会将其用于不太清晰的解决方案,因为性能损失可以忽略不计。如果您的列表很大,请使用效率更高的解决方案。

答案 3 :(得分:2)

def f(*args):
    print args

def a(*args):
    k = list(args)
    k.append('a')
    f(*k)

a(1, 2, 3)

输出:

(1, 2, 3, 'a')

答案 4 :(得分:2)

如果一个iterable足够你可以使用itertools.chain,但要注意,如果函数A(第一个被调用),也在调用B后遍历iterable,那么你可能有问题,因为iterables无法复活。在这种情况下,您应该选择序列或使用iterable.tee制作可迭代的副本:

import itertools as it

def A(iterable):
    iterable, backup = it.tee(iterable)
    res = B(it.chain(iterable, 'a'))
    #do something with res
    for elem in backup:
        #do something with elem

def B(iterable):
   for elem in iterable:
       #do something with elem

即使itertools.tee消耗所有 的迭代,B效率也不高,但此时更简单只需将iterable转换为tuplelist

答案 5 :(得分:1)

我的建议:

def foo(t):
    bar(list(t) + [other])

但这并不是很有效率,如果你要改变它们,那么你最好绕过可变的东西。

答案 6 :(得分:1)

您可以使用传递给第一个函数的iterable类型来构造传递给第二个函数的内容:

from itertools import chain

def func(iterable):
    it = iter(iterable)
    another_func(type(iterable)(chain(it, ('a',))))

def another_func(arg):
    print arg

func((1,2))
# (1, 2, 'a')
func([1,2])
# [1, 2, 'a']

答案 7 :(得分:0)

让你的函数接受任何迭代。然后使用itertools.chain将您想要的任何序列添加到iterable中。

from itertools import chain

def func(iterable):
    another_func(chain(iterable, ('a',)))

答案 8 :(得分:0)

我会说Santiago Lezica做的回答

def foo(t):
    bar(list(t) + [other])

是最好的,因为它是最简单的。 (无需导入itertools并使用更少可读的链调用)。但是只有在你希望小到时才使用它。如果t可能很大,则应使用其他解决方案之一。