2012-07-30 101 views
0

,我从深入Python这样的代码:深入Python输出错误

def buildConnectionString(params): 
    """Build a connection string from a dictionary of parameters. 
    Returns string.""" 
    return ";".join(["%s=%s" % (k, v) for k, v in params.items()]) 
if __name__ == "__main__": 
    myParams = {"server":"mpilgrim", \ 
       "database":"master", \ 
       "uid":"sa", \ 
       "pwd":"secret" \ 
       } 
    print buildConnectionString(myParams) 

书中说,它的输出应该是:

server=mpilgrim;uid=sa;database=master;pwd=secret 

但是当我运行它,它在问世反向:

pwd=secret;database=master;uid=sa;server=mpilgrim 

任何想法为什么?

+2

对这里的风格有2条评论。 1-用于续行的反斜杠是不必要的。 2-列表理解可以简单地通过删除方括号变成一个生成器。 (例如'';'。join(“%s =%s”%(k,v)for k,,in params.items())' – mgilson 2012-07-30 13:46:13

+2

另外,PEP8主张强调分隔的函数名称,而不是骆驼大小写('build_connection_string '和'my_params',而不是'buildConnectionString'和'myParams')。没有必要,但是在Python中工作时,坚持使用PEP8通常会让生活变得更轻松。 – 2012-07-30 13:49:26

+0

@ sr2222 - PEP8 – mgilson 2012-07-30 13:50:06

回答

7

事实上,它是完全相反的顺序实际上只是一个巧合。用不同版本/实现的python运行代码,你可能会得到不同的顺序。原因是因为在python字典中没有排序,所以函数的输出顺序没有很好的定义。 (你把这些东西放到字典中的顺序并不是它们在迭代字典时被放弃的顺序)。

如果你想要一个特定的顺序,可以使用内置sorted功能(可选使用key关键字告诉sorted如何对项目进行排序)排序parames.items()。另一种选择是使用Python2.7中出现的collections模块中的OrderedDict(正如sr2222所指出的那样)。

3

因为您正在打印字典,并且字典无序。字典迭代的顺序取决于许多因素,包括解释器类型,解释器版本和操作系统。如果您希望它按照您输入的相同顺序出现,则必须改用collections.OrderedDict。或者,正如mgilson在他的回答中所说的那样,在打印字典内容之前,您可以对字典内容进行排序,但鉴于您想要的顺序不是按字母顺序排列,可能比它的价值更麻烦。