めも

メモ.

python3を使用する上での細かいメモ

調べた際のリンクをメモします。順番に特に意味はないです、何か調べるたびに下に追記する予定です。※一部 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.8.5 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を実行する必要がなくなる。

スタイルガイド

paper.hatenadiary.jp

スタイルガイドに準拠しているかは、VSCodeなどのエディターに適切なリンターを導入してチェックさせる。

Pythonのスタイルガイドとそれを守るための各種Lint・解析ツール5種まとめ! - Sider Blog

speakerdeck.com

awsome-python

awesome XXX = 便利ライブラリ・人気プロジェクトに関するリンク集やTIPSのまとめを指しています。

GitHub - vinta/awesome-python: A curated list of awesome Python frameworks, libraries, software and resources

GitHub - trananhkma/fucking-awesome-python: awesome-python with and

コードのライセンス表記

そもそも、ライセンスや著作権について調べる。

コピーレフト - Wikipedia

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.8.5 ドキュメント

テキストデータをエンコードする方法を、ユーザの設定に基づいて返します。ユーザの設定は異なるシステム間では異なった方法で表現され、システムによってはプログラミング的に得ることができないこともあるので、この関数が返すのはただの推測です。

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.8.5 ドキュメント

上記ドキュメントの「書式指定例」にて指定例がある。 フォーマット済み文字列リテラルについては

2. 字句解析 — Python 3.8.5 ドキュメント

を参照する。

pandas.DataFrame のデータの可視化

Visualization — pandas 1.1.1 documentation

pandas ecosystem — pandas 1.1.1 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をインポートせずともプロットできる。

GitHub - pandas-profiling/pandas-profiling: Create HTML profiling reports from pandas DataFrame objects

pandas-profilingにとりあえずデータを入れれば、基本的なグラフは確認することができる。

pandasで読み書き可能なファイルのフォーマット

ドキュメントの以下の項目を参照する。

pandas.pydata.org

read_clipboard()to_clipboard() などを用いてクリップボードの読み書きもできる。

関係ないですが、調べている途中で以下のすごくいいイラストをたまたま見つけました。

「ご主人!わすれもの!」www.pixiv.net

ソートの順番を保ったまま値を挿入

numpy.searchsortedと同じく、元あるソート済みリストに対してソートの順番を保ったまま値を挿入したい。

bisect --- 配列二分法アルゴリズム — Python 3.8.5 ドキュメント

numpy.searchsorted — NumPy v1.19 Manual

qiita.com

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

ドキュメントのインデックスと選択に関するページを参照しつつ使えば良いと思われる。

コードの静的解析

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

www.youtube.com

Pythonにおける非同期処理: asyncio逆引きリファレンス - Qiita

ディレクトリを作成する

実験環境で特によく使用するのでメモ。以下の関数を用いて再帰的にディレクトリを作成する、既に存在する場合は作成しないように指定できる(exist_ok=Trueを指定する)ので if os.path.exists(...)などと指定しなくて良い。

os --- 雑多なオペレーティングシステムインタフェース — Python 3.8.5 ドキュメント

再帰的にディレクトリを作成する関数です。mkdir() と似ていますが、末端ディレクトリを作成するために必要なすべての中間ディレクトリも作成する。

関連記事・参考文献

Effective Python 第2版 ―Pythonプログラムを改良する90項目

Effective Python 第2版 ―Pythonプログラムを改良する90項目

  • 作者:Brett Slatkin
  • 発売日: 2020/07/16
  • メディア: 単行本(ソフトカバー)