操作命名值的更好方法是什么?
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
你的第二种方法根本行不通,尽管你说它行得通。你只是假装它确实有效。你不知道如何从根本上使用字典。
旧答案
- 它是 pythonic,而不是 "pythonista"。 Pythonista 描述了某人对 Python 有经验。
- 不要在函数中使用全局变量!我看不出您为什么不能将
foo
、bar
和 baz
作为参数传递。
- 我不知道你从哪里得到“......放入元组或字典但显然它根本不起作用”。它会起作用。只是不要使用字典,因为那不是你想要的。您可以使用
tuple_name[array_index]
访问元组的元素。请记住:数组索引从零开始。要根据您的情况创建一个元组,您需要 (123, 456, 789)
目前还不清楚您要在这里实现什么。 告诉我们你想要实现什么。 为什么还要使用这个功能?为什么叫chooser
?为什么不像这样遍历一个元组呢? :
data = (123, 456, 789)
for element in data:
print(element - 1)
旧旧答案
我认为您对该代码段中的概念有基本的误解。
foo, bar, baz = 123, 456, 789
不 创建一个列表,它将 123
分配给 foo
,456
分配给 bar
,baz
.
也是如此
你的循环遍历 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
.
基本上,我正在考虑一种存储数据的方法。如果 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
你的第二种方法根本行不通,尽管你说它行得通。你只是假装它确实有效。你不知道如何从根本上使用字典。
旧答案
- 它是 pythonic,而不是 "pythonista"。 Pythonista 描述了某人对 Python 有经验。
- 不要在函数中使用全局变量!我看不出您为什么不能将
foo
、bar
和baz
作为参数传递。 - 我不知道你从哪里得到“......放入元组或字典但显然它根本不起作用”。它会起作用。只是不要使用字典,因为那不是你想要的。您可以使用
tuple_name[array_index]
访问元组的元素。请记住:数组索引从零开始。要根据您的情况创建一个元组,您需要(123, 456, 789)
目前还不清楚您要在这里实现什么。 告诉我们你想要实现什么。 为什么还要使用这个功能?为什么叫
chooser
?为什么不像这样遍历一个元组呢? :data = (123, 456, 789) for element in data: print(element - 1)
旧旧答案
我认为您对该代码段中的概念有基本的误解。
foo, bar, baz = 123, 456, 789
不 创建一个列表,它将 123
分配给 foo
,456
分配给 bar
,baz
.
你的循环遍历 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
.