複数言語をいったりきたりするので、久々にpythonを使うと度忘れしていることがたまにあります。そんな時、カンニングペーパー(チートシート)的に一か所にまとめたものがあると助かるなと思って(自分用に)まとめてみました。
目次
- (1)スタイル
- (2)命名規則
- (3)モジュール・パッケージ・import
- (4)初期化
- (5)内包表記とジェネレータ
- (6)ループ・繰り返し処理
- (7)データの取り出し・並び替えなど
- (8)条件式と比較演算子など
- (9)文字列の検索・置換・正規表現
- (10)クラス定義と関数の引数
- (11)例外
- (12)ファイル読み書き・直列化
- (12)スレッド・並列処理など
- (13)その他もろもろ
(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で自動フォーマットします。
以前はバッチファイルでやってましたが、最近は、以下の記事の「スタイルチェッカーをPEP8にする」に書いている設定をして、VSCodeのフォーマット機能でやってます。arakan-pgm-ai.hatenablog.com
VSCodeを使わずに、コマンドラインでやる場合は、こうします。
autopep8 --in-place --aggressive --aggressive <filename>
ただ、<filename>はワイルドカードが使えません。
そこで、WSLのxargsを使って、フォルダ内のファイルを一括フォーマットしてました。
コマンドラインはこうです。
dir -b ./00_sk/*.py | xargs autopep8.exe --in-place --aggressive --aggressive
WSLの使い方は以下の記事に書いています。
autopep8の使い方のもう少し詳しい説明及びチェッカーのエラーコードは以下を参照します。
(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 sub_p.subsub_p import foo |
パッケージ内モジュールからの相対インポートでモジュールfoo | from . Import foo |
サブモジュールfoo内からsubsub_p内のサブサブモジュールsub_fooの呼出し | from .subsub_p import sub_foo |
モジュール | 「関数」や「クラス」を集めた拡張子「.py」のファイル。 |
パッケージ | 「モジュール」を集めたフォルダ。明示的に「__init__.py」をおくようにする。 |
基本的な部分をもう少し丁寧に整理してみた記事は以下です。
(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'} |
辞書については、以下に別記事でまとめています。
ネストした辞書の初期化については、さらにわけて別記事にしてます。
(5)内包表記とジェネレータ
初期化と続くループ処理の両方に関連する内包表記とジェネレータについては、若干複雑なので、別記事としてまとめています。
(6)ループ・繰り返し処理
enumerateの綴りをよく度忘れします(;^_^A
項目 | 説明 |
---|---|
整数をカウントアップ・ダウン | 例 : 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と同様に保持されるみたいですが、それ以前だと不定です。
辞書のこのへんのことに関しては、以下にもまとめてます。
辞書以外の、上記のコード例や順列などを使った少し複雑なケースは以下の別記事にまとめてます。
(7)データの取り出し・並び替えなど
シーケンススライスは別記事のリンクのみです。
arakan-pgm-ai.hatenablog.comSORTです。
項目 | 書き方・説明 |
---|---|
昇順にソートしたリストを返す タプル・文字列にも使える |
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) |
クラスのソートとかの他の事例とかは、こちらのページが詳しいと思います。
(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)とかは、まあ、忘れないので書いてません。
これ以上のことが他の組み込み型について必要になったら、こちらを参照します。
型に関連する用語です。
項目 | 説明 |
---|---|
ステートフル | 状態を保持し結果はその影響を受ける。つまり、同じ入力に対して同じ結果が返されることが保証されない。 |
ステートレス | 状態を保持しないので影響をうけない。つまり、同じ入力に対して同じ結果が保証されているので、繰り返し使える。 |
ミュータブル | 変更可能(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のより詳しい利用方法については、こちらが詳しいと思ってます。
一発で複数種類の単語の置き換えをやる方法については、上記のドキュメントにもなかったので、別記事にまとめてます。
(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 |
その他、引数の使い方で注意すべき点とかは、別記事にまとめてます。
(11)例外
他の言語から戻ってきて、手の癖で「catch」なんて書きがちなので。
項目 | 説明 |
---|---|
try | 例外補足の開始 |
except | 例外が発生した時に実行される |
else | 例外が発生しなかった時に実行される |
finally | tryの後で必ず実行される |
各種組み込み例外の種類などは、こちらが詳しいです。
(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は内部利用しか使いませんので、頻度は少ないですが念のため。
上記以外にも、ファイル・ディレクトリ操作・比較などは沢山あるのですが、それらは以下に詳しく書いてあるので、必要になったら見たらいいと思ってます。
また。
バイナリデータの処理については、以下のリンクが詳しいです。
(12)スレッド・並列処理など
Pythonのスレッド・並列処理は他言語と異なる点があって、箇条書きでは難しいので、別記事にまとめてます。
(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) |
とりあえず、こんな感じ。
後、個々の便利なライブラリの使い方とかで、自分が参考にさせてもらっているサイトのリンクを貼っておきます。
たいていの事は、ここで調べるとのってます(笑)
ではでは。