"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

Python3プログラミングよく使う構文などのチートシート風まとめ

個人的にPythonで使う機会が多い型や構文などを一か所にまとめて参照しやすくしておこうと思います。

f:id:arakan_no_boku:20190427205325j:plain

 

まとめる目的と方針

 

役割上、同じプログラム言語を続けて使うことは少ないです。

気が付けば、pythonさわるのは3カ月ぶり・・みたいな事もによくなります。

そうすると、最初のうち、他の言語と構文を混同したり、綴りを度忘れして固まったり・・みたいなことがおこりがちなので、カンニングペーパー(チートシート)的にちらっと見れるように一か所にまとめてあるものを作ってみました。

ただ、あくまで基準は「自分用」です。

一般向けを意識して書いているわけではないので、あしからず(笑)。

 

(1)スタイル 

 

他の言語と記憶が混同しやすいものだけ、とりあえず。

項目 説明
インデント TABではなく「空白4個」を使う
クラス内のメソッド定義 1行あける
各行の長さ 80文字未満。超える場合は2行に分けて、インデントする
行継続 「\」で継続する。

if 1900 < year < 2100 and 1 <= month <= 12 \
    and 1 <= day <= 31 and 0 <= hour < 24 \
    and 0 <= minute < 60 and 0 <= second < 60:
()、[]、{}内の行継続 改行のみで継続可能。

month_names = ['Januari', 'Februari', 'Maart',
     'April', 'Mei', 'Juni',
     'Juli', 'Augustus', 'September',
     'Oktober', 'November', 'December']

最終的には「autopep8」で自動フォーマットします。

よく使うので、自動フォーマットのコマンドだけ、こちらに書いておきます。

autopep8 --in-place --aggressive --aggressive <filename>

だから、それで修正されるレベルのものは気にしないことにしてます。

autopep8の使い方のもう少し詳しい説明及びチェッカーのエラーコードは以下を参照します。

arakan-pgm-ai.hatenablog.com

 

(2)命名規則

 

これも他言語といったりきたりで混同しやすいものだけ、とりあえず。

項目 説明
メソッド・変数・属性 abc_defの様に、小文字を「_」でつなぐ「スネークケース」
クラスと例外 AbcDefの様に先頭を大文字にする「アッパーキャメルケース」
モジュールレベル定数 ABD_CEFの様に大文字を「_」でつなぐ「スネークケース」
クラスインスタンスメソッド クラス内に定義する普通のメソッド。クラスをインスタンス化してからメソッドを使う。第一仮引数「self」を使う
クラスメソッド @classmethodを使って宣言するメソッド。クラスをインスタンス化せずに呼び出せる。第一仮引数「cls」を使う
private属性メソッド・変数 __abc_defの様に、先頭に「_」を2つつける。

 

(3)モジュール・パッケージ・import

 

度忘れで迷うことがあるので、とりあえず。 

項目 書き方・説明
モジュールfooをインポート import foo
モジュールitrtoolsをインポートして、itrという別名で参照する import itertools as itr
パッケージbarからモジュールfoo from bar import foo
パッケージbarsからモジュールfooとbar from bars import foo,bar
相対インポートでモジュールfoo from . Import foo
サブパッケージのモジュールfoo from sub_p.subsub_p import foo
サブモジュールfoo内からsubsub_p内のサブサブモジュールsub_fooの呼出し from .subsub_p import sub_foo
モジュール 「関数」や「クラス」を集めた拡張子「.py」のファイル。
パッケージ 「モジュール」を集めたフォルダ。明示的に「__init__.py」をおくようにする。

もう少し詳細が必要な時には、以下の記事がわかりやすいと思ってます。

note.nkmk.me  

(4)初期化

 

リストとタプルの初期化。

特に二次元の初期化をよく度忘れするので・・。

項目 説明
一次元の空リスト
lst = []
lst.append('a')
リスト一次元初期値あり
lst2 = ['a', 'b']
リスト二次元[[0,0,0][0,0,0][0,0,0]]
方法1
a = [[0 for i in range(3)] for i in range(3)]
リスト二次元[[0,0,0][0,0,0][0,0,0]]
方法2
a = [[0] * 3 for i in range(3)]
タプル一次元
tpl2 = ('a', 'b')
タプル一次元(繰り返し)
tpl = ('a',) * 5
カンマに注意
タプル二次元(繰り返し)
ta = ((0,) * 3, (0,) * 3)
カンマに注意
辞書
dic={'a':'b','c':'d'}

辞書については、以下に別記事でまとめています。

arakan-pgm-ai.hatenablog.com 

ネストした辞書の初期化については、さらにわけて別記事にしてます。

arakan-pgm-ai.hatenablog.com  

 

(5)内包表記とジェネレータ

 

初期化と続くループ処理の両方に関連する内包表記とジェネレータについては、若干複雑なので、別記事としてまとめています。

arakan-pgm-ai.hatenablog.com 

 

(6)ループ・繰り返し処理

 

とにかくよく使う割に、綴りとかを忘れやすいので。

項目 説明
整数をカウントアップ・ダウン 例 : for i in range(10):
少数をカウントアップ・ダウン

import numpy

例 : for n in numpy.arange(1.0, 3.0, 0.1)

listの値だけ順次処理 例 : for val in a_list
listのインデックスと値を順次処理 例 : for  index,value in enumerate(a)
2つの配列を並列でループ 例 : for x,y in zip(a,b)
2つの配列を連結してループ

import itertools

例 : for x in itertools.chain(a,b)

複数のリストを総当たりでループ

import itertools

例 : for w,x,y,z in itertools.product(a,b,c,d)

辞書にセットしたキー・値を全て処理

例 : for key,val in md.items()

または

例 : for key,val in zip(md.keys(),md.values())

なお、辞書の出力時のキーの並び順(items()とかの出力)は、Python3.6以降だとOrderDictと同様に保持されるみたいですが、それ以前だと不定です。

辞書のこのへんのことに関しては、以下にもまとめてます。

arakan-pgm-ai.hatenablog.com

あと・・。 

辞書以外の、上記のコード例や順列などを使った少し複雑なケースは以下の別記事にまとめてます。

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com

 

(7)データの取り出し・並び替えなど

 

PythonのスライスとかSORTとか良く使うので。

 

シーケンススライス

 

これは別記事のリンクのみです。

arakan-pgm-ai.hatenablog.com

 

SORT

 

項目 書き方・説明
昇順にソートしたリストを返す
タプル・文字列にも使える
lst = [5, 2, 3, 1, 4]
sorted(lst)
降順にソートしたリストを返す
タプル・文字列にも使える
lst = [5, 2, 3, 1, 4]
sorted(lst, reverse=True)
リストそのものを昇順に並び替え lst = [5, 2, 3, 1, 4]
lst.sort()
リストそのものを降順に並び替え lst = [5, 2, 3, 1, 4]
sorted(lst, reverse=True)
昇順にキーでソートした辞書を返す dict(sorted(md.items(),key=lambda x:x[0]))
昇順にキーでソートした辞書を返す dict(sorted(md.items(),key=lambda x:x[0],reverse=True))
昇順に値でソートした辞書を返す dict(sorted(md.items(),key=lambda x:x[1]))
昇順に値でソートした辞書を返す dict(sorted(md.items(),key=lambda x:x[1],reverse=True))
文字列を分割して、全て小文字に変換してからソートしたリストを返す sorted("This is a test string from Andrew".split(), key=str.lower)
ts = [('森君', '00099', 95), ('林君', '00123', 95), ('高林君', '00034', 300), ]を3番目の数字、2番目の文字列の複数キーの昇順でソート from operator import itemgetter
sorted(ts, key=itemgetter(2, 1))
ts = [('森君', '00099', 95), ('林君', '00123', 95), ('高林君', '00034', 300), ]を3番目の数字、2番目の文字列の複数キーの降順でソート from operator import itemgetter
sorted(ts, key=itemgetter(2, 1), reverse=True)

クラスのソートとかの他の事例とかは、こちらのページが詳しいと思います。

docs.python.org 

 

(8)条件式と比較演算子など

 

 条件式は「if ~ elif~ else~」です。

select~caseのようなswitch分はありません。

 

値の比較演算子

 

演算子 説明
== 2つの値がイコールの時に「正」  例: a == b は正ではない
 != 2つの値がイコールでない時に「正」 例: a != b は正
 >  左の値が右の値より大きい時に「正」 例: a > b は正ではない
 < 左の値が右の値より小さい時に「正」 例: a < b は正
 >= 左の値が右の値以上の時に「正」 例: a >= b は正ではない
 <= 左の値が右の値以下の時に「正」 例: a <= b は正

 

文字列の比較

 

演算子 説明
== 2つの文字列がイコールの時に「正」  例:' a' ==' b' は正ではない
 != 2つの文字列がイコールでない時に「正」 例: 'a' != 'b' は正
in 文字列に対して比較する文字列が含まれている。 例: 'a' in 'b'
re.match 指定した正規表現と一致する文字列を含む。(文字列の先頭でのみ判断) 例: re.match('ab', 'abcdefg')
re.search 指定した正規表現と一致する文字列を含む。(先頭以外でも判断) 例: re.search('cd', 'abcdefg')

reを使うには「import re」が必要です。

念のため。

 

オブジェクトの比較

 

項目 説明
is  Noneとの比較に主に使う。2つのインスタンスが同一の時に「正」 例: a is b は正ではない
is not Noneとの比較に主に使う。 2つのオブジェクトが同一でない時に「正」 例: a is not b は正

真理値判定(and,not,or)とかは、まあ、忘れないので書いてません。

これ以上のことが他の組み込み型について必要になったら、こちらを参照します。

docs.python.org

 

型に関連する用語

 

まあ、忘れないと思うのですけど、念のため、書いときます。

いい年齢ですからね(笑)

項目 説明
ステートフル 状態を保持し結果はその影響を受ける。つまり、同じ入力に対して同じ結果が返されることが保証されない。
ステートレス 状態を保持しないので影響をうけない。つまり、同じ入力に対して同じ結果が保証されているので、繰り返し使える。
ミュータブル 変更可能(mutable)
イミュータブル 変更不可能(immutable)
イテラブル 要素を1つずつ返す機能をもったオブジェクト。つまり、For文で繰り返し処理が可能ということ。
辞書 ミュータブル。一意のキーでアクセス。キーとバリューのセットで値を保持する。イテラブル。
集合 ミュータブル。一意のキーでアクセス。キーのみを持つため、重複を許さないことになる。イテラブル。
リスト ミュータブル。インデックスでアクセス。要素の挿入と削除が可能。イテラブル。
タプル イミュータブル。インデックスでアクセス。リストと同じ様に値を保持するが挿入・削除ができない。イテラブル。
プリミティブ プログラミング言語の仕様に用意されている最も基本的なデータ型のこと。Pythonでは組込み型。
オブジェクト型 値(プロパティ)とメソッドの集まりであるデータ型。
ラッパーオブジェクト String、Number、Boolean等プリミティブ型の機能をオブジェクト型でラッピングした型

 

(9)文字列の検索・置換・正規表現  

 

reでよく使うものを列挙しておきます。 

項目 書き方
結果の正規表現オブジェクトを利用する方法(何度もパターンマッチを繰り返す場合には効率的) prog = re.compile(pattern) result = prog.match(string)
上記の方法と等価なパターン直接指定の方法(繰り返し利用が少ない場合に利用) result = re.match(pattern, string)
文字列のどこかでpatternに最初にマッチ re.search(pattern, string)
文字列の先頭でpatternにマッチ re.match(pattern, string)
文字列全体がpatternにマッチ re.fullmatch(pattern, string)
文字列をpatternで分割する。 re.split(pattern, string)
文字列でpatternにマッチしたものをリストで返す(重複は削除されている) re.findall(pattern, string)
文字列でpatternにマッチしたものをyieldのイテレータで返す(大量マッチ時有利) re.finditer(pattern, string)
文字列のpatternにマッチしたものをreplで置き換え、置き換え文字列を返す re.sub(pattern, repl, string, count=0)
上記と同じで、タプルを返す。 re.subn(pattern, repl, string, count=0)
patternをエスケープする。(正規表現メタ文字を含みうる任意のリテラル文字列にマッチしたい時に便利) re.escape(pattern)

 reのより詳しい利用方法については、こちらが詳しいと思ってます。

docs.python.org

一発で複数種類の単語の置き換えをやる方法については、上記のドキュメントにもなかったので、別記事にまとめてます。

arakan-pgm-ai.hatenablog.com

 

(10)クラス定義と関数の引数

 

クラス定義

名称 書き方
コンストラクタ(引数なし) def __init__(self)
コンストラクタ(引数あり) def __init__(self,arg)
親クラス(Boo)を継承する class MyClass(Boo)
親クラス(Boo)を初期化する super().__init__()
Boo.__init__()はPython3ではNG。

 

関数の忘れやすい引数の与え方

名称 書き方
キーワード専用引数(位置引数として与えるとエラーになる) def foo(a,b,*,key=0,key2=2) のように、キーワード専用引数の始まりを示す「*」を置く。
可変長引数(タプルで受け取る) *args
可変長キーワード引数(辞書で受け取る) **kwargs

その他、引数の使い方で注意すべき点とかは、別記事にまとめてます。 

arakan-pgm-ai.hatenablog.com

 

(11)例外

 

他の言語から戻ってきて、手の癖で「catch」なんて書きがちなので。

項目 説明
try 例外補足の開始
except 例外が発生した時に実行される
else 例外が発生しなかった時に実行される
finally tryの後で必ず実行される

各種組み込み例外の種類などは、こちらが詳しいです。

docs.python.org

 

(12)ファイル読み書き・直列化

  

項目 書き方・説明
テキストファイル読み込み with open(’c:/test/test.txt’, mode='r', encoding='utf-8') as f:
    text = f.read()
テキストファイル上書き with open('c:/test/test.txt', mode='w', encoding='utf-8') as f:
    f.write('XXXXXXX')
テキストファイル追加書き込み with open('c:/test/test.txt', mode='a', encoding='utf-8') as f:
    f.write('XXXXXXX')
json読み込み with open('C:/test/test.json') as f:
    jsn = json.load(f)
json書き込み with open('C:/test/test.json', 'w') as f:
    json.dump(str, f, ensure_ascii=False, indent=4)
pickle読み込み with open('test.pkl', 'rb') as f:
    load_data = pickle.load(f)
pickle書き込み with open('test.pkl', 'wb') as f:
    pickle.dump(data, f)

pickleは内部利用しか使いませんので、頻度は少ないですが念のため。

上記以外にも、ファイル・ディレクトリ操作・比較などは沢山あるのですが、それらは以下に詳しく書いてあるので、必要になったら見たらいいと思ってます。

docs.python.org

また。

バイナリデータの処理については、以下のリンクが詳しいです。

docs.python.org

 

(12)スレッド・並列処理など

 

Pythonのスレッド・並列処理は他言語と異なる点があって、箇条書きでは難しいので、別記事にまとめてます。 

arakan-pgm-ai.hatenablog.com 

 

(13)その他もろもろ

 

1から12のジャンルにはまらない単発的です。

 

ちょっとしたこと

 

名称 書き方
改行しないでprint()には end="" print("この結果は=>",end="")
0.0から1.0の範囲のfloat型の乱数をえる random.random()
任意の範囲(2.0から3.0とか)でfloat型の乱数を得る random.uniform(2.0, 3.0))
指定した範囲(1~100とか)の整数の乱数を得る random.randint(1,100)
リストや文字列からランダムに値を取り出す mylist = ['a','c','b','d']
random.choice(mylist)

randomを使うには「import random」が必要です。

 

エスケープシーケンスとか 
項目 意味
\newline バックスラッシュと改行文字が無視されます
\\ バックスラッシュ (\)
\' 一重引用符 (')
\" 二重引用符 (")
\b ASCII バックスペース (BS)
\f ASCII フォームフィード (FF)
\n ASCII 行送り (LF)
\r ASCII 復帰 (CR)
\t ASCII 水平タブ (TAB)
\v ASCII 垂直タブ (VT)

 

とりあえず、こんな感じかな。

これも気づいたら、ちょこちょこ追記・修正していきます。

ではでは。