最近(2020年初め)インストールした Lubuntu 19.10 では旧版(2.7)と新版(3.7)の2つが入っていた。他に m が付いた物は何だろう…
$ which python /usr/bin/python $ which python3 /usr/bin/python3 $ python -V Python 2.7.17 $ python3 -V Python 3.7.5 $ ls -l /usr/bin/python* lrwxrwxrwx 1 root root 7 10月 10 2019 /usr/bin/python -> python2 lrwxrwxrwx 1 root root 9 10月 10 2019 /usr/bin/python2 -> python2.7 -rwxr-xr-x 1 root root 3702800 11月 7 2019 /usr/bin/python2.7 lrwxrwxrwx 1 root root 9 10月 2 2019 /usr/bin/python3 -> python3.7 -rwxr-xr-x 2 root root 5102632 4月 20 05:18 /usr/bin/python3.7 -rwxr-xr-x 2 root root 5102632 4月 20 05:18 /usr/bin/python3.7m lrwxrwxrwx 1 root root 10 10月 2 2019 /usr/bin/python3m -> python3.7m
・始めた頃 の雑記
← (2018-5-14) 中古で購入。第3版とは本の版。Python の版対応は 2.x。
書店で軽く見て決めた。言語解説に関しては良いと思う。
|
Python 標準ライブラリ - Python 3.7.7 ドキュメント
それらしく分類:
中々盛り沢山。
学習を兼ねて速度測定。
雛形はこんな感じらしい。↓
import sys; by = sys.stdin.read() print(by)
$ ls -l / | python xxx.py total 88 lrwxrwxrwx 1 root root 7 10月 17 2019 bin -> usr/bin drwxr-xr-x 3 root root 4096 6月 30 06:05 boot drwxr-xr-x 19 root root 4220 7月 2 12:25 dev drwxr-xr-x 135 root root 12288 7月 2 23:11 etc drwxr-xr-x 3 root root 4096 3月 15 02:37 home …
外部ライブラリ OpenPyXL を使用。Python を学ぼうと考えた切っ掛けはこれ。
でもあくまで Excel形式のブック(ワークシート)を対象とするものであって、決して表計算ソフト(MS Excel等)を扱うものではない。
さらに数式処理は全く扱えないので少々落胆。
関わりのあった表計算ソフトCalcを含む LibreOffice の諸々。
国税庁が定める、(課税される)所得額と税額は次の折れ線関数グラフのようになっている(所得額900万円まで表示)。
これは所得額で係数が変わる簡単な y = ax - b の式。
申告の手引き等に説明してある下の表。
右側が Excel の数式で実現した様子。
Excel の数式はやっぱり醜い。そもそも某は頭の中で処理内容をイメージしないと書けない。と言う訳でイメージを Python で書いたのが下記。
1 def calc_tax(income): 2 if income < 1_000: return 0, 0 3 if income < 1_950_000: return 0.05, 0 4 if income < 3_300_000: return 0.10, 97_500 5 if income < 6_950_000: return 0.20, 427_500 6 if income < 9_000_000: return 0.23, 636_000 7 if income < 18_000_000: return 0.33, 1_536_000 8 if income < 40_000_000: return 0.40, 2_796_000 9 10 return 0.45, 4_796_000 # 4千万以上の高所得者の方。 11 12 13 v = 1_951_000 14 k = calc_tax(v) 15 print(v * k[0] - k[1])
関数が係数と調整額をタプルで返す。
細かい処を言えば、1000円単位に丸める処理が必要だが…
if の連発は直感的、且つ、効率良いと思うが、メンテナンスが宜しくない。
ので、表をリストで定義し、for で探す。
t = [( 1_000, (0, 0)), ( 1_950_000, (0.05, 0)), ( 3_300_000, (0.10, 97_500)), ( 6_950_000, (0.20, 427_500)), ( 9_000_000, (0.23, 636_000)), (18_000_000, (0.33, 1_536_000)), (40_000_000, (0.40, 2_796_000))] for x in t: if income < x[0]: return x[1] return 0.45, 4_796_000
ここまで書くと、表をデータとして検索メソッドを備えるクラス化が自然。 なお、リストは大きい額から並べ、該当しない場合は小額=無税、となるようにする。
class NationalTax: """ 国税計算 """ def __init__(self): self.point_list = [ # 課税所得 係数 調整額 (40_000_000, (0.45, 4_796_000)), (18_000_000, (0.40, 2_796_000)), ( 9_000_000, (0.33, 1_536_000)), ( 6_950_000, (0.23, 636_000)), ( 3_300_000, (0.20, 427_500)), ( 1_950_000, (0.10, 97_500)), ( 1_000, (0.05, 0))] def calc(self, income): """ 課税所得から税額を求める。""" x = NationalTax.round1000(income) ab = (0, 0) for t in self.point_list: if t[0] <= x: ab = t[1] break return int(x * ab[0] - ab[1]) # y = ax - b @staticmethod def round1000(income): """ 1,000円単位に丸め """ return int(income) // 1000 * 1000
良くある hexdump -C 風のダンプ出力。
lsb_release - LSB(Linux Standard Base)情報
print関数の説明は次で始まっている。
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
5つの引数を採るように見えるが、最初の *objects とは可変個引数の意味。
>>> print('p1', 'p2', 'p3') p1 p2 p3
そういう訳で sep 以降はキーワード引数と呼ばれ、引数の意味を指示しないといけない。
>>> print('p1', 'p2', 'p3', sep=',') p1,p2,p3 >>> print('p1', 'p2', 'p3', ',') ...... これは間違い!(意図と違う) p1 p2 p3 ,
キーワードのおかげで引数の順序を入れ替えても構わないようだ(でも感心できないが…)
>>> print('p1', 'p2', 'p3', end='。', sep=',') p1,p2,p3。>>>
ややこしく見える例を見かけた。
... for base in 'dXob': ... print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ') ... print()