Python3 – 文字を順に取り出す

数字やアルファベットの文字を順に取り出して使いたい時、stringモジュールを使うと便利。

 

Python3 – 数値と文字列の相互変換

数値から文字列への変換

10進数(str関数)

str関数で引数の数値を文字列化。

整数の場合、桁数が多くてもそのまま文字列化される。

実数の場合は有効数値で丸められる。

浮動小数点で与えると、桁数が収まる範囲で固定少数表示の文字列になる。

2進数、8進数、16進数

組み込み関数を使う方法

bin、oct、hex関数を使った場合、プレフィックス’0b’、’0o’、’0x’がついた文字列になる。

format関数を使う方法

format関数の第2引数に基数に対応した文字を指定する。

第2引数で、桁数を指定して空いた上位桁を0で埋めることができる。

書式文字列を使う方法

書式文字列と%演算子を使っても、数値を文字列化できるが、2進数には対応していない。

文字列から数値への変換

10進数

整数(int関数)

int関数は整数の文字列を数値化するが、実数形式の文字列を与えるとエラーになる。

実数(float関数)

float関数は実数の文字列を数値化する。固定小数点/浮動小数点のどちらの表現でもかまわない。

2進数、8進数、16進数

int関数の第2引数で基数を指定する。

第2引数には2~36まで指定可能で、0~9とA~Zまで使った36進法まで変換可能。

‘0b’、’0o’、’0x’のプレフィックスを付けた文字列を変換するときは、第2引数を0にする。この場合、10進数も変換可能。

 

Python3 – 整数除算と剰余(//, %)

//演算子

//演算子は、切り捨て除算と言われることが多いが、正確には小数部の切り捨てではなく、除算値を超えない最大の整数となる。これは実数の除算結果にfloorを適用した値と同じで、除算結果が負の時に注意を要する。

なお、被除数・除数の何れがマイナスかは問わず、計算結果がマイナスかどうかだけによる。

%演算子

%演算子は、引数の剰余(mod)を与える。除数の正負によって挙動が異なる点に注意。

除数が正のとき剰余は正となり、除数が負のときは剰余は負となる。

 \begin{array}{lcl} 13 \% 3 = 1 & \Rightarrow & 13 = 3 \times 4 + 1 \\ -13 \% 3 = 2 & \Rightarrow & -13 = 3 \times (-5) + 2 \\ 13 \% (-3) = -2 & \Rightarrow & 13 = -3 \times (-5) - 2 \\ -13 \% (-3) = -1 & \Rightarrow &  -13 = -3 \times 4 -1 \end{array}

 

Python3 – range関数

概要

Python3のrange関数は引数で指定した範囲の整数列をrangeオブジェクトで返す。rangeオブジェクトを表示するには、list関数でリスト化する必要がある。

書式

range(end)
0から始まり、1ずつ増加してendに達しない範囲の数列
range(start, end)
startから始まり、1ずつ増加してendに達しない範囲の数列
range(start, end, step)
startから始まり、stepずつ増加してendに達しない範囲の数列

引数は整数である必要があり、そうでなければエラーとなる。

共通なのは、開始値からステップ値ずつ変化させ、終了値に達する直前までの数列を返す、というもので、ステップ値が正の場合にはstart ≤ 値 < endを、ステップ値が負の場合にはstart ≥ 値 > endを要素とする数列となる。

実行例

引数を1つだけ指定した場合は、0から引数未満の整数列となる。

引数を2つ指定すると、第1引数以上、第2引数未満の整数列となる。

引数を3つ指定すると、第1引数から第3引数ずつ増加して第2引数を超える手前までの整数列となる。

第3引数を負の数とすると、降順の数列になる。このとき、第2引数の終了値以下になる前までの数列となっていることに注意。

なお、2つだけ引数を指定して、第1引数>第2引数としても、降順の数列は得られず、空となる。

 

Python3 – mathモジュール

使い方

数学関数を使うためのモジュールで、importし、各定数・関数について、math.[定数名・関数名]として使う。

関数群

主なもの

定数

pi, e
円周率、自然対数の底
inf
浮動小数点の正の無限大。負の無限大は-math.inf。
nan
浮動小数点の非数NaN。

数論関数

ceil(x)
xの天井(x以上の最小の整数)。
floor(x)
xの床(x以下の最大の整数)。
fabs(x)
xの絶対値。
fmod(x, y)
x \mod yを返す。浮動小数点の場合はx % yよりこちらを使う。
gcd(x, y)
xとyの最大公約数。gcd(0.0, 0.0)は0を返す。
isfinite(x)
xが無限でもNaNでもない時にTrueを返す。
ifinf(x)
xが正の無限大か負の無限大の時にTrueを返す。
isnan(x)
xがNaNの時にTrueを返す。

指数・対数関数

sqrt(n)
nの平方根
pow(x, y)
xのy乗(x^y)。pow(1.0, x)、pow(x, 0.0)は常に1.0を返す。
exp(x)
e^x
expm1(n)
e^x - 1。桁落ちに対して最大精度で計算。
log2(x), log10(x), log(x [,b])
それぞれ2、10、bを底とする対数関数。3番目の関数でbを省略した場合は自然対数\ln x
log1p(x)
1+\log x

を返す。ゼロに近いxに対して正確になるよう計算される。

三角関数

sin(x), cos(x), tan(x)
三角関数。
asin(x), acos(x), atan(x)
逆三角関数
atan2(y, x)
[latex]\tan^{^1}を返すが、4つの象限に対する符号から、[latex]-\pi \sim \pi[/lates]の値を返す。
degrees(r), radians(d)
ラジアンから度、度からラジアンへの変換。

 

BrythonでPath2Dオブジェクトを使う

Brythonでcanvasに描画をする場合、取得したcontextに直接描いていくほかに、Path2Dオブジェクトにサブパスを追加していってから最後に描くという方法がある(HTML5のcanvasを参照)。

BrythonにはPath2Dオブジェクトは実装されていないが、JavaScriptの組み込みクラスを扱う方法によって、Path2Dオブジェクトを使えるようになる。

 

 

BrythonでJavaScriptの組み込みクラスを使う

次の手順でBrythonからJavaScriptのクラスを直接使うことができる。JavaScript側の自作クラスをPythonで使う例はいくつか見かけたが、組込関数はどうかと思って試してみた。

  • browserモジュールからwindowオブジェクトをインポートする
  • JSConstructor()関数の引数にJavaScriptの組み込みクラスのコンストラクタを与えてPythonとしてのコンストラクタを得る
    • ()や引数はつけない
    • 引数に与えるJavaScriptのコンストラクタはwindowオブジェクトに属している
  • 上のコンストラクタを使ってインスタンスを生成

たとえばJavaScriptの組込クラスArrayを使ってみる。

Arrayオブジェクトをつくると、Pythonのリストとして生成されているらしい。メソッドも使えそう。

ところがtoString()メソッドを使おうとするとエラーに。

これを見ると、JavaScriptのコンストラクタを使っているが、Pythonではリストとして解釈されるので、メソッドが存在しない、とエラーになる。上のreverse()sort()は、JavaScriptのArrayクラスのメソッドではなく、Pythonのリストオブジェクトのメソッドとして解釈・実行されたということになる。

Pythonのクラスに定義されていないプロパティにアクセスした場合もエラーになる。

もともとBrythonに該当するものがないJavaScriptのクラスの場合。たとえばPath2Dをつくってみると、JSObjectでラップされたオブジェクトになっているらしい。

このPath2DオブジェクトのmoveTo()lineTo()といったメソッドは問題なく機能して、canvasに描画することができる。

 

Python3 – 関数の引数は値渡しか

参照渡しだが値は保護

以下のコードを実行すると、関数実行の前後で引数に渡した変数の値が影響を受けていない。挙動だけ見ると値渡し(call by value)だが、Pythonの関数引数は参照渡し(call by reference)だという。

実際には、引数を受け取った段階では、元の引数オブジェクトへの参照が渡されているが、その内容が変更されたときに新しいオブジェクトが生成され、元の変数の内容は保たれるらしい。

だが、時には関数に渡した引数の内容を、関数で変更したいような時がある(たとえばシステムの状態に関するフラグの変更など)。そのような変数をglobal定義してもよいが、やはり全体系への汚染のことを考えると気持ちはよくない。

リストを使った場合

以下の例では、要素を1つ持つリストをつくり、そのリストを関数に渡して、関数内でリストの要素の値を変更している。

リストなどのミュータブルなオブジェクトの場合、その内容が関数内での変更の影響を受けている。

クラスを使った場合

以下の例では、カウンタをプロパティに持つクラスをつくり、そのインスタンスを関数に渡して、関数内でインスタンスのカウンタの値を変更している。

変数の内容を特定の関数で変更させたい場合、リストよりもクラスを使った方が意味づけができてよいのではないか。

 

Python3 – 正規表現 – シンタックス

文字にマッチするもの

一覧

文字 それぞれの文字にマッチする。Python3ではUnicode文字も対象。
. '\n'以外の任意の一文字にマッチする。re.S/re.DOTALLフラグが設定されると’\n’にもマッチする。
[...] 文字クラス。[]内に含まれる文字のいずれか一文字マッチする。'-'で範囲指定も可能。たとえば[abc]abcにマッチ。[a-z]は全ての小文字のアルファベット文字にマッチ。[abcx-z]abcxyzにマッチ。Unicode文字にも対応していて[0-9]は全角の数字にマッチ。先頭に'^'記号があると、その文字クラス以外の文字列がマッチする。たとえば[^abc]abc以外にマッチする。
\d 数字[0-9]にマッチ。Unicode文字の数字も対象となり、全角の数字[0-9]なども対象となる。re.A/re.ASCIIフラグが設定されると[0-9]にのみマッチする。バイト列に対しては[0-9]と等価。
\D 数字以外の文字にマッチ。Unicode文字の数字も除外対象となる。
\w 任意のUnicode単語文字にマッチ。あらゆる単語の一部になりうる文字で、文字・数字・アンダースコアが含まれる。re.ASCIIフラグが設定された場合[a-zA-Z0-9_]にマッチ。バイト列に対しては[a-zA-Z0-9_]と等価。
\W Unicode単語文字以外の文字にマッチ。
\s 任意の空白文字とマッチ。[ \t\n\r\f\v]など。
\S 空白以外の文字にマッチ。

Pythonの標準エスケープも正規表現で認識される。

\a\b\f\n\r\t\u\U\v、\x\\

ただし\bは単語境界を表し、文字クラス内でのみバックスペース文字を表す。

文字クラス

文字クラスはUnicode文字にも対応。

文字クラス内では特殊文字は意味を失い、1つの文字として扱われる。たとえば[(*+)]'(''*''+'')'のいずれかとマッチする。

'^'と、']'は例外で、'^'は先頭の場合のみ否定の意味でそれ以外の位置では文字'^'を表し、']'は末尾では無視されそれ以外の位置では文字']'を表す。

位置にマッチするもの

一覧

^ 文字列の先頭にマッチする。たとえば'^A'は先頭の文字が'A'であることを示す。デフォルトでは文字列全体の先頭だけにマッチするが、re.MULTILINEが指定されていれば、各改行の前にもマッチする。
$ 文字列の末尾にマッチする。たとえば’Z$'は末尾の文字が'Z'であることを示す。デフォルトでは文字列全体の末尾だけにマッチするが、re.MULTILINEが指定されていれば、各改行の後にもマッチする。
\b 単語境界にマッチする。単語境界は[^a-zA-Z0-9]

MULTILINE

re.MULTILINEフラグ指定の有無による動作の違いを確認する。

\b – 文字列境界

文字列境界が[^a-zA-Z0-9]であることが、以下の例で分かる。

繰り返し

 *  直前の文字の0回以上でできるだけ多くの繰り返し。'ab*'abbcに対してaabではなくabbとしてマッチする。
 +  直前の文字の1回以上でできるだけ多くの繰り返し。'ab+'abbbcに対してababbではなくabbbとしてマッチする。'ab?'abb...に対してabとしてマッチする。
 ?  直前の文字が0個か1個でできるだけ多くの場合にマッチ。
{m} 直前の文字のm回の繰り返し。
{m,n} 直前の文字のm回以上n回以下でできるだけ多くの繰り返し。
 {m,}  直前の文字のm回以上でできるだけ多くの繰り返し。
 {,n}  直前の文字のn回以下でできるだけ多くの繰り返し。

実行例

'a*'は長さ0の文字列にもマッチする。マッチした文字列の直後の空文字列にマッチすることが、以下の例でもわかる。

'aa?'aaaにマッチするが、最後のaaaに対しては、先頭のaaにマッチした後、残ったaにマッチしている。

'a{2}'は先頭からaaにマッチしていき、最後のaaaaには2回マッチしている。

'a{,3}'は各マッチの後の長さ0の文字列にもマッチしていて、最後のaaaaに対しては先頭のaaaにマッチした後、残ったaにマッチしている。

選択演算子(|)

'|'で区切られた要素のどれかとマッチすればよいことを表す。

注意点としては、'|'で区切られた要素の左から右へマッチング評価され、ある要素がマッチしたと評価されると、その部分列に対してそれ以降の要素の評価は行われない。

グループ(…)

()で囲んだ要素はグループ化されて、1つの文字と同じ様に扱われる。たとえば次の例では、'Aa'というパターンを1つのグループとして、それが繰り返される回数でマッチングさせている。

後方参照

()囲った部分には、先頭から順番に番号nがふられて、そのあとで'\n'のようにマッチした内容を再利用できる。