Python の Tips(1)

偉そうに”Tips”とか書いていますが,ただ自分がつまづいたところのメモ.ブログってそんなもんじゃないの…







小数のfor文

C++などでは比較的に簡単に実現できることですが,pythonだとそんな簡単にいかないようです.とはいっても,わかってしまえば簡単.こちらの方のやり方を学ばせていただきました.

[Python] range関数を小数にも拡張する – Yura YuWrite

該当部分を引用させていただきます.下のプログラムを実行すると,0以上1未満の数を,0から0.1刻みで表示されるかと思います(つまり,0.0, 0.1, 0.2…, 0.9).

for x in [0.1*n for n in range(10)]:
    print(x)

やり方としては,まず[0.1*n for n in range(10)]の部分で0.1刻みのリストを作成してくれています.「n in range(10)」という部分で「nという数は0から9までの整数」としてあり,それに0.1をかけた「0.1*n」をxに収める仕組みです.試しに

print( [0.1*n for n in range(10)] )

を実行してあげると,

[0.0, 0.1, 0.2, 0., 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]というリストが表示されるはずです.

というリストが表示されるはずです.

ちなみに,筆者の環境では

[0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9]

と表示されました.掛け算で丸め誤差が出てしまったのかと思われます.

少し複雑にはなってしまいますが一般化しますと…

[math]
\left[x以上y満の数を,xからz刻みで持ってきてリストにする\right]
[/math]

という指示は

[math]
\left[z*\mathrm{n}\hspace{1em}\mathrm{for}\hspace{1em}\mathrm{n}\hspace{1em}\mathrm{in}\hspace{1em}\mathrm{range}\left(\frac{y-x}{z}\right)\right]
[/math]

とできますね.

2進数変換

次の公式ドキュメントのリンクに方法がありました.組み込み関数としてデフォルトで準備されていたんですね.

http://docs.python.jp/3/library/functions.html#bin

例えば,20という文字を2進数で表す方法は次のようになります.

x = 20
print( bin(x) )

これを実行すると「0b10100」という結果になりました.冒頭の「0b」を除けば,確かに2進数に変換されていることがわかりますね.bin関数を用いて変換された2進数列には必ずこの「0b」が行頭についてきます.さらに注意していただきたいのは,bin(x)はstr型,つまり文字列になっています.

行頭の「0b」が邪魔な場合は,bin()で返されたものが文字列であることを利用すれば,次のようにして「0b」を落とせます.

x = 20
print( bin(x)[2:] )

型を返す

変数の型確認

Python は変数に使いたい値を代入するだけで型を推論してくれるのが特徴です.しかし,その便利さが牙をむくことがあります.整数のつもりで扱っていたが実は文字列だったとか.なので,いくら型に自由があるといっても型をしっかり把握しておくことは大事で,その確認法を知っておくととデバック時などに大変便利です.その際に用いるのがtype関数です.公式ドキュメントは次になります.

http://docs.python.jp/3/library/functions.html#type

公式の説明を見るよりも,次の例を見た方が明快かと思われます.

x = 20
print( type(x) )
print( type(bin(x)) )

これを実行すると,「(改行)」と表示されるでしょう.「x=20」という行により,xには整数20が入りました.なのでその型はintですね.そして bin は先ほど習った2進数変換関数で,確かに出力された方が文字列型(str)になっています.

パディング(詰め物)

必要になり調べていたところ,こちらのサイトにそりゃもうきれいにまとまってて,とても助かりました.Nicestとか書いてるし.

Nicest way to pad zeroes to string – Stack Overflow

数字の場合

例えば,34という数字に整数の左に0を詰めてみましょう.

x =34
y = '{0:04d}'.format(x)
print(y)

実行すると「0034」となります.formatの中の引数はx一つなので,formatの手前にある{0}という部分にxが入ります.{0:04d}となっているのは,詰め物の設定になります.詰め物の設定を表すため0の次にコロン(:)を書いていて,それ以降はどのような形で出力するかの詳細です.「04d」という設定で「0という数字を詰めて,4桁の整数(digit)の形で」出力するよう設定しているようです.あくまで「詰め物」であるので,元の数字が変わらないようにするためには詰め物は0でいけないことに気を付けましょう.詰め物として「2」という数字を使おうとして次のようなプログラムを書くとエラーになります.

x =34
y = '{0:24d}'.format(x)
print(y)

このようにすると,24文字の変数yが作成され,22文字目までは空で23,24文字目に3,4が収まった「 34」が出力されてしまうので注意しましょう.

また,このformatで数字のパディングをする場合は,英語の文字のパディングも禁止されます.formatを使った数字のパディングは,あくまでも数字の意味を変えずに表示する際の詰め物を入れるだけなので注意しましょう.

x =34
y = '{0:24d}'.format(x)
print(y)

「正しく動かない例,その1」で気づかれた方もいらっしゃるかと思いますが,0を詰めずに空白を詰めて列をそろえたい場合は,次のようにすればよいです.

x =34
y = '{0:4d}'.format(x)
print(y)

また,formatを使いパディングしてしまうと,もはや数字でなく文字列型となってしまうので気を付けましょう.

小数を含む数字をパディングする際には,先ほどの「d(diget)」部分を「f(float)」に変えてあげればよいです.例を見ましょう.

x =12.3
y = '{0:8.3f}'.format(x)
print(y)

これの出力結果は「 12.300」になります.{0:8.3f}の最初の0はformatの最初の引数が入る場所のことで,さっきと同じです.その次の「8.3f」というのは「数字(float)を表す文字列の長さを8文字分用意するけど,そのうち3文字分は小数点以下として確保しておいて」という意味です.出力には前に2つの空白があることと,小数点も一文字分にカウントされていることに気を付けましょう.

小数点を含む数字でも,整数部分に0を詰めたいときには次のように変更するだけでオッケーです.

x =12.3
y = '{0:08.3f}'.format(x)
print(y)

これの出力結果は「0012.300」になります.空白部分が0で埋められてますね.

文字列の場合

先ほどのリンクで文字列の左側に0をパディングする方法が載っているので,そちらを見てみます.

Nicest way to pad zeroes to string – Stack Overflow

x = '右寄せ'
y = x.zfill(7)
print(y)

これを実行すると「0000右寄せ」と表示されます.「x.zfill(7)」とすることで「xに入っている文字列の長さが7になるように,左側をゼロで詰めなさい」という指示になります.もちろん7の部分は好きな整数に変更可能です.zfillはzeroでfillするということですね.

しかし,上の方法では0しかパディングできません.空白でパディングに用いる際は先ほど学んだ「format」を使うことで実現できます.

x = '右寄せ'
y = '{0:>12}'.format(x)
print(y)

実行結果は「 右寄せ」となります.左に空白が9こあるのがポイントです.{0:>12}の「>12」という部分で「右寄せ(>)して12文字の文字列にしましょう(余ったとこは空白)」という指示になります.

同様に(あまりないかもしれないですが)左寄せのパディングも簡単にできます.向きを右(>)から左(<)に変えるだけです. [python] x = '左寄せ' y = '{0:<12}'.format(x) print(y) [/python] パディングに用いる文字を指定したい場合は,その文字をコロン(:)と右寄せか左寄せかのマーク(> or <)の間にその文字を入れてあげればよいです. 例として,次のプログラムを見てみましょう. [python] x = '右寄せ' y = '{0:a>12}'.format(x) print(y) [/python] 実行結果は「aaaaaaaaa右寄せ」となり,確かにaという文字が埋められています. その他の詳しいformatの使い方は次の公式ドキュメントが参考になるのではないかと思います. 6.1.3.1. 書式指定ミニ言語仕様 – Python 公式ドキュメント

float の精度

数値計算をやる場合にはその計算精度が問題になることがありますが,pythonで用いる浮動小数点(float)はデフォルトで倍精度になっています.Pythonにおける浮動小数点については次の公式ドキュメント(日本語)で議論されているので,気になる方はこちらを見ていただければと思います.

15. 浮動小数点演算、その問題と制限 – Python 公式ドキュメント

このブログについて

IAtLeX です.ブログをはじめてさほど時間がたっていないので,未熟な内容が多々あるかと思いますが,それも時間が解決してくれるはず...Python系の記事を着々と充実させていきたいです.投稿主についてはこちらを参照してください.

このブログについて - http://iatlex.com/about_blog/

コメントを残す

*