2016-06-26 18 views
-1

str.zfill(x)は、 `x文字より小さい文字列を返すことができることに気付きました。例:ゼロ埋め込みzfill関数のバグ?

>>> "%.2x".zfill(8) % 255 
'0000ff' 
>>> "%.2x".zfill(8) % 256 
'0000100' 

この奇妙な動作はどのように説明されますか?

答えて

3

動作は正しいです。 zfill(x)自体は、少なくとも元の文字列と少なくとも同じ長さで少なくともx文字の文字列を返します。 ffは、あなたがより少ない文字で終わる%.2xよりも短いので

>>> "%.2x" % 255 
'ff' 

それは短い文字列で%.2fを置き換えることによって、それをを短縮さ%です。 %.2xは手つかずのままと%への以降の呼び出しはちょうどff文字列を短くして、それを置き換えるあなたが見ることができるよう

>>> "%.2x".zfill(8) 
'0000%.2x' 

zfillは、このように、フォーマット指定子とについて何も知らないことに注意してください。

あなたはその後zfillを呼び出す必要があり:

>>> "%08.2x" % 255 
'000000ff' 

0は次のとおりです。

>>> ("%.2x" % 255).zfill(8) 
'000000ff' 
また

はあなたがzfill callinf避けることができ、文字列フォーマットですべてをやっていることに注意してください文字列の幅は8です。


サイドノート:8の合計幅の両方を指定すると2の精度は、実際に無駄です。 .2xを指定するだけで効果が16未満の数字の前に0を追加することです:

>>> "%.2x" % 5 
'05' 
>>> "%.2x" % 10 
'0a' 

数字が大きくされている場合には効果がありません。

>>> "%.2x" % 16 
'10' 
>>> "%x" % 16 
'10' 

8ゼロとにかく0が追加されるので、フォーマット指定子%08.2xはちょうど%08xに相当します。

関連する問題