自从提交下面提出的不良问题以来,我的理解取得了一些进展。我已经达到了这个目的:
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
...
这可以吗? 还是我朝错误的方向前进?
如果我没有输入格式正确的示例代码,请原谅。
答案 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)
)
这里有几个注意事项:
list
,因为它会与list()
全局list
类发生冲突。TestData
构造函数,而是发送3个单独的参数,每个参数都是tuple
。(a,b)
构造,而列表用[a,b]
构建接下来是这段代码:
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]