調べた際のリンクをメモします。順番に特に意味はないです、何か調べるたびに下に追記する予定です。※一部 python3.8 でのみ使用できる機能に関するメモも混ざってます。
簡単な処理の実行はpaizaなどを利用すればすぐに試せます。
メモ
PythonでのFalse
判定
print(bool(False)) print(bool(0)) print(bool(0.0)) print(bool(0.00)) print(bool("")) print(bool(())) print(bool({})) print(bool([])) print(bool(None))
出力は
False False False False False False False False False
リストが空であることを分かりやすくするために
x == []
などと記述しても良いかもしれない。
walrus operator
What’s New In Python 3.8 — Python 3.9.0 documentation
if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)")
n
に対して len(a)
が代入され、それがif文内のスコープで使用できる。if文の手前で n=len(a)
としたり、if n==len(a)
などと二回 len
を実行する必要がなくなる。
スタイルガイド
スタイルガイドに準拠しているかは、VSCodeなどのエディターに適切なリンターを導入してチェックさせる。
Pythonのスタイルガイドとそれを守るための各種Lint・解析ツール5種まとめ! - Sider Blog
awsome-python
awesome XXX = 便利ライブラリ・人気プロジェクトに関するリンク集やTIPSのまとめを指しています。
GitHub - trananhkma/fucking-awesome-python: awesome-python with and
コードのライセンス表記
そもそも、ライセンスや著作権について調べる。
www.slideshare.net
CopyleftとPermissiveというまとまりがあり、後者は改変したコードの再配布を認めている。改変したソースコードを公開する場合にどのようなライセンスを選択するべきかはライセンスに従う。
また、スタイルガイドによってどのような形でライセンスやコード作成者を記述しておくか指定されている場合もある。
Every file should contain license boilerplate. Choose the appropriate boilerplate for the license used by the project (for example, Apache 2.0, BSD, LGPL, GPL) (引用元)
配列のストライド
[start:end:何個とばしか]を指定する、-は逆順になる。
l1 = [i for i in range(10)] l2 = l1[::2] l3 = l1[::3] l4 = l1[::-1] l5 = l1[::-2] print(f'list is {l1}') print(f'list is {l2}') print(f'list is {l3}') print(f'list is {l4}') print(f'list is {l5}')
出力
list is [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] list is [0, 2, 4, 6, 8] list is [0, 3, 6, 9] list is [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] list is [9, 7, 5, 3, 1]
システムがデフォルトで使用する符号化
locale --- 国際化サービス — Python 3.9.0 ドキュメント
テキストデータをエンコードする方法を、ユーザの設定に基づいて返します。ユーザの設定は異なるシステム間では異なった方法で表現され、システムによってはプログラミング的に得ることができないこともあるので、この関数が返すのはただの推測です。
macでの実行結果。
import locale
locale.getpreferredencoding()
出力は
'UTF-8'
Extended Iterable Unpacking
PEP 3132 -- Extended Iterable Unpacking | Python.org
*
をつけることで、代入する変数の対応が取れない箇所は全て*
のついた変数に入れられる。下の例では、a/b/dに一つずつ値が入れられ、残りのリストがcに入る。対応する値がない場合は空のリストになる。
l1 = [i for i in range(10)] a, b, *c, d = l1 print(f'a is {a}, b is {b}, c is {c}, d is {d}') a, b, *c = [1, 2,] print(f'a is {a}, b is {b}, c is {c}')
出力:
a is 0, b is 1, c is [2, 3, 4, 5, 6, 7, 8], d is 9 a is 1, b is 2, c is []
str.format
の使い方
string --- 一般的な文字列操作 — Python 3.9.0 ドキュメント
上記ドキュメントの「書式指定例」にて指定例がある。 フォーマット済み文字列リテラルについては
を参照する。
pandas.DataFrame
のデータの可視化
Visualization — pandas 1.1.3 documentation
pandas ecosystem — pandas 1.1.3 documentation
import numpy as np import pandas as pd ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) ts = ts.cumsum() ts.plot()
基本的なプロットはmatplotlibをインポートせずともプロットできる。
pandas-profilingにとりあえずデータを入れれば、基本的なグラフは確認することができる。
pandasで読み書き可能なファイルのフォーマット
ドキュメントの以下の項目を参照する。
read_clipboard()
・to_clipboard()
などを用いてクリップボードの読み書きもできる。
関係ないですが、調べている途中で以下のすごくいいイラストをたまたま見つけました。
ソートの順番を保ったまま値を挿入
numpy.searchsorted
と同じく、元あるソート済みリストに対してソートの順番を保ったまま値を挿入したい。
bisect --- 配列二分法アルゴリズム — Python 3.9.0 ドキュメント
numpy.searchsorted — NumPy v1.19 Manual
numpy や pandasで条件にあったインデックス・条件にあった値を取得する
numpy
extract
numpy.extract — NumPy v1.19 Manual
import numpy as np arr = np.array([1, 2, 3, 4, 5, 4,]) condition = arr % 2 == 0 print(np.extract(condition, arr))
[2 4 4]
place
numpy.place — NumPy v1.19 Manual
placeは条件にあったものを指定の値に置き換える。
import numpy as np arr = np.array([1, 2, 3, 4, 5, 4,]) print(arr) condition = arr % 2 == 0 print(np.extract(condition, arr)) np.place(arr, arr % 2 == 0, -1) print(arr)
出力
[1 2 3 4 5 4] [2 4 4] [ 1 -1 3 -1 5 -1]
where/argwhere
numpy.where — NumPy v1.19 Manual
numpy.argwhere — NumPy v1.19 Manual
条件にあった箇所の値を置き換える・条件にあった箇所のインデックスを取得する。
import numpy as np matrix = np.array([[0, 3, 6], [1, 4, 7], [2, 5, 8]]) res = np.where(matrix < 6, matrix, 0) print(res) res = np.argwhere(matrix < 6) print(res)
出力、6より小さいところだけが残りあとは0になるように np.where(matrix < 6, matrix, 0)
と指定した。
[[0 3 0] [1 4 0] [2 5 0]] [[0 0] [0 1] [1 0] [1 1] [2 0] [2 1]]
pandas
ドキュメントのインデックスと選択に関するページを参照しつつ使えば良いと思われる。
- query:The query() Method
- where :The where() Method and Masking
コードの静的解析
GitHub - trananhkma/fucking-awesome-python: awesome-python with and
https://github.com/analysis-tools-dev/static-analysis
vscodeでは "python.linting.<linter>Enabled": true
を設定し、linterごとに詳細設定を行えば自動でチェックが行われる。
Linting Python in Visual Studio Code
asyncio
Pythonにおける非同期処理: asyncio逆引きリファレンス - Qiita
ディレクトリを作成する
実験環境で特によく使用するのでメモ。以下の関数を用いて再帰的にディレクトリを作成する、既に存在する場合は作成しないように指定できる(exist_ok=True
を指定する)ので if os.path.exists(...)
などと指定しなくて良い。
os --- 雑多なオペレーティングシステムインタフェース — Python 3.9.0 ドキュメント
再帰的にディレクトリを作成する関数です。mkdir() と似ていますが、末端ディレクトリを作成するために必要なすべての中間ディレクトリも作成する。
setdefault
辞書オブジェクト (dictionary object) — Python 3.9.0 ドキュメント
これは Python レベルの dict.setdefault() と同じです。 もしあれば、辞書 p から key に対応する値を返します。 キーが辞書になければ、値 defaultobj を挿入し defaultobj を返します。
setdefaultの値は複製されてセットされるのではないため、ある変数でsetdefaultした後に変数の値を変更するとsetdefaultした部分の値も変更される。また、 key が存在しない場合は
3. データモデル — Python 3.9.0 ドキュメント
が呼び出されることを利用して、__missing__
に挙動を定義するという方法もある。
関連記事・参考文献
Effective Python 第2版 ―Pythonプログラムを改良する90項目
- 作者:Brett Slatkin
- 発売日: 2020/07/16
- メディア: 単行本(ソフトカバー)