Python 3更改for循环中字典键的值不起作用

Fozbstuios

我有无法按预期工作的python 3代码:

def addFunc(x,y):
    print (x+y)

def subABC(x,y,z):
    print (x-y-z)

def doublePower(base,exp):
    print(2*base**exp)

def  RootFunc(inputDict):
    for k,v in inputDict.items():
        if v[0]==1:
            d[k] = addFunc(*v[1:])
        elif v[0] ==2:
            d[k] = subABC(*v[1:])
        elif  v[0]==3:
            d[k] = doublePower(*v[1:])


d={"s1_7":[1,5,2],"d1_6":[2,12,3,3],"e1_3200":[3,40,2],"s2_13":[1,6,7],"d2_30":[2,42,2,10]}
RootFunc(d)

#test to make sure key var assignment works
print(d)

我得到:

{'d2_30': None, 's2_13': None, 's1_7': None, 'e1_3200': None, 'd1_6': None}

我期望:

{'d2_30': 30, 's2_13': 13, 's1_7': 7, 'e1_3200': 3200, 'd1_6': 6}

怎么了?

半相关:我知道字典是无序的,但是python为什么选择了这个顺序呢?它是否通过随机化器运行密钥?

rew

print不返回值。它会返回None,因此每次调用函数时,它们都会打印到标准输出并返回None尝试将所有print语句更改return这样:

 def addFunc(x,y):
     return x+y

这会将值x+y返回给所谓的函数。

代码的另一个问题(除非您打算这样做)是,先定义一个字典d,然后在定义函数时使用的是该字典,d而不是“ input”字典:

def  RootFunc(inputDict):
    for k,v in inputDict.items():
        if v[0]==1:
            d[k] = addFunc(*v[1:])

您是否打算始终更改,d不是要迭代的字典inputDict

可能还存在其他问题(例如,函数中接受可变数量的参数),但是最好一次解决一个问题。


有关功能的其他说明:

这是一些伪代码,试图传达通常如何使用函数:

def sample_function(some_data):
     modified_data = []
     for element in some_data:
          do some processing
          add processed crap to modified_data
     return modified_data

函数被视为“黑匣子”,这意味着您可以对它们进行结构化,以便可以将一些数据转储到它们中,并且它们始终执行相同的工作,并且可以反复调用它们。它们将要么return值要么yield值,要么更新某个值或属性或某物(后者称为“副作用”)。目前,只需注意return声明即可。

另一个有趣的事情是函数具有“作用域”,这意味着当我仅使用伪名称作为参数来定义它时,我实际上不必具有一个名为“ some_data”的变量。我可以将我想要的任何内容传递给函数,但是在函数内部,我可以引用假名称并创建其他仅在函数上下文内才有意义的变量。

现在,如果我们在上面运行我的函数,它将继续处理数据:

 sample_function(my_data_set)

但这通常是毫无意义的,因为该函数应该返回某些内容,而我对返回的内容不做任何事情。我应该做的是将函数的值及其参数分配给某个容器,以便保留已处理的信息。

my_modified_data = sample_function(my_data_set)

这是使用函数的一种非常常见的方式,您可能会再次看到它。


解决问题的一种简单方法:

考虑到所有这些因素,这是一种解决您的问题的方法,该方法来自一种非常常见的编程范例:

def  RootFunc(inputDict):
    temp_dict = {}
    for k,v in inputDict.items():
        if v[0]==1:
            temp_dict[k] = addFunc(*v[1:])
        elif v[0] ==2:
            temp_dict[k] = subABC(*v[1:])
        elif  v[0]==3:
            temp_dict[k] = doublePower(*v[1:])
    return temp_dict


  inputDict={"s1_7":[1,5,2],"d1_6":[2,12,3,3],"e1_3200":[3,40,2],"s2_13":[1,6,7],"d2_30"[2,42,2,10]}
  final_dict = RootFunc(inputDict)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章