2016-09-01 9 views
0

O'ReillyのPythonを学ぶ強力なオブジェクト指向プログラミングMark Lutzは、文字列を書式設定するさまざまな方法を教えています。文字列のフォーマット混乱

次のコードは私を混乱させるものです。私は 'ham'と解釈して、フォーマット・プレース・マーカをインデックス0で埋めていますが、まだ出力された文字列のインデックス1でポップアップします。実際に何が起こっているのか理解してください。ここで

はコードです:

template = '{motto}, {0} and {food}' 
template.format('ham', motto='spam', food='eggs') 

そして、ここでは、出力されます。

'spam, ham and eggs' 

私は予想:

'ham, spam and eggs' 
+0

あなたはちょっと混乱していると思います。あなたがしたことは正しいです。 'ham'は '{0}'を置き換えるインデックスゼロです。したがって、{モット}、{0}と{食べ物} ' - ' {モットー}、ハムと{食べ物} '。 – kojiro

+0

"私は 'ham'をフォーマット・プレース・マーカにインデックス0で入力していると解釈しています。" - いいえ、プレースホルダには0が入っています。 – user2357112

+0

[pyformat.info](https://pyformat.info)を見てください。 –

答えて

2

あなたが理解しなければならない唯一のことは、{0}が参照していることです初回まで(ゼロ)無名アゲームntはformat()に送信されました。我々は、すべての無名の参照を削除し、線形フィル・インを使用しようとすることで、これはケースのように見ることができます。

>>> "{motto}".format("boom") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'motto' 

あなたは、これはそれがどのように動作するかが「ブーム」が「モットー」に記入することを期待します。しかし、代わりにformat()はという名前のパラメータを探します。ここでの重要なヒントはKeyErrorです。ここで

>>> "{0} {1}".format('ham', motto='eggs') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: tuple index out of range 

は、format()は、パラメータリストの2番目の無名の引数を探しています - それは」doesnの:同様に、それはちょうどformat()に渡されたパラメータの順序を取っていたならば、これはどちらか、エラーではないでしょう存在しないので、 '範囲外のタプルインデックス'エラーが発生します。これは、Pythonで渡される名前のない(位置的に敏感な)引数と名前付き引数の違いに過ぎません。

See this post to understand the difference between these types arguments, known as 'args' and 'kwargs'.

+0

名前のない引数の説明が0件分わかりました。ありがとうございました。私が思い出したように、この本はキーワードと位置の両方を使用していると言われています。 –