我的函数需要列表或元组作为参数。它并不关心它是什么,它只是将它传递给另一个接受列表或元组的函数:
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列表来使其工作。但它并不整洁。
有更好的方法吗?当然,我不能强迫呼叫者总是传递一个元组,因为它只是转移到他们身上。
答案 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)
编辑:
重新阅读问题,我认为这更符合您的要求(使用arg
和x
有点令人困惑):
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
转换为tuple
或list
。
答案 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可能很大,则应使用其他解决方案之一。