Home / Python 始めました

最近(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 クックブック 第2版 (クックブック == サンプル集)

マニュアル
Python ドキュメント(www)
Python ドキュメント(ローカル)
ライブラリのソース
$ ls /usr/lib/py*
主に /usr/lib/python3.7 下に置かれていた。

$ find /usr/lib/python2.4/ -name '*.py' -print | xargs grep 'xxx'

その他の記事
Python: ファイル読み込み時の例外の扱い例 -- try、except、else、finallyブロック

基礎知識

標準ライブラリ

Python 標準ライブラリ - Python 3.7.7 ドキュメント

それらしく分類:
PythonLib.png(87461 byte)

文字列

中々盛り沢山。

辞書 dict

学習を兼ねて速度測定。

クラス

関数を class で包むような風貌
右端に :

クラスメソッド
第一引数に self 等が必須。使わなくても…

クラスメンバ
C++ や Java, C# のノリで宣言すると、それは共有されてしまう。
何しろ使いたい時に self.value = 0 のようにする?
クラスのデータを把握し難い…
排他処理?

標準入力

雛形はこんな感じらしい。↓

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
…

表計算

Excelワークシートを扱う

外部ライブラリ OpenPyXL を使用。Python を学ぼうと考えた切っ掛けはこれ。
でもあくまで Excel形式のブック(ワークシート)を対象とするものであって、決して表計算ソフト(MS Excel等)を扱うものではない。 さらに数式処理は全く扱えないので少々落胆。

LibreOffice

関わりのあった表計算ソフトCalcを含む LibreOffice の諸々。

・テーブル構造

国税庁が定める、(課税される)所得額と税額は次の折れ線関数グラフのようになっている(所得額900万円まで表示)。
tax_function_box.png(17666 byte)

これは所得額で係数が変わる簡単な y = ax - b の式。 申告の手引き等に説明してある下の表。 右側が Excel の数式で実現した様子。
tax_table.png(16649 byte)

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 風のダンプ出力。


お勉強: tree/du

Tree コマンドもどき (walktree)


lsb_release - LSB(Linux Standard Base)情報

lsb_release - LSB(Linux Standard Base)情報


Pythonでメール送信


マニュアルページの見方

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()

Home / Python 始めました

© 2008 usskim    http://usskim.web.fc2.com/
inserted by FC2 system