代码之家  ›  专栏  ›  技术社区  ›  user6570767

操作命名值的更好方法是什么?[已关闭]

  •  -2
  • user6570767  · 技术社区  · 8 年前

    基本上,我正在考虑一种存储数据的方法。如果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)
    

    方式二:字典

    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的方法可以做同样的事情。如果有其他选择,社区可以提供吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   noɥʇʎԀʎzɐɹƆ    8 年前

    是的,还有一种更像pythonic的方法。这叫做使用 .items() 说真的,伙计,你不能试着抬头看看吗 dict 在Python官方文档中?

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

    旧答案

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

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

    你的第二种方法甚至行不通,尽管你说它行得通。你只是假装它有效。你不知道如何从根本上使用字典。


    旧的旧答案

    1. 它是pythonic,而不是“pythonistica”。Pythonista描述了一个有Python经验的人。
    2. 不要在函数中使用全局变量!我看你没有理由不及格 foo , bar baz
    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 食品 , 456 酒吧 ,同样适用于 巴兹 .

    你的循环 range(2) -这是一个循环!它会检查每个值 0-1 所以 2

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

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

    你期待什么? chooser() 123^2 .(即 121 ,位移位的结果)

    还不清楚你想实现什么。请在您的问题中澄清这一点。

    选择器 不会像名字所暗示的那样要求用户输入。我想你误解了 range() 获取输入。它没有:它返回一个iterable(0,1)。

    如果你想在元组中存储一些变量,你可以写 data = (123, 456, 789) . 那就不要写了 食品 data[0] ,而不是写作 酒吧 ,你会写 data[1] . 巴兹 .