将参数集列表传递给函数

时间:2017-10-02 15:15:43

标签: python list function

自从提交下面提出的不良问题以来,我的理解取得了一些进展。我已经达到了这个目的:

from collections import namedtuple
a = 3
Data = namedtuple('Data', 'b c')
d1 = Data(4,5)
d2 = Data(6,7)
data_list = (d1, d2)
def test1(a, *data) :
...

但*数据显然不是我寻求传递data_list的正确语法。 我如何构造它,以便函数知道这是一个namedtuple列表,定义为Data。

在函数中,我需要做类似的事情:         打印'A =',a         对于每个数据             print'BC =',data.b + data.c

以下原始问题。

我是C的老手,但对Python来说是新手,所以我的观点很可能是错位的。 我需要调用一个带有几个变量的函数,以及一组预定义值的列表。 我想象这样的事情:

class TestData
    def __init__(self, input, delay, result)
    self.input = input
    self.delay = delay
    self.result = result

#                (input, delay, result)
TestData list = [
                 (11, 250, 42)
                 (22, 500, 123)
                 (37, 100, 97)
                ]

RunTest(id, channel, list)
    setup(id, channel)
    for each in list
        ...

这可以吗? 还是我朝错误的方向前进?

如果我没有输入格式正确的示例代码,请原谅。

3 个答案:

答案 0 :(得分:4)

<强>设置

class TestData:
     def __init__(self, inp, delay, result):
         self.input = inp
         self.delay = delay
         self.result = result

_list = [
  (11, 250, 42),
  (22, 500, 123),
  (37, 100, 97)
 ]

使用 list comprehension 创建对象,在每次迭代时将数据传递给构造函数:

>>> [TestData(*x) for x in _list]
[<__main__.TestData at 0x140b47eb8>,
 <__main__.TestData at 0x140b472b0>,
 <__main__.TestData at 0x140b474e0>]

或者,以类似的方式,使用for循环:

>>> o_list = []
>>> for x in _list:
...    o_list.append(TestData(*x))
...
>>> o_list
[<__main__.TestData at 0x143d8a1d0>,
 <__main__.TestData at 0x143d8a2b0>,
 <__main__.TestData at 0x143d8a278>]

答案 1 :(得分:1)

我可以看到您发布的代码存在许多问题,我认为您遇到的问题不仅仅是如何将值列表传递给函数。

您的TestData课程看起来很不错,但此代码不起作用:

TestData list = [
                 (11, 250, 42)
                 (22, 500, 123)
                 (37, 100, 97)
                ]

如果您尝试创建TestData的新实例,则需要:

list = TestData(
    (11, 250, 42),
    (22, 500, 123),
    (37, 100, 97)
    )

这里有几个注意事项:

  1. 您可能不想调用本地变量list,因为它会与list()全局list类发生冲突。
  2. 您没有将参数列表传递给TestData构造函数,而是发送3个单独的参数,每个参数都是tuple
  3. 元组基本上是不可变列表(你不能在tupe中重新分配值,你不能调整元组的大小),并且用(a,b)构造,而列表用[a,b]构建
  4. 接下来是这段代码:

    RunTest(id, channel, list)
        setup(id, channel)
        for each in list
    

    RunTest应该是什么?一个功能?一类?如果它是一个功能,你需要:

    def RunTest(id, channel, list):
    

    注意前导def定义一个函数,并注意尾随:来启动一个新的代码块。它也是python惯例,只有类使用CammelCase,函数应该使用snake_case

    您的setup功能是什么样的?你不要在这里给它。

    代码for each in list需要一个尾随冒号,你不应该使用each,它不需要python for循环。该位置的标识符将包含每次迭代的元素list。你可能想要这样的东西:

    for item in list:
        do_something(item)
    

    但这也假设list是可迭代的。如果您真的希望list成为TestData类的实例,则可能无法迭代。您想要从list.input

    中循环每个项目吗?

答案 2 :(得分:0)

它可以工作,但不是那样。

tdparams = [ ... ]

 ...

tdseq = [TestData(*params) for params in tdparams]