Pythonの勉強
Python入門にあたってメモした。
モジュール
import random |
モジュールのインポート |
import random, math |
複数インポート |
[my_module.py] def func(v): return v * 2;
[main.py] import my_module print(my_module.func(1)) |
モジュールの作成 |
from random import randint, choice randint(0, 10) |
モジュールの一部読み込み |
import random as rd |
rdという別名でrandomを読み込む |
モジュールパスを追加: PYTHONPATH 変数に追加
演算
代入
a, b, c = 1, 2, 3 |
a == 1 |
d = (1, 2) e, f = d |
e == 1 |
p = (1, (10, 100)) |
q == 1 |
割り算
/ |
小数型で計算 |
// |
整数型で計算 |
divmod(a, b) |
商と剰余を計算 (a//b, a%b) |
べき乗
** |
べき乗を計算 |
pow(a, b, c) |
a ^ b % c |
データ型
type(a) |
データ型を取得 |
リテラル
b'0000' |
バイト型 |
端数処理
round(a, b) |
aを小数b桁未満を丸める |
基数変換
bin(b) |
2進数で表示(0b111) |
hex(x) |
16進数で表示(0xfff) |
oct(o) |
8進数で表示(0o777) |
入出力
入力 |
出力 |
print('string') |
string |
print(1, 2, 3.5) |
1 2 3.5 |
print(1, 2, 3, sep='/') |
1/2/3 |
print('string'+'string') |
stringstring |
print('文字列{}string{}'.format(a, b)) |
文字列astringb |
Input('プロンプト') |
プロンプト (入力) |
ファイル入出力
f = open(ファイル名, 'r') data = f.readline() print(data) F.close |
ファイルを開いて行を読んで閉じる |
with open(ファイル名, 'r') as f data = f.readline() print(data) |
ファイルを開き、行を読んで、自動的に閉じる |
with open('sample.txt', 'w') as f f.write('test\n') |
書き込み |
with open('sample.txt', 'r') as f data = f.readline() line = data.strip() |
行を読んで、改行文字等を除去(strip()) |
with open('sample.txt', 'r') as f for line in f: print(line.strip()) |
行ごとに読み込んで出力 |
with open('sample.txt', 'r') as f lines = f.readlines() または lines = list(f) |
全ての行をリストとして読み込み |
with open('sample.dat', 'rb') as f f.tell() |
ファイルポインタ位置を取得 |
with open('sample.dat', 'rb') as f f.seek(x) |
ファイルポインタをxに移動 |
with open('sample.dat', 'rb') as f f.read(2) |
2バイト読み込み |
Import pickle sample_num = 100 with open('sample.pkl', 'wb') as f pickle.dump(sample_num, f) |
オブジェクトの書き込み |
Import pickle with open('sample.pkl', 'rb') as f load_num = pickle.load(f) |
オブジェクトの読み込み |
オープンモード
'r' |
読み込み |
'w' |
書き出し |
'a' |
追記 |
'r+' |
読み書き両用 |
'rb' |
バイナリ読み込み |
'wb' |
バイナリ書き出し |
'r+b' |
バイナリ読み書き両用 |
制御文
if文
if 条件式: 真だった場合の処理 elif 条件式: 真だった場合の処理 else 条件式: 偽だった場合の処理 |
一般的なif文 |
if 値 in リスト: 真だった場合の処理 |
値がリストに入っているかの確認 |
if a and b: |
And |
if a or b: |
Or |
if not a: |
Not |
a = None if a is None: |
Noneの判定(Nullみたいなもの) |
三項演算子
'Trueの場合’ if (条件) else 'Falseの場合' |
条件によって異なる値を選択する |
for文
for i in リスト: |
繰り返し ※リストでなくてもiterableすべて可能 (例えば文字列) |
for i in range([m,]n): 繰り返す処理 |
mからn-1で繰り返し |
pass |
何もしない |
イテレーター
Iter(iterable) |
イテレーターの取得 |
next(iterator) |
次の要素を取得 |
クラス
class MyClass: member = 0
def __init__(self, arg1, arg2) 初期化処理
def method(self): return 'aaa'
def get_member(self) return self.member
obj = MyClass(arg1, arg2) |
コンストラクタは__init__ メソッドには第一引数 self が必ず付く |
class MyClass: member = 0
MyClass.member = 100 |
クラス変数 クラスで共通の値 |
class MyClass:
def __init__(self) self.member = 100
obj = MyClass() obj.member = 1000 |
インスタンス変数 インスタンスごとの値 |
class MyClass:
def __init__(self) self.__member = 100 |
プライベートなメンバーを作成する |
class MyClassBase; member = 'base'
def func(self): print(self.member)
Class MyClass(MyClassBase): member = 'sub' |
クラスの継承 |
super().func() |
スーパークラスのメソッドを呼び出す |
MyClass(MyClassBase, OtherClass): member = 'sub' |
多重継承 |
関数
関数の使い方
arg_vals = [1, 2, 3] print(*arg_vals) |
1, 2, 3 |
関数
def func_a(a, b, c): ~ |
関数定義 |
def func_a(a = 1, b = 2, c = 3): ~ |
デフォルト引数 |
def func_a(a = 1, b = 2, c = 3): ~
func_a(2, c = 5); |
キーワード引数の指定 a == 2 |
def func_a(*args): ~
func_a(1, 2, 3) |
args == (1, 2, 3) |
def func_a(**kwargs): ~
func_a(a=1, b=2, c=3) |
kwargs = {'a': 1, 'b': 2, 'c': 3} |
args = [1, 2, 3, '4'] func_a(*args) |
func_a(1, 2, 3, '4') と同じ挙動 |
kwargs = {'a': 1, 'b': 2, 'c': 3} |
func_a(a=1, b=2, c=3) と同じ挙動 |
def outer(a): def inner(b, c): return b * c return inner(a, 10) |
関数内関数 |
def outer(a): run_cnt = 0 def inner(b, c): nonlocal run_cnt run_cnt += 1 return b * c return inner(a, 10) |
関数内関数から、外側の関数内の変数を操作する。 |
関数オブジェクト
a = sum ※sumは組み込み関数 a([1, 2, 3]) |
sum([1, 2, 3]) と同じ挙動 |
a = lambda x: x ** 2 |
2乗するラムダ式 |
map(func_a, list) |
listの各要素をfunc_aに渡して実行する 戻り値は、各要素のfunc_aの戻り値のリスト |
filter(func_a, list) |
listの各要素をfunc_a(Bool型)で判定し、 |
list = [(1, 'a'), (2, 'z'), (3, 'n')] |
[1]の要素をキーとしてソートする。 |
list = [(1, 'a'), (2, 'z'), (3, 'n')] |
[1]の要素をキーとしてソートする。 |
スコープ
関数外での変数使用 |
|
関数内での変数使用 |
ローカル変数 |
関数内で global 変数名 して、使用 |
グローバル変数 |
データ構造
リスト
リストの操作
len(x) |
リストの長さを取得 |
list(range(3)) |
[0, 1, 2] |
list(range(2, 11, 2) |
[2, 4, 6, 8, 10] |
list(range(9, 0, -2) |
[9, 7, 5, 3, 1] |
list1.append(x) |
アイテムを追加 |
list1.extend(x) |
別のリストを連結 |
list1.insert(n, x) |
アイテムを挿入 |
list1.remove(n) |
アイテムを削除 |
list1.pop(n) |
アイテムを取得するとともに削除 |
list1.sort() |
ソート |
list1.sort(reverse=True) |
逆順ソート(list1に影響) |
sorted(list1) |
ソートされたリストを取得 |
list1.reverse() |
逆順にする(list1に影響) |
reversed(list1) |
逆順のリストを取得 |
list1.clear() |
クリア |
list1.index(x) |
値がxの要素のインデックスを検索 |
list1.count(x) |
値がxの要素をカウント |
list1.copy() |
コピーを返す(浅いコピー) |
del list[x] |
x番目を削除 |
del list[m:n] |
m~n-1番目を削除 |
del list |
すべて削除(要素ではなくリストが削除される) |
リスト内包表記
[1, 2, 3, 4, 5] |
リストの生成 |
[2 * x for x in list] |
list内の要素xに対し 2 * x したもののリスト |
[I * j for i in range(1, 3) for j in range(1, 10) ] |
iとjそれぞれの組み合わせで演算したもののリスト |
[[j * 4 + i for i in range(1, 5)] for j in range(2)] |
[[1, 2, 3, 4], [5, 6, 7, 8]] |
[xを使った値 for x in リスト if xを使った条件] [x + 1 for x in range(10) if x % 2 == 0] |
元となるリストに対し、条件に合致した要素を使って 値を計算し、リストを作成する。 |
list_1 = ~~~ [i for i in range(len(list_1)) if list_1[i]を使った条件] |
条件に合ったインデックスのリストを取得 forで反復処理している |
[真の値 if xの条件 else 偽の値 for x in リスト] |
リスト内の値に対し、条件によって異なる値を持つ リストを作成する |
添え字
list1[x] |
x番目の要素 |
list1[-x] |
後ろからx番目の要素 |
list1[m:n] |
mからn-1番目までを切り出す |
list1[m:n:x] |
mからn-1番目までをx間隔で切り出す |
上記指定 = [x] |
上記指定の要素を置き換える |
上記指定 = [x, y, z] |
上記指定の要素を異なる要素数で置き換える |
ループ
for index, value in enumerate(list1): |
ループ内でインデックスを使用する |
タプル
リストに似ているが、要素の一部を変更不能(イミュータブル)
(1, 2, 3, 4, 5) 1, 2, 3, 4, 5 |
生成 |
(1,) |
1要素での生成 |
a, b, c, d, e = (f, g, h, i, j) |
タプルのアンパック a == f |
tuple[n] |
n番目の要素 |
集合
重複しない要素のセット
順序が不定
{'a', 'b', 'c'} |
生成 |
{'a', 'b', 'c', 'c'} |
重複はまとめられる |
set('abc') |
文字列から一文字ごとの集合を生成 |
set.add(a) |
aを追加 |
set.remove(b) |
bを削除 |
set.pop() |
値を取り出して削除(取り出す値は不定) |
{リスト内包表記} |
リスト内包表記による生成 |
{frozenset({jとiの式 for j in リスト}) for I in リスト2} |
集合を要素として持つ集合の生成 frozensetを使用する。 |
集合演算
set_a = set('abc')
set_b = set('cde')
set_a - set_b |
差集合 |
set_a | set_b |
和集合 {'a', 'b', 'c', 'd', 'e'} |
set_a & set_b |
積集合 |
set_a ^ set_b |
排他的論理和 |
集合の比較
set_a = set('abc') set_a == set_b |
完全一致の判定 True
|
set_a = set('abc') |
完全不一致(一つも一致要素がない)の判定 |
set_a = set('abc')
set_b <= set_a または |
部分集合の判定 True |
set_a = set('abc')
set_a >= set_b または |
上位集合の判定 True |
辞書
{1: 'a', 2:'b', 3:'c'} |
生成 |
keys = [1, 2, 3] dict_a = dict(zip(keys, values)) |
生成 {1: 'a', 2:'b', 3:'c'} |
{キーの式:値の式 for x in リスト} |
内包表記による辞書の生成 |
{(キーとなるタプル):値の式 for x in リスト} |
タプルをキーとする辞書の生成 |
main_ids = [100, 200, 300] sub_ids = [1, 2, 3] values = ['a', 'b', 'c'] dict_a = {(main_id, sub_id): value for main_id, sub_id, value in zip(main_ids, sub_ids, values)} |
タプルをキーとする辞書の生成 {(100, 1): 'a', (200, 2): 'b', (300, 3): 'c'} |
kuku = {y:{x:x*y for x in range(1, 10)} for y in range(1, 10)} |
ネストした辞書の生成 |
dict_a[n] |
キーnの要素を参照 |
dict_a.get(n) |
キーnの要素を取得 |
dict_a[n] = val |
キーnとしてvalを追加 |
key in dict_a |
keyがキーとして含まれているか確認 |
del dict_a(key) |
キーがkeyの要素を削除 |
dict_a.pop(key) |
キーがkeyの要素を取り出したうえで削除 |
dict_a.clear() |
全要素をクリア |
for x in dict_a: または |
ループ内で1要素ずつ取り出し、xにキーが格納される |
for x in dict_a.values(): |
ループ内で1要素ずつ取り出し、xに値が格納される |
for key, x in dict_a.items(): |
ループ内で1要素ずつ取り出し、keyにキー、xに値が格納される |
sorted(dict_a.items(), key=lambda x:x[0]) |
ソートされたリストを取得 |
例外処理
try:
処理
except 例外の種類:
例外処理(sys.exc_info() で例外情報を参照できる)
except (例外の種類, 例外の種類) as err:
例外処理(複数の例外をまとめられる。as err で、例外情報を取得できる)
except:
その他の例外処理
else:
正常終了時の処理
finally:
必ず実行されるクリーンアップ処理
例外の送出
raise Exception(エラー情報, ・・・)
メモリー管理
ガベージコレクション
import gc gc.collect() |
明示的にガベージコレクション |
import sys sys.getsizeof(obj) |
オブジェクトのバイト数を取得 |