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

python函数参数:tuple/list

  •  6
  • max  · 技术社区  · 14 年前

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

    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是tuple,我必须说 x + ('a',)

    显然,我可以通过强制arg列出它来使其工作。但它不干净。

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

    9 回复  |  直到 14 年前
        1
  •  7
  •   Jochen Ritzel    14 年前

    如果 another_func 只想要一个你能通过的 itertools.chain(x,'a') 对它。

        2
  •  4
  •   fabmilo    14 年前

    更改另一个函数以接受参数列表怎么样?

    def func(arg): # arg is tuple or list
      another_func('a', *x)
    
        3
  •  3
  •   Sean    10 年前

    怎么样:

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

    编辑: 重新阅读问题,我认为这是你想要的(使用 arg x 有点困惑):

    tuple(arg) + ('a',)
    

    正如其他人所说,这可能不是最有效的方法,但很明显。如果您的元组/列表很小,我可能会在不太清晰的解决方案上使用它,因为性能影响可以忽略不计。如果您的列表很大,请使用更高效的解决方案。

        4
  •  2
  •   pyfunc    14 年前
    def f(*args):
        print args
    
    def a(*args):
        k = list(args)
        k.append('a')
        f(*k)
    
    a(1, 2, 3)
    

    输出:

    (1, 2, 3, 'a')
    
        5
  •  2
  •   Bakuriu    9 年前

    如果一个iterable足够,你可以使用 itertools.chain ,但请注意,如果函数 A (第一个调用),也在调用后迭代iterable B ,那么您可能会遇到问题,因为iterables无法重新连接。在这种情况下,您应该选择序列或使用 iterable.tee 要复制iTable,请执行以下操作:

    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 如果 消耗 全部的 在那一点上,简单地转换 iterable 到A tuple 或A list

        6
  •  1
  •   salezica    14 年前

    我的建议:

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

    不过,这并不是很有效,如果你想改变可变的东西,最好是把它们传出去。

        7
  •  1
  •   martineau    14 年前

    可以使用传递给第一个函数的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']
    
        8
  •  0
  •   Steven Rumbalski    14 年前

    让你的功能接受任何不可更改的内容。然后使用 itertools.chain 向iterable添加您想要的任何序列。

    from itertools import chain
    
    def func(iterable):
        another_func(chain(iterable, ('a',)))
    
        9
  •  0
  •   JanKanis    14 年前

    我要说圣地亚哥·莱齐卡的回答

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

    是最好的,因为它是最简单的。(不需要导入itertools的内容,也不需要使用可读性差得多的链调用)。但只有当你希望T小的时候才使用它。如果T可以很大,则应使用其他解决方案之一。