めも

これはメモ。

Python 標準ライブラリの組み込み関数のメモ

リーダブルコードのどこかの章で「たまには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)0sの中に出現した回数を数え上げる

  • instrbytearrayの部分列の判定にも利用できる

#  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")sampletxtが含まれていればそのインデックスを返し、ない場合は-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