2012-03-06 10 views
1

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 

をしかし、 :

01:

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

皆さん、ありがとうございました。 – naftalimich

答えて

1

、あなたはシーケンスを作成するために、ジェネレータ式を使用しています'pwd_secret'のような文字列のうち、 '&'が補間されます。

2番目のケースでは、'pwd_secret'などの各文字列でjoinを呼び出しています。文字列はシーケンスの一種なので、joinはそれを実行します。これは渡されたシーケンスの各要素の間にセパレータを置きます。

1

文字列メソッドjoinは文字列で動作し、iterableを引数として取ります。アンパサンドによって接合された各文字で出てくる

print '&'.join('pwd_secret') 

:2番目の例では、あなたが渡しているのiterableはと同等の文字列で、

p&w&d&_&s&e&c&r&e&t 
1

あなたが期待するように第1のケースで動作します - 各タプルに&で参加します。第2のケースで

、あなたが持っている:

(たとえば)最初のアイテムのために、だろう、
print "&".join("%s_%s" % (i,y)) 

print "&".join("pwd_secret") 

文字列は反復可能なので、参加するだろう文字列内の各文字は&となり、出力が示されます。

3

str.joinは順番に機能します。最初のコードでは一連の文字列を処理し、2番目のコードではループごとに1つの文字列しか処理しません。文字列自体(文字の)配列されているので、...拡大

>>> " ".join(["Hello", "world!"]) 
'Hello world!' 
>>> " ".join("Hello world!") 
'H e l l o w o r l d !' 
3

あなたの最初のケースは、実際にはこれです:最初のケースで

temp_list = list() 
for i,y in params.items(): 
    temp_list.append('%s_%s' % (i,y)) 
print '&'.join(temp_list) 
関連する問題