【问题标题】:What is a better way to manipulate named values? [closed]操作命名值的更好方法是什么? [关闭]
【发布时间】:2016-12-12 00:37:57
【问题描述】:

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

方式一:变量和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

但是,我强烈怀疑有一种更好、更 Python 的方式来做同样的事情。如果有的话,社区可以提供更多的替代方案吗?

【问题讨论】:

  • "显然它根本不起作用" 怎么样?应该工作得很好。请解释一下您到底想要什么,以及有什么问题。当新值分配给原始变量时,您是否希望更新列表或字典中的值?
  • 这么多问题:你想让你的函数做什么?您正在寻找哪些输入和输出示例?你的for 循环有什么意义?它只会每次执行一次,因为您在第一次迭代时 return 某事。
  • 选择器的输入是什么?预期的输出是什么?
  • 也许我们在这里寻找yield
  • 如果你使用一个更现实的例子会更好 - 这将总是返回 foo ^ 2。

标签: python variables iterable


【解决方案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)
    

旧旧旧答案

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

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

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

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

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

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

目前尚不清楚您要达到的目标。请在您的问题中澄清这一点。

chooser 不要求用户输入,正如名称所暗示的那样。我想你误解了range() 得到输入。它没有:它返回一个可迭代的 (0, 1)。

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

【讨论】:

  • 正确。做得不好。好的,将不得不提出一个更好的问题。大家,谢谢,会回来的
  • @user6570767 你的代码甚至没有运行,你说“它按预期工作”。
  • 请问您现在可以检查一下吗?
  • @user6570767 您之前的代码 sn-p 与新代码完全不同。为什么你之前的代码中有^?学习创建minimal reproducible example
  • " 你以前的代码 sn-p 与新的代码完全不同" - 你能解释一下我怎样才能让它更清楚吗?我试图用一种更简洁的方式来做与这段代码相同的事情,就是这样。你对每个元组的最后一个建议很好,只是我希望保留命名。
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
相关资源
最近更新 更多