Python3 – ネストクラス

クラスを入れ子にして、インナークラスを定義することができる。

次の例では、MainClassの中でInnerClassを定義して、それぞれのクラスのプロパティにアクセスしている。

留意点として、アウタークラスからインナークラスを参照する際に、[アウタークラス名].[インナークラス名]とすること。インナークラス名だけで定義しようとすると「そんなクラスはないよ」と怒られる。

なお、インナークラスの定義位置は、必ずしもアウタークラスの冒頭でなくてもよい。

 

 

Python3 – switch/caseはない

とても残念なことに、Pythonにはswitch/case構文がない(もちろん予約語でさえない)。

一般的には、この機能を実現するのにif~elif~elseを使えばよいということになっている。

いくつかの(いや多くの)素敵なサイトでdictionaryを使えばいいよ、と教えてくれるのに出会った。

「構文」として定まっていはいないが、かなり見やすいように思う。

 

 

 

Python3 – 条件分岐

if

標準形

他の言語とほぼ同じだが、else ifはelifと書く。

ブロックの実行内容が1行の場合は、if文などの後ろに続けて1行で書ききれる。

後置形(三項演算子)

この形は「文」ではなくて「式」で、[真の時の値] if [条件] else [偽の時の値]と書く。

switch/caseはない

Pythonにはswitch/case文は存在しない。

if-elif-elseで書くか、以下のように辞書を利用する。

 

 

 

 

Python3 – 繰り返し~ループ

for

標準形

for [変数] in [オブジェクト]:の形で変数がオブジェクトの要素を1つずつ取り出して実行する。

range関数とfor文

for文でrange関数を使うと、多数回のループを簡易に書ける。このとき、rangeの終了値は指定した値-1になることに注意。

enumerateによるインデックスの取得

Pythonのforループでは、リストなどの要素を直接取り出せるので表現が簡潔だが、逆に引数の値(配列の順序値など)が欲しいときがある。そのような場合は、enumerateを使ってインデックスを取得することができる。

enumerateでリストのインデックスが得られる

zipによる複数リストの並行処理

複数のリストの要素を同時に並行して取り出したいとき、zip()関数を使うとよい。

zipによる複数リストの並行ループ

enumerateとzipの複合処理

zipで複数のコレクションの要素を取り出しつつ、enumerateで全体の番号も取得したいとき。zipで取得する要素をタプルにする。

forループの最初と最後だけ処理を変える

forループでは各ループごとに同じ処理内容が繰り返されるが、これを最初と最後だけ変更したい場合の処理を考えてみる。

forループの最初と最後だけ処理を変えたい

while

while [条件式]:で条件式が真である間ループが実行される。

else~終了時の処理

else:ブロックを書くと、forやwhileのループ終了時にその内容が実行される。ループの後に実行文を書くのと動作は変わらないが、終了時処理をより明確にできる。

 continue

continue文は、それ以降の処理を飛ばしてループの先頭に飛ぶ。

次の例では、iが偶数の時はそれ以降のprint文を実行せずに次のステップに移る。

break

break文は、そのbreak文が含まれている一番内側のループから抜け出す。

次の例では、内側のループでjが3を超えるたびにループを終了し、外側の次のステップへ移る。外側のループはiが1を超えたときにそれ以降の処理をせずループを終了する。

 

 

Brython – Timer

Brythonにおけるタイマ処理

Brthonでタイマ処理を実装する場合、time.sleep()メソッドとスレッドクラスの継承を用いても、ブラウザで適切に処理されない(Chromeで実行した場合、処理の冒頭に反応がなく、ある程度の時間後にそれまでの処理が一挙に実行され、その後正常なタイマ処理が続行された)。

Brython固有の機能としてbrowser.timerモジュールにJavaScriptのintervalやtimeoutに相当する以下のメソッド群が用意されている。

  • set_interval()/clear_interval
  • set_timeout()/clear_timeout()
  • request_animation_frame()/cancel_animation_frame

これらはJavaScriptのそれぞれに相当する関数のwrapperであり、JavaScriptの仕様に従っていると考えられる。

JavaScriptのタイマ関係の関数についてはこちらを参照。

interval

基本形

timerパッケージのset_interval()メソッドで一定時間間隔で関数を起動し、clear_interval()メソッドでタイマーの実行を停止する。

引数を渡す場合

ターゲットの関数に引数を渡したい場合、BrythonではJavaScriptのような文字列渡しはできないが、lambda関数式で無名関数の中でターゲットの関数に引数を渡すことができる。

こちらのデモにもtimer.set_interval()を利用している。

 

Brythonの実行時間

概要

Python3、JavaScriptとBrythonの実行時間を比較してみる。

数値演算

Python/Brythonコード


JavaScriptコード

結果

経過時間
Python3 0.152009sec
Brython 3.068000sec
JavaScript 3.000000sec

配列の確保

Python/Brython

JavaScript

結果

経過時間
Python3 0.006001sec
Brython 8.212000sec
JavaScript 2.000000sec

Brython – canvas

Brythonによるcanvasの利用

  1. HTMLで、canvas要素をidを付して記述
  2. browserからdocumentをインポート
  3. documentからcanvasを取得
  4. canvasが取得可能かどうか判定
  5. 2Dのcontextを取得
  6. contextに対してライブラリで描画

canvasライブラリについてはHTML5-canvasを参照。

 

Brython

Brython利用の基本形

  1. Brythonのライブラリを読み込む
  2. brython()を実行させるよう指示する
  3. scriptタグでPythonを指定する
  4. script要素内にPythonのコードを記述する

Brythonのライブラリを読み込む

ライブラリはJavascriptファイル。head要素内でライブラリを指定して読み込ませるが、サーバ上にライブラリを配置しておく方法と、その都度Brythonのサイトから読み込む方法がある。

サーバ上にライブラリを置く場合

サーバ上にライブラリを置かない場合

brython()を実行させる

通常の事例では、body要素のonload属性で指示している。

scriptタグでPythonを指定する

コード例

Brythonのコード例。テクストボックスに名前を入力し、alertで表示。

ボタンのonclick属性でhello()関数を呼び出そうとするとundefinedエラーとなる。Brythonのサイトの事例ではdocオブジェクトのbindメソッドを用いており、これで動作した。

WordPressに移行してからスクリプトの使い方がわからないので、ここではコード例のみ。

console.log

Brythonでconsole.logを使うためには、browser.consoleパッケージを利用する。


 

Python3 – 処理時間の計測

time.time()関数は、呼び出した時点のエポックタイムを秒単位の浮動小数点型で返す。


 

Python3 – スレッド

基本形

threading.Threadクラスで実行する関数と引数を指定し、start()メソッドで開始させる。

同期

幾つかのスレッドの終了を待ってから後続のスレッドを実行させたい場合、join()メソッドで同期をとりたいスレッドの終了を待機する。

スレッドクラス

スレッドクラスを継承したカスタムクラスでの実装方法。

  • thread.Threadクラスを継承する
  • コンストラクタでThreadクラスのコンストラクタを呼び、必要なプロパティをセット
  • run()メソッドをオーバーライドし、処理内容を記述
  • カスタムクラスのインスタンスでstart()を実行

start()メソッドを実行すると、親のThreadクラスのstart()メソッドが呼び出され、そこでrun()メソッドが呼ばれ、カスタムクラスでオーバーライドしたrun()メソッドが実行される。run()メソッドを直接実行すると、シングルスレッドとして実行される。

スレッドの停止

スレッド停止の機能は、thread.Threadクラスを継承したカスタムクラスで実装する。