操作命名值的更好方法是什么?

时间:2016-08-05 14:38:37

标签: python variables iterable

基本上,我正在考虑一种存储数据的方法。如果Python有表格,就像表格一样。例如,我有一个名称列表,我希望与更改值相关联,然后在表达式中操作它们,最好是通过迭代。这是一个例子:三个名字" foo"," bar"和" baz"声明,递减,然后改变并再次递减(在我的项目中,我列出了十几个名字,但原理是相同的)。

方式1:变量和if-elif-else:

foo = 123
bar = 456
baz = 789

def chooser(n):
    if n == 0:
        return foo - 1
    elif n == 1:
        return bar - 1
    elif n == 2:
        return baz - 1

for i in range(3):
    print chooser(i)

foo = 1
bar = 2
baz = 3

for i in range(3):
    print chooser(i)

方式2:字典

data = {'foo':123, 'bar':456, 'baz':789}

for i in ('foo', 'bar', 'baz'):
    print data[i] - 1

data['foo'] = 1
data['bar'] = 2
data['baz'] = 3

for i in ('foo', 'bar', 'baz'):
    print data[i] - 1

然而,我强烈怀疑有一种更好,更pythonic的方式来做同样的事情。社区是否可以提供其他替代方案,如果有的话?

1 个答案:

答案 0 :(得分:1)

是的,还有更多的pythonic方式。使用.items()调用它。严肃的老兄,你不能尝试在Python官方文档中查找dict吗?

for key, value in data.items():
    print(data[key] - 1)

旧答案

使用字典。它可以将字符串映射到其他对象,如下所示:

>>> data = {'foo' : 123, 'bar' : 456, 'baz' : 789}
>>> data['foo']
123

你的第二种方式甚至不起作用,即使你说它有效。你只是假装它确实有效。你不知道如何从根本上使用字典。

旧的答案

  1. 它是pythonic,而不是“pythonista”。 Pythonista描述了Python的经验。
  2. 不要在函数中使用全局变量!我认为没有理由不能将foobarbaz作为参数传递。
  3. 我不知道你在哪里“......放入一个元组或字典,但显然它根本不起作用”。它会工作。只是不要使用字典,因为那不是你想要的。您可以使用tuple_name[array_index]访问元组的元素。记住:数组索引从零开始。要在您的情况下创建元组,您需要(123, 456, 789)
  4. 目前还不清楚你在这里想要达到的目标。 告诉我们您想要实现的目标。为什么要使用该功能?为什么叫chooser?为什么不循环这样的元组呢? :

    data = (123, 456, 789)
    for element in data:
        print(element - 1)
    
  5. 旧旧答案

    我认为您对该代码段中的概念存在基本的误解。

    foo, bar, baz = 123, 456, 789 会创建一个列表,它会将123分配给foo,将456分配给bar,同样也可以baz

    你的range(2)循环 - 这是一个循环!它将覆盖每个值0-1,因此永远不会达到2,你在那里做的“非法输入”是什么?

    你忘记了函数定义中的参数列表 - 任何函数都需要,即使它没有参数。它应该是def chooser():

    顺便说一句,^运算符不是取幂 - 它是位移,这是一个你现在不应该学习的高级概念。要进行取幂,您必须使用**运算符。

    你期待什么? chooser()将始终返回123^2。 (这是121,位移的结果)

    目前还不清楚你想要实现的目标。请在您的问题中澄清这一点。

    chooser不会要求用户输入,因为名称意味着。我认为你误解了range()得到了输入。它不会:它返回一个iterable(0,1)。

    如果您想在元组中存储一些变量,可以编写data = (123, 456, 789)然后您不是写foo,而是写data[0],而不是写bar,而是写data[1]等等。 baz