我的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选择了这个命令?它是通过随机函数运行的吗?
答案 0 :(得分:12)
print
不会返回值。它返回None
,因此每次调用函数时,它们都会打印到标准输出并返回None
。尝试将所有print
语句更改为return
,如下所示:
def addFunc(x,y):
return x+y
这会将值x+y
返回给调用函数的任何内容。
您的代码的另一个问题(除非您打算这样做)是您定义字典d
然后在定义函数时,您正在处理此字典d
而不是字典那是'输入':
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)
答案 1 :(得分:2)
正如erewok所说,你使用的是“打印”,而不是“返回”,这可能是你错误的根源。就排序而言,你已经知道字典是无序的,至少根据python doc,排序不是随机的,而是实现为散列表。
摘自python doc:[...]映射对象将可哈希值映射到任意对象。映射是可变对象。目前只有一种标准的映射类型,即字典。 [...]
现在关键是元素的顺序不是真正随机的。我经常注意到无论我如何在某些值上构造字典,顺序都保持不变...使用lambda或者直接创建它,顺序总是保持不变,所以它不能是随机的,但它绝对是随心所欲。