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

What is a better way to manipulate named values?

基本上,我正在考虑一种存储数据的方法。如果 Python 有 table,则类似于 table。例如,我有一个名称列表,我想将这些名称与变化的值相关联,然后在表达式中操作它们,最好是通过迭代。这是一个例子:三个名称 "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)

方式二:字典

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 的方法来做同样的事情。如果有的话,社区能否提供更多替代方案?

是的,还有一种更像 Python 的方式。它被称为使用 .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)
    

旧旧答案

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

foo, bar, baz = 123, 456, 789 创建一个列表,它将 123 分配给 foo456 分配给 barbaz.

也是如此

你的循环遍历 range(2) - 这是一个循环!它会遍历每个值 0-1,因此永远不会达到 2,你的 'illegal input' 在那里做什么?

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

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

你期待什么? chooser() 将始终 return 123^2。 (即121,位移的结果)

不清楚您要达到什么目的。请在你的问题中澄清这一点。

chooser 不要求用户输入,顾名思义。我认为您误解了 range() 获取输入。它不是:它 return 是一个可迭代的 (0, 1)。

如果你想在元组中存储一些变量,你可以写 data = (123, 456, 789)那么你应该写 data[0] 而不是 foo,而不是写 bar,你会写 data[1].等等 baz.