<<ホームに戻る
Python JavaScript PHP
命名規則(変数、関数、メソッド) ■lower_snake_case
※全小文字 + アンダースコア区切り
■lowerCamelCase
※最初小文字 + 大文字区切り
■lower_snake_case
■lowerCamelCase
の両方。
命名規則(定数) ■UPPER_SNAKE_CASE
※全大文字 + アンダースコア区切り
命名規則(クラス) ■UpperCamelCase
※最初大文字 + 大文字区切り
Falsy (偽値) ■False
■None
■'', (), [], {}, set(), range(0)
■0
■false
■null
■undefined
■""
■0
■NaN
■false
■null
■"", []
■0
■"0"(1文字の"0"の時のみ)
変更可能(ミュータブル)な値 ■リスト
■辞書
■集合
■インスタンス(例外あり)
■バイト配列
■配列
■オブジェクト
準備中
変数の挙動 共有渡し(pass by sharing)のみ。
参照渡し(pass by reference)の機能は存在しない。

◇共有渡しとは?
・値渡し(pass by value)の一種だが、渡される値はメモリアドレス(=参照)である。
・そのため、参照の値渡しと呼ぶ場合も。
・プログラムは変数に格納されているメモリアドレスを元にメモリ領域にアクセスし、その領域に格納されている値を取得する。
※実装によってはメモリアドレスではない方法で参照を実現している場合もあるが、それは例外ケースであり、基本的にはメモリアドレスと捉えているほうが直感的に動きを把握できる。
※「~渡し」という呼び方は沢山あるが、定義が曖昧だったり誤用が多かったりして分かりづらい。呼び方よりも、仕組みや挙動をしっかり把握することのほうが大事。
変数への代入時の挙動は以下の2通りしかない。
1、変数=値 :値を空いているメモリ領域に格納し、その領域のメモリアドレスを変数に格納する。
2、変数=変数 :変数に格納されているアドレスを渡す。
※複合型の値を扱う際に2のようなアドレス渡しをしたくなければ、ディープコピー関数で新たな複合型の値を生成し変数に代入すれば1の挙動になる。
◇複合型の値とは?
・アドレスからアクセスした領域にもアドレスが格納されており、階層構造を持っている。
・いわゆる変更可能(ミュータブル)な値のこと。
・「ミュータブル」だけだとなぜ変更可能なのかが分からないので、複合型と表現している。
・アドレスからアクセスした領域に目的の値が格納されていれば変更不可(イミュータブル)な値である。ここでは単一型の値と表現する。
◇ディープコピー関数とは?
・引数に渡したアドレスから辿れる全ての値を複製し、新たな複合型の値として返す関数。
【参考】
ディープコピー(深いコピー)に対してシャローコピー(浅いコピー)もある。シャローコピーは一階層目の値のみが複製される。
○通常の代入は値渡し(pass by value)。
全ての値を複製し、新たな値として渡す。
 // 値渡し
 $varB = $varA;


○代入元の変数の前に「&」を付けると参照渡し(pass by reference)。
代入先の変数が、代入元の変数のエイリアス(別名)として機能する。
メモリアドレスを渡すわけではない。
 // 参照渡し
 $varB = &$varA;


※例外
オブジェクト変数に格納される値は、オブジェクト自身ではなくオブジェクトIDである。
そのため、値渡しをしても同じオブジェクトを指すようになり、参照渡しと同じような挙動になる(エイリアスではない)。
オブジェクトを別物として渡したい場合は、cloneを使って複製する。
 // clone使用
 $objectB = clone $objectA;
ディープコピー関数 ■copy.deepcopy() ■structuredClone()
※関数要素を複製することはできない(エラーが出る)。
準備中
シャローコピーが行われる処理。 ■copy.copy()
■.copy()
■スライス[:]
■list()
■dict()
■.extend()
■内包表記
■.slice()メソッド
■配列内スプレッド構文[...]
準備中
正規表現の書き方(固有) Pythonではエスケープシーケンスが用意されているが、正規表現を使う場合にはその挙動が手間になる場合がある。
そのため、Pythonでは正規表現のパターンを書く際にraw文字列を使用することが推奨されている。
※raw文字列: r'文字列'のように書く。\(バックスラッシュ)を単なる1つの文字として扱う(正規表現は別)。そのため、エスケープシーケンスが無効化される。
/正規表現/のように、スラッシュで囲んだ中に正規表現のパターンを書く。
エスケープシーケンスは無効化されない。
準備中
正規表現で利用できる主なフラグ
re.IGNORECASE パターンで大文字と小文字を区別しなくなる。
re.MULTILINE メタ文字の ^ や $ が各行の先頭と末尾にマッチするようになる。
re.DOTALL メタ文字の . が改行文字にもマッチするようになる。
/正規表現/g (Global) 抽出と置換で、マッチするすべての部分文字列に処理を適用する。
/正規表現/i (IgnoreCase) パターンで大文字と小文字を区別しなくなる。
/正規表現/m (Multiline) メタ文字の ^ や $ が各行の先頭と末尾にマッチするようになる。
/正規表現/s (DotAll) メタ文字の . が改行文字にもマッチするようになる。
準備中
正規表現の書き方(共通) ・正規表現パターン
.改行以外の文字にマッチ
^文字列の先頭からパターンに一致するかを判定
$文字列の末尾からパターンに一致するかを判定
{m}直前の正規表現を m 回繰り返したものにマッチ
{m,}直前の正規表現を m 回以上繰り返したものにマッチ
{,n}直前の正規表現を n 回以下繰り返したものにマッチ({0,n}と同じ)
{m,n}直前の正規表現を m 回以上 n 回以下繰り返したものにマッチ
*{0,}と同じ
+{1,}と同じ
?{0,1}と同じ
{m, n}のような数量詞は貪欲マッチ。できる限り長い文字列にマッチする。
{m, n}?のように「?」を付けると非貪欲マッチ。できる限り短い文字列にマッチする。
( )文字列をグループ化し、ひとかたまりとして扱う(キャプチャも行われる)。
(?: )文字列をグループ化し、ひとかたまりとして扱う(キャプチャは行われない)。
[ ] (文字クラス)一文字のor指定 例:[abc] → aかbかc
文字クラス内では連続するアルファベットや数字をa-z,A-Z,0-9のように表現できる
(文字クラス開始の[の直後に^を付けると条件の否定となり、指定したもの以外に一致する)
( | )文字列のor指定 例:(a|bc|def) → aかbcかdef
(?: | )( | )と同じだが、キャプチャが行われない。
・正規表現の特殊シーケンス(エスケープシーケンスではない)。
\d[0-9]と同じ
\D[^0-9]と同じ
\s[\t\n\r\f\v]と同じ(空白文字)
\S[^\t\n\r\f\v]と同じ(空白文字以外)
\w[a-zA-Z0-9_]と同じ
\W[^a-zA-Z0-9_]と同じ
・代表的な特殊文字(文字として認識させたい場合はバックスラッシュ(\)でエスケープが必要)
文字クラス外
.
*
+
?
^
$
[
(
)
|
\
{m, n}のような数量詞
delimiter-デリミタ(範囲の始まりと終わりを表す記号)
文字クラス内
^(文字クラス開始の「[」の直後でのみ)
- (x-xのようなケースのみ。a-hや5-9のような適切な形でなければエラーが出る)
delimiter-デリミタ(範囲の始まりと終わりを表す記号)
\
【参考】エスケープシーケンスの例
\bバックスペース
\fフォームフィード
\n改行
\r復帰
\t水平タブ
\v垂直タブ
準備中
文字列の抽出 ■re.findall(pattern, string, flags=0)
・マッチするすべての部分文字列をリストで返す。無ければ空リスト。
・キャプチャグループを設定した場合、グループにマッチした文字列を要素とするタプルのリスト。
・マッチ全体も合わせて取得したい場合は、全体もグループ化する。
■str.match(pattern)
・最初にマッチした部分文字列と、それに関するキャプチャグループを配列で返す。マッチするものがない場合はnullを返す。
(gフラグがあった場合、マッチするすべての部分文字列を配列で返す。キャプチャグループは返さない)
準備中
文字列の置換 ■re.sub(pattern, repl, string, count=0, flags=0)
・countは左側からの最大置換回数(0なら全て)。
・キャプチャグループを設定した場合、グループにマッチした文字列を1つ目から\1, \2, \3...とreplで使用できる。
・replはraw文字列を使うのがベター。
・改行文字は\nと\r\nが混在している場合があるので、改行文字を置換したい場合は一旦改行で分割(.splitlines()を利用)してから区切り文字で結合(.join()を利用)するのが安心。
■str.replace(pattern, replacement)
・最初にマッチした部分文字列を置換し、新しい文字列を返す。
(gフラグがあった場合、マッチするすべての部分文字列を置換する)
・キャプチャグループを設定した場合、グループにマッチした文字列を1つ目から$1, $2, $3...とreplacementで使用できる。
準備中
文字列の分割 ■re.split(pattern, string, maxsplit=0, flags=0)
・パターンにマッチした部分で文字列を分割し、リストで返す。先頭・末尾にマッチする場合、結果のリストの最初と最後に空文字列''が含まれる。
・キャプチャグループを設定した場合、グループにマッチした文字列も結果のリストの一部として返される。
・maxsplitは左側からの最大分割回数(0なら全て)。
・改行で分割したい場合は.splitlines()を利用するのが安心。
■str.split(pattern)
・パターンにマッチした部分で文字列を分割し、配列で返す。先頭・末尾にマッチする場合、結果の配列の最初と最後に空文字列""が含まれる。
・キャプチャグループを設定した場合、グループにマッチした文字列も結果の配列の一部として返される。
準備中
文字列の結合 ■'delimiter'.join(iterable str) ■文字列の配列.join('delimiter') 準備中