2014-03-31 111 views
0

我想返回两个字典。 person_to_friends和person_to_networks被赋予函数,而profiles_file是一个文本文件。 我写的是:python返回两个字典

def load_profiles(profiles_file, person_to_friends, person_to_networks): 
    """ 
    (file, dict of {str : list of strs}, dict of {str : list of strs}) -> NoneType 
    Update person to friends and person to networks dictionaries to include 
    the data in open file. 
    """ 
    profiles_file = open('data.txt', 'r') 
    person_to_friends = person_to_friends(profiles_file) 
    person_to_networks = person_to_networks(profiles_file)  
    return person_to_friends, person_to_networks 

这只是给了我person_to_friends dictionary..Could任何人都可以帮助这个问题? 我想回报

{person_to_friends} {person_to_networks}

+2

你是怎么看'load_profiles()'调用的结果的? – alecxe

+3

您是否尝试过[如此](http://stackoverflow.com/a/9752970/1167750)获取回报? – summea

+0

[我如何从Python函数返回两个值?](http://stackoverflow.com/questions/9752958/how-can-i-return-two-values-from-a-function-in -python) –

回答

2

简单地做:

return (person_to_friends, person_to_networks) 

,当你调用函数你需要联合国打包返回值:

person_to_friends, person_to_networks = load_profiles(var1, var2, var3) 
+3

'return(a,b)'与'return a,b'相同,它是创建元组的逗号,而不是括号。 – Akavall

+0

它给了我相同的结果。我想要返回的是>>> {字典1} >>> {字典2} – user3477470

+0

你所要求的是不可能直出的,如果框。你需要返回两个字典的元组,然后你可以将这些字典处理成你想要的格式。 –

0

你是返回两个库的方式是好的,有趣的东西必须在代码的其他部分继续,如果你删除它们,一切工作正常:

def load_profiles(): 
    person_to_friends = {'a' : 1} 
    person_to_networks = {'b' : 2}  
    return person_to_friends, person_to_networks 

结果:

>>> load_profiles() 
({'a': 1}, {'b': 2}) 
>>> dict_1, dict_2 = load_profiles() 
>>> dict_1 
{'a': 1} 
>>> dict_2 
{'b': 2} 
0

你的文档字符串指出,函数参数person_to_friends

字典的{STR:STR的名单}

但后来你怎么称呼它,仿佛它是一个函数,并用结果改写它:

person_to_friends = person_to_friends(profiles_file) 

这是在一个错误文档字符串或代码?

可能是通过拥有一个本地定义的同名变量(即参数)来掩盖真正的函数定义。一般来说,用另一种截然不同的类型(例如dict)覆盖一种类型的变量(例如function)是不好的做法 - 尽管也有例外。

1

你只能返回一个值(这个值可以是一个元组,就像你的情况一样)。

def load_profiles(profiles_file, person_to_friends, person_to_networks): 
    """ 
    (file, dict of {str : list of strs}, dict of {str : list of strs}) -> NoneType 
    Update person to friends and person to networks dictionaries to include 
    the data in open file. 
    """ 
    profiles_file = open('data.txt', 'r') 
    person_to_friends = person_to_friends(profiles_file) 
    person_to_networks = person_to_networks(profiles_file)  
    yield person_to_friends # you can do it without temp variable, obv. 
    yield person_to_networks 

不同的是,与yield说法你不建立一个临时的元组只是在一次返回两个结果:但是,您可以根据您的需要得到尽可能多的价值。然而,得到的值出你的“功能”(即成为一台发电机)会稍微困难:

profiles = load_profiles(your args) 

不会真正运行的功能的话,那只是初始化发电机。要真正获得的价值,您需要:

person_to_friends = next(profiles) 
person_to_networks = next(profiles) 

或者只是做一个循环:

for result in load_profiles(your args): 
    do_something_with_your_dictionaries 

所以你的函数会返回一个值:初始化生成对象。在循环中迭代它(它可以是for循环,map,filter,list(your_generator)或其他)或者只是调用next(your_generator)会给你两个实际需要的字典。

+0

感谢您的意见。那么,我试过这段代码,但是这段代码并没有给我两个字典。它只给<发生器对象load_profiles 0x101448050> – user3477470

+0

您需要将此传递给一个循环或者只需调用next()来获得一个字典,就像我在这里所说的那样。 – x3al