プログラミング編 Pythonに少し慣れてみる。

プログラミングについて

ブログの主のねこぽんは独学のみで趣味のプログラミングをしています。まちがった知識や用語、偏った部分も多分にあると思います。このブログでプログラミングに興味をもち、プログラミングの流れだけをつかんだら他のプログラミングの本や本格的なブログへステップアップしていってもらえたら、とおもいます。

Contents

ラズパイでPython

Pythonって、なんかBasicと似てる。

ねこっぴ

今回はラズパイPythonのお話にゃ!

ぴぽこ

PythonってなんかBasicに似てるね。

ねこっぴ

プログラムには インタプリタ型 と コンパイル型があって、
その場その場で機械語に翻訳しながら実行していくのがインタプリタ型、とのことにゃ。Basic, Pythonがインタプリタ型なんだって。

ぴぽこ

へー! なんか似てると思ったらタイプが同じなのね。

ねこっぴ

まー、むずかしいことは忘れて触っていこー!

ぴぽこ

今回は短いプログラムなのでThonnyを使います! 軽いですね!

サンプルファイルをダウンロード!

ねこっぴ

ラズパイのブラウザからここ開いてダウンにゃよ

ラズパイPythonサンプルプログラム ダウンロード

PythonTest.zip ラズパイでDL、またはWindowsからsambaでラズパイにファイル移動。

ねこっぴ

プログラムで遊ぶフォルダをねこっぴは「Programming」フォルダにしてるけど、好き好きでよいにゃ。ねこっぴの場合はこんな感じ。

サンプルファイルを展開。

ぴぽこ

元の圧縮ファイル消してすっきりしたね。

.pyを簡単にThonnyで開けるようにする。

ねこっぴ

pythonTest1.pyからお話していくにゃ。ついでに
.pyファイルをダブルクリックで開けるように関連付けしちゃうにゃ。

今回のお話の Thonny 設定
ねこっぴ

ちょっと最初どうなってたか忘れちゃったけど、もし初回でコレが出たら日本語にするにゃ。

ねこっぴ

出なくて英語だったらまず、ThonnyのWDの右上 「Switch to regular mode」をクリックして regular modeに。そしてThonny再起動。
再起動したらTools → Options から日本語にするにゃ。また再起動。

ねこっぴ

フォントはこの状態でスクショ取ってブログの記事にしてるにゃよ。「ツール」→ 「OPTION」 (初期状態のままかも)

サンプルファイルを見ていこー!

ねこっぴ

さて今回のサンプルプログラムを見ていくにゃよ。

ぴぽこ

まず説明聞く前に実行してどんなんか見てみます。
実行アイコンプッシュ!

ぴぽこ

どっかで見ましたよ….! あっ X68000の実験ときと同じなのね!

ねこっぴ

X68000同様 キーボードのテンキー 4,6,8,5 で上下左右。
今回は みなさんちのキーボードがテンキー付きじゃないかもなので カーソルキー でも移動できますにゃ。

ブログの主 独学番長はPython慣れてない上、今回のPythonのGUIモジュール tkinterは今回使うのが初めてです。(Python勉強時にはwxPythonという違うGUIモジュールをつかってました。) 多々間違えがあるかもなのでご了承くださいませ。

Pythonのパターンを見極める

ねこっぴ

ちょっと強引にlabel自体を動かしてキャラにしてるけど、プログラミングの考え方という点の説明なのでPythonの流れのパターンをまず説明するにゃよ。

Pythonのパターン

1:import文 (使うモジュールを書く)

2:まえおき。このプログラムに必要な定義とか変数とか書いちゃう。

3:サブルーチン

4:サブルーチン

5:メインプログラムを書く。

6:ループ!

ねこっぴ

Pythonのサブルーチン(関数)は、def というやつにゃ。

ねこっぴ

PythonはBasicと違って行は書かないけど
説明する用に行番号を言うにゃよ。
5:の 31行目から37行目までは、ある意味前置きなので2のグループでも良いにゃ。注意は、Pythonはサブルーチンを呼び出すときは、サブルーチン defのあとに書く。38行目ではprint_Ichiを呼んでるにゃ。これ2のグループに混ぜるとエラーになっちゃうにゃよ。

ぴぽこ

前回のBasicのサブルーチンは func だったね。前回は func前に呼んでても大丈夫だったけど、Pythonのときはあとっておぼえとこっと。

Python独自の書き方を見極める

ねこっぴ

実際の書き方の時のPythonの特徴にゃ。

Pythonの書き方パターン

1: 空白っていうか段落っていうかインデントっていうか。Pythonでは超重要

2:defとか IFのあとは 「:」が必要 忘れがち。

3:IFのときは イコールふたつ。

ぴぽこ

その行の書き始めの位置、空白後の位置。これが重要なのね。

ねこっぴ

フォルダ分けなイメージかにゃ?
最上位のフォルダ、その中のフォルダ….
うまく伝わるかわからにゃいけど6行目の def で例えると…..
フォルダ内を上から順番に実行、みたいな
IFのとこは条件一致でそのフォルダに入って わったら上位フォルダに戻り次の命令…。

ねこっぴ

あとは、「:」や IF文の 「==」は、エラー出るから あ忘れた!
でその内覚えるにゃ。 でもこのインデントミスはプログラム複雑になっていくと思う結果にならなくて原因探しまくったら間違えてた!みたいなめんどくさいことがあるかもなので注意かも。

今回のプログラムを細かく見ていきますよ。

ねこっぴ

じゃ順番に見ていこーかにゃ!

import

ぴぽこ

import tkinter
これ今回はGUIのウインドウに表示するために tkinterっていうモジュールを使うよ、ってことよね?モジュールっていうのが良くわからないのよね。

ねこっぴ

外部で用意されたでっかいサブルーチンみたいなもんかにゃ? 初期状態でインストールされているものもあるし、あとでインストールして組み込んでから使うもの、いろいろあるみたいにゃね。自分でも作れるらしい。ちょっと実験してみよー。

オリジナルモジュール実験のお話はここを開いてね。

ねこっぴ

この4つをThonnyで開いて準備してにゃ。タブ4つ状態。

import 実験1

ねこっぴ

moduleTest_MainA.py これがほんちゃんプログラムとしますにゃ。
ここで呼ぶ予定のモジュールはmoduleTestA.py

ほんちゃんプログラム
オリジナルモジュール
ねこっぴ

ほんちゃんプログラム moduleTest_MainA.py実行。

ぴぽこ

moduleTest_MainA.py 4行目のmoduleTestA.Sub_02()
moduleTestA.pySub_02 print文が実行されてるのね。なるほど。

ねこっぴ

ちなみにオリジナルモジュール moduleTestA.pyそのまま実行だと、サブルーチンしか書いてないから実行してもなにもならないにゃよ。

import 実験2

ねこっぴ

次はmoduleTest_MainB.py これがほんちゃんプログラムとしますにゃ。
ここで呼ぶ予定のモジュールはmoduleTestB.py

ぴぽこ

あれ、なんかmoduleTestB.py
Pythonプログラムでよく見る謎コードあるね。

ほんちゃんプログラム
オリジナルモジュール
ねこっぴ

ほんちゃんプログラム moduleTest_MainB.py実行。

ほんちゃんプログラム実行結果
ぴぽこ

???? 混乱!! どういう状況??

ねこっぴ

オリジナルモジュール moduleTestB.pyそのまま実行してみようにゃ。

オリジナルモジュールからの実行結果

以上の結果から….。

謎変数について

「__name__」という謎変数には、

ほんちゃんプログラムからimportされて実行される場合「呼んだモジュール名が代入される

モジュールを直で実行した場合「__main__が代入される

代入結果から…、

ほんちゃんプログラムから実行 if __name__ == 「__main__ 不一致。この先には行かない。

モジュールを直で実行 if __name__ == 「__main__: 一致。この先が実行される。

ぴぽこ

謎変数はわかったわ。でも、moduleTest_MainB.py
import moduleTestB
moduleTestB.Sub_02()

で、Sub_02の結果Sub02_OKだけが表示されると思ったのに、
なぜ「名前が変わるよ~」のprint文まで実行されてるんだろ。

試しに import だけを実行してみる。

import moduleTestB だけを実行してみる。

結果 import文のみだけでmoduleTestB.pyが実行される。

ぴぽこ

なるほど。
importで1回実行されてdefが飛ばされつつprint文が実行される。
moduleTest.Sub_02() でmoduleTestB.py のSub_02だけ実行される。
結果 「名前が変わるよ~」「Sub_02_OK」の順になるのね。
使い方を完全把握しないとややこしいね….。

pythonの変数のお話

ねこっぴ

次はここのとこ。変数にゃ。X68000ではint(整数)、str(文字列)だったので似せたんだけど、Pythonの場合は 変数型指定しなくても大丈夫にゃ。

X-Basicのばあい
X:int=96 #intをいちおう指定する方法
Y:int=84 #intをいちおう指定する方法
X=96 #これでもOK
Y=84 #これでもOK
ぴぽこ

やっぱいろいろ違うね。

ねこっぴ

大丈夫にゃ。「Python」「変数」「整数」「文字列」google先生でテキトーに検索すれば構文すぐ出てくるにゃ。正確に覚えなくてヨシ。変数には型がある、とだけなんとなく覚えとけば大丈夫。

ねこっぴ

ただ、Pythonの変数で最初 番長も悩んだところがあってにゃ。全部に効果がある位置に変数を記入しても、中身を書き換えるときは「global」を書いてやらなきゃだめっぽいにゃ。下のサブルーチンとこのにあるにゃね。

サブルーチンのお話

ねこっぴ

今回は3のとこでちょっと特殊なサブルーチンつかってるにゃよ。

ぴぽこ

特殊?

ねこっぴ

プログラム中で subroutine() とかで呼ぶんじゃなくて、バインドっていうやつなんだけど、全自動、連動みたいなイメージでいいかにゃ。あとで説明するにゃ。

メインプログラム部分。

ねこっぴ

メインプログラムっていうか、プログラムの内容によってはループさせるサブルーチンに飛ばしたりなので、メイン部分はどこだと言われるとさまざまだとは思うんにゃけど、今回はウインドウを使ってる部分をもってきたにゃ。

ぴぽこ

冒頭であるように、まえおきに書いても大丈夫な部分だよね。設定部分というか。38行目はダメ…でしたっけ。

ねこっぴ

まとまってると説明しやすいからこうしてあるにゃよ。importした、GUIでプログラムが組める tkinterを使ってウインドウを表示する部分にゃ。
ウインドウを表示して、文字を表示するパーツ(label)を2つ作ってその一つをキャラとして移動させるかんじで書いてあるにゃ。

ぴぽこ

カンだけどタイトルの文字、ウインドウサイズ、ラベルの文字と位置が書かれてる最初の定義って感じね。

ねこっぴ

そんな感じにゃ。
番長もはじめて tkinterを使ってるけど、アレンジでボタンを設置して操作させたりしたい場合は「 tkinter」「ボタン」とかでいくらでも検索かかるはずにゃから、余裕できたら調べてみるのも楽しいかも。
print_Ichi()は、X68000と同じくスタート時にキャラ表示させるためにゃよ。

ループ部分。

ねこっぴ

X68000のときはwhile文でキーインプット部分をループさせたにゃ。 tkinter は ボタンとか設置してボタンを押されたときのイベントを def で記入して41行目みたいに書いとけば自動的にボタン押されまちループが出来上がるっぽいにゃ。だけどマウスの入力待ち、キーボードからの入力待ちはバインド(bind)という方法をするにゃ。

ぴぽこ

ここがサブルーチンで特殊だっていってた部分ね。
このbind文を書けば、キー入力まちサブルーチンが自動でぐるぐるまわってくれてるイメージなのね。いつでも待ちになってる、みたいな。

Thonnyで実際ながれを追ってみよう。

ねこっぴ

Thonnyのデバッグモードで1行づつどういう流れでプログラムが動いてるかわかるにゃ。やってみよう!pythonTest1.pyを開いてこのボタンにゃ。

ねこっぴ

そしてつぎからはここのボタン。順番に実行されるにゃ。

ぴぽこ

おもしろいね! ちゃんとサブルーチン def に飛んでたりして!

ねこっぴ

ここまできたらキー入力待ちになってるにゃよ。キー押してみて。

ぴぽこ

キーを押したらキー入力待ちルーチンに行ってるね!
ステップインボタンでその続きも見れます!

ねこっぴ

あと、print(key.keycode) で押されたキーをシェルに表示してるにゃ。この数値を見てカーソルキーやテンキーの数字確認して設定したにゃよ。

もうぜんぜんUARTと関係ないけどあたり判定。

ねこっぴ

pythonTest2.pyに、ちょー簡単なやつの当たり判定入れてあるにゃ。単純にXY軸が※マークと一致であたり、という判定にゃ。ちなみにXY軸の12づつ増やしてるのはなんとなく動かしてるlabelがキャラ単位で動いてるかんじの数値にゃよ。

ぴぽこ

なんか細かい数字だと思ったのはそういうことだったのね。
なんとなくPythonもわかってきましたーよー!



Contents