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)

モジュールの一部読み込み
randomからrandint, choiceを読み込む

import random as rd

rdという別名でrandomを読み込む

 

モジュールパスを追加: PYTHONPATH 変数に追加

 

演算

代入

a, b, c = 1, 2, 3

a == 1
b == 2
c == 3

d = (1, 2)

e, f = d

e == 1
f == 2

p = (1, (10, 100))
q, (r, s) = p

q == 1
r == 10
s == 100

 

割り算

/

小数型で計算

//

整数型で計算

divmod(a, b)

商と剰余を計算

(a//b, a%b)

 

べき乗

**

べき乗を計算

pow(a, b, c)

a ^ b % c

 

データ型

type(a)

データ型を取得

 

リテラル

b'0000'

バイト型

 

端数処理

round(a, b)

aを小数b桁未満を丸める
※偶数側に丸められる
 2.5 → 2
 1.5 → 2

 

基数変換

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

プライベートなメンバーを作成する
(アンダースコア2つでクラス外から参照できなくなる)

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
b == 2
c == 5

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

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')]
list.sort(key= lambda x: x[1])

[1]の要素をキーとしてソートする。
元のlistが改変される

list = [(1, 'a'), (2, 'z'), (3, 'n')]
sorted(list, key= lambda x: x[1])

[1]の要素をキーとしてソートする。
元のlistは改変されない

 

スコープ

関数外での変数使用

グローバル変数

関数内での変数使用

ローカル変数

関数内で

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]

元となるリストに対し、条件に合致した要素を使って

値を計算し、リストを作成する。
[1, 3, 5, 7, 9]

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
b == g
c == h
d == i
e == j

tuple[n]

n番目の要素

 

集合

重複しない要素のセット

順序が不定

{'a', 'b', 'c'}

生成

{'a', 'b', 'c', 'c'}

重複はまとめられる
{'a', 'b', 'c'}

set('abc')

文字列から一文字ごとの集合を生成
{'a', 'b', 'c'}

set.add(a)

aを追加

set.remove(b)

bを削除

set.pop()

値を取り出して削除(取り出す値は不定

{リスト内包表記}

リスト内包表記による生成

{frozenset({jとiの式 for j in リスト}) for I in リスト2}

集合を要素として持つ集合の生成
要素はHashableである必要があるため、

frozensetを使用する。
frozensetはイミュータブル。

 

集合演算

set_a = set('abc')
set_b = set('cde')

set_a - set_b

差集合
{'a', 'b'}

set_a | set_b

和集合

{'a', 'b', 'c', 'd', 'e'}

set_a & set_b

積集合
{'c'}

set_a ^ set_b

排他的論理和
{'a', 'b', 'd', 'e'}

 

集合の比較

set_a = set('abc')
set_b = set('abc')

set_a == set_b

完全一致の判定

True

 

set_a = set('abc')
set_b = set('de')
set_a.isdisjoint(set_b)

完全不一致(一つも一致要素がない)の判定
True

set_a = set('abc')
set_b = set('bc')

 

set_b <= set_a

または
set_b.issubset(set_a)

部分集合の判定

True

set_a = set('abc')
set_b = set('bc')

 

set_a >= set_b

または
set_a.issuperset(set_b)

上位集合の判定

True

 

辞書

{1: 'a', 2:'b', 3:'c'}

生成

keys = [1, 2, 3]
values = ['a', 'b', 'c']

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の要素を取得
なければNoneが返される

dict_a[n] = val

キーnとしてvalを追加

key in dict_a

keyがキーとして含まれているか確認
含まれていればTrue

del dict_a(key)

キーがkeyの要素を削除

dict_a.pop(key)

キーがkeyの要素を取り出したうえで削除

dict_a.clear()

全要素をクリア

for x in dict_a:

または
for x in dict_a.keys():

ループ内で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)

オブジェクトのバイト数を取得