リーダブルコードのどこかの章で「たまには15分くらいかけてドキュメントに目を通すといい」みたいなことが書かれていた気がするので、Python 標準ライブラリ( Python 標準ライブラリ — Python 3.6.5 ドキュメント ) に目を通す。ざっとpython・C++・C#のドキュメントに目を通したい。
数値
x = 2 y = 3 print("x と y の商",x/y) print("x と y の商を切り下げたもの", x//y) print("剰余", x%y) print("複素数", complex(x, y)) print("共役複素数", complex(x,y).conjugate()) print("乗数", x**y) print("尚・剰余", divmod(x, y))
x と y の商 0.6666666666666666 x と y の商を切り下げたもの 0 剰余 2 複素数 (2+3j) 共役複素数 (2-3j) 乗数 8 尚・剰余 (0, 2)
浮動小数点数(float)
a.is_integer()
は整数の場合のみTrue
float.fromhex("~")
の引数にはスペースが含まれていても実行される
a = 2.0 b = 2.1 print("整数か?", a.is_integer()) print("16 進文字列表現", b.hex()) print("16 進文字列表現からfloat型へ", float.fromhex("0x1.0cccccccccccdp+1"))
整数か? True 16 進文字列表現 0x1.0cccccccccccdp+1 16 進文字列表現からfloat型へ 2.1
リスト(list), タプル(tuple), レンジ(range)
s[0:100:10]
はインデックス0〜100を10
刻みで取得s.index(19, 10, 20)
はインデックス10〜20の範囲で19
がある箇所のインデックスを返します。s.count(0)
は0
がs
の中に出現した回数を数え上げるin
はstr
やbytearray
の部分列の判定にも利用できる
# 0~99までのリスト s = [i for i in range(100)] print("0 in s", 0 in s) print("100 in s", 100 in s) print("s * 2", len(s*2)) print("s[0:100:10]", s[0:100:10]) print("s.index(19, 10, 20)", s.index(19, 10, 20)) print("s.count(0)", s.count(0))
0 in s True 100 in s False s * 2 200 s[0:100:10] [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] s.index(19, 10, 20) 19 s.count(0) 1
s.clear()
はs
の要素を全て削除するt.reverse()
はt
の順番を逆にする
# 0~99までのリスト s = [i for i in range(15)] t = [j for j in range(15)] # 要素を全て削除する s.clear() print("空リスト", s) # 順番を逆転させる t.reverse() print("t", t) # 0~10の要素を二つ飛ばしで削除 del t[0:10:2] print("t[0:10:2]", t)
空リスト [] t [14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] t[0:10:2] [13, 11, 9, 7, 5, 4, 3, 2, 1, 0]
リストのソートについては以下のドキュメントを参照。
ソート HOW TO — Python 3.6.5 ドキュメント
文字列
文字列を編集する
置き換え・スペースで埋める・大文字や小文字に変換するなど。
sample.rpartition(".")
は文字列を末尾から見て、初めに発見した文字列.
で文字列を区切ってリストにして返す。このようなr~
(文字列を末尾から見る)の関数もいくつか存在する
# 文字列 sample = "abcd_EFGH_ijkl_ABcd.csv" print("初めの一文字を大文字にする:", sample.capitalize()) print("全て小文字にする:", sample.casefold()) print("中央寄せして残りをスペースで埋める:", sample.center(30)) print("左寄せして残りをスペースで埋める:", sample.ljust(30)) print("文字列のフォーマット:", "サンプル {0}".format(10*10)) print("文字列の置換, csvをmdに:", sample.replace(".csv", ".md")) print("文字列を初めに発見したdotで区切る:", sample.partition(".")) print("文字列を最後に発見したdotで区切る:", sample.rpartition(".")) print("文字列を指定した文字で区切ってリストにする:", sample.split("_"))
初めの一文字を大文字にする: Abcd_efgh_ijkl_abcd.csv 全て小文字にする: abcd_efgh_ijkl_abcd.csv 中央寄せして残りをスペースで埋める: abcd_EFGH_ijkl_ABcd.csv 左寄せして残りをスペースで埋める: abcd_EFGH_ijkl_ABcd.csv 文字列のフォーマット: サンプル 100 文字列の置換, csvをmdに: abcd_EFGH_ijkl_ABcd.md 文字列を初めに発見したdotで区切る: ('abcd_EFGH_ijkl_ABcd', '.', 'csv') 文字列を最後に発見したdotで区切る: ('abcd_EFGH_ijkl_ABcd', '.', 'csv') 文字列を指定した文字で区切ってリストにする: ['abcd', 'EFGH', 'ijkl', 'ABcd.csv']
条件分岐
文字の数え上げ・含み判定など。
sample.find(".txt")
はsample
にtxt
が含まれていればそのインデックスを返し、ない場合は-1
を返す- インデックスを知る必要がない場合以外は基本的に
in
を使用する
- インデックスを知る必要がない場合以外は基本的に
sample.endswith(".csv")
は末尾が指定した文字列.csv
なら真になる
# 文字列(str) sample = "abcd_EFGH_ijkl_ABcd.csv" print("文字列の出現回数を数え上げる:", sample.count("cd")) print("末尾が.csvなら真:", sample.endswith(".csv")) print("文字列.csvがあるインデックスを返す:", sample.find(".csv")) print("> 見つからない場合は-1になる:", sample.find(".txt")) print("> インデックスを知る必要がない場合はinを使う:", ".txt" in sample) print("全て英文字ならTrue:", sample.isalpha()) print("全て英文字ならTrue:", "aaaa".isalpha()) print("全て数字ならTrue:", sample.isdigit()) print("全て数字ならTrue:", "12345".isdigit())
文字列の出現回数を数え上げる: 2 末尾が.csvなら真: True 文字列.csvがあるインデックスを返す: 19 > 見つからない場合は-1になる: -1 > インデックスを知る必要がない場合はinを使う: False 全て英文字ならTrue: False 全て英文字ならTrue: True 全て数字ならTrue: False 全て数字ならTrue: True
集合(set)
# 集合を作る set_2n = set([i*2 for i in range(30)]) # 2の倍数を30個 set_3n = set([i*3 for i in range(30)]) # 3の倍数を30個 set_minus2n = set([i*-2 - 2 for i in range(30)]) # -2の倍数を30個 print("2N:", set_2n) print("3N:", set_3n) print("-2N:", set_minus2n)
2N: {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58} 3N: {0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87} -2N: {-60, -58, -56, -54, -52, -50, -48, -46, -44, -42, -40, -38, -36, -34, -32, -30, -28, -26, -24, -22, -20, -18, -16, -14, -12, -10, -8, -6, -4, -2}
条件分岐
print("要素数", len(set_2n)) set_4n = set([i*4 for i in range(4)]) # 4の倍数を4個 # 条件分岐 print("要素が存在するか?:", 10 in set_2n, 11 in set_2n) print("互いに素の時のみ真:", set_2n.isdisjoint(set_3n), set_2n.isdisjoint(set_minus2n)) print("部分集合なら真:", set_4n.issubset(set_2n))
要素数 30 要素が存在するか?: True False 互いに素の時のみ真: False True 部分集合なら真: True どちらかに含まれる要素: {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58}
演算
# 演算 print("どちらかに含まれる要素:", set_2n | set_4n) print("共通要素:", set_2n & set_4n) print("set_4nの要素を消す:", set_2n - set_4n) print("一方だけに含まれる要素:", set_2n ^ set_4n)
共通要素: {0, 8, 4, 12} set_4nの要素を消す: {2, 6, 10, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58} 一方だけに含まれる要素: {2, 6, 10, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58}
辞書(dict)
dict型のドキュメントより引用すると以下の記述は全て同じものになる。
# https://docs.python.jp/3/library/stdtypes.html#dict より引用 a = dict(one=1, two=2, three=3) b = {'one': 1, 'two': 2, 'three': 3} c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) d = dict([('two', 2), ('one', 1), ('three', 3)]) e = dict({'three': 3, 'one': 1, 'two': 2}) a == b == c == d == e >>> True