在python解释器中,我输入以下代码:
params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secre
t"}
print "&".join("%s_%s" % (i,y) for i,y in params.items())
而且,可以理解的是,我得到以下输出:
pwd_secret&database_master&uid_sa&server_mpilgrim
但是当我运行以下代码时:
for i,y in params.items():
print "&".join("%s_%s" % (i,y))
我得到了这个奇怪的输出:
p&w&d&_&s&e&c&r&e&t
d&a&t&a&b&a&s&e&_&m&a&s&t&e&r
u&i&d&_&s&a
s&e&r&v&e&r&_&m&p&i&l&g&r&i&m
两个代码块似乎都做同样的事情。为什么输出不同?
答案 0 :(得分:3)
str.join
适用于序列。在第一段代码上,它处理一系列字符串,而在第二段上,它每个循环只处理一个字符串。字符串是(字符)序列本身,所以......
>>> " ".join(["Hello", "world!"])
'Hello world!'
>>> " ".join("Hello world!")
'H e l l o w o r l d !'
答案 1 :(得分:3)
您扩展的第一个案例实际上就是:
temp_list = list()
for i,y in params.items():
temp_list.append('%s_%s' % (i,y))
print '&'.join(temp_list)
答案 2 :(得分:1)
字符串方法join
对字符串进行操作,并将iterable作为参数。在第二个示例中,您传递的可迭代是一个字符串,相当于:
print '&'.join('pwd_secret')
每个字母由&符号连接出来:
p&w&d&_&s&e&c&r&e&t
答案 3 :(得分:1)
第一个案例按预期工作 - 用&。
加入每个元组在第二种情况下,你有:
print "&".join("%s_%s" % (i,y))
对于第一个项目(例如),将执行以下操作:
print "&".join("pwd_secret")
字符串是可迭代的,因此它会将字符串中的每个字符与&连接起来,从而显示输出。
答案 4 :(得分:1)
在第一种情况下,您使用生成器表达式来创建一个字符串序列,如'pwd_secret',在这些字符串之间插入'&'。
在第二种情况下,您在'pwd_secret'
之类的每个字符串上调用join;字符串是一种序列,因此join执行它所做的事情,它将分隔符放在传递给它的序列的每个元素之间。