====== プログラミング文法一覧 ====== このページは,馬場が意気揚々と学生にプログラムを書いて見せたところ,SwiftのプログラムだったのにPythonで書いてしまったことから,普段はインタラクティブプログラム(ProcessingやOpenframeworks)をやっているひとがpythonやswiftを記述する際の要点まとめやチートシートになればと思い,書きました.わかりやすくそれぞれの記法を並列に記述していくので,ブラウザの横幅を広げておくと使いやすいです. 下記を実際初めて学習する場合は,手元で実際に問題なく実行できるか確認できた方がよいので,事前に下記の環境を整えて,記述したプログラムを 実際に実行して動作を確認しましょう. * [[プログラミング入門:コマンドラインからプログラムを実行しよう]] このページではあくまで基本的なことを抑えることに着眼しているので,それらの情報詳細には別途リンクを貼っておきます.読み足りなかったりもう少し 詳細を知りたい場合はそちらのリンクを参照して下さい.なおそれぞれの記法比較ではそれぞれ processing, of, python, swiftで同じ内容を実行する コードを記載しておきます.ただofはc++なので,記載に関してはc++の記載にて統一しています. ===== 変数 ===== 変数の宣言方法について.そもそもここからpythonやswiftは異なります.下記に対応表を示します. ^ 型名\言語 ^ Processing ^ Openframeworks ^ Python ^ Swift ^ | 真偽値 | boolean 変数名; | bool 変数名; | -- | var/let 変数名: Bool | | 整数 | int 変数名; | int 変数名; | -- | var/let 変数名: Int | | 浮動小数 | float/double 変数名; | float/double 変数名; | -- | var/let 変数名: Flaot/Double | | 文字列 | string 変数名; | string 変数名; | -- | var/let 変数名: String | このように,pythonでは型を宣言せず,Swiftでは変数には var, 定数には letを利用して宣言を行います.Swiftでは明示的に型を指定することができ,varまたはletの後に変数名:型名 とします.ただし,var value = "Hello" とすれば自動で文字列型になりますが,この時は必ず初期値を与えなければコンパイルエラーになります. ==== 変数宣言の比較 ==== Processing int value = 0; c++ int value = 0; Python value = 0 Swift var value: int = 0 ===== 配列 ===== 配列を扱う場合ではofとprocessingで異なることからよく間違うのですが,これもpythonやswiftがそれぞれ記法が異なるため注意が必要です. ただし,python,swiftともに,c++でいうところのVectorやlist型に近いものが配列になっているのに対し,ofやprocessingではメモリ空間に連続して 領域を確保する原始的な配列になります.言い換えればpythonやswiftではそのような原始的な配列宣言や操作はもはややめましょう.というとこです. 基本的なところで言えば,PythonやSwiftでは,最初に配列サイズを決める,ということは前提ではありません.一方でofやprocessingではlist, vector型を意図的に使わなければ配列サイズを決めずに配列を作っていく,ということができません.python, swiftは配列を扱う,これ即ちlist型になる.という捉え方がよいです. print関数を使った値の表示に関しては,javaやc++では直接参照したい値を渡す必要がありますが,pythonやswiftでは変数名をそのまま渡してしまえば,後は勝手に適切な表示を行なってくれます.もちろん直接表示したい時は同じように参照して表示することもできます(その部分はそれぞれpython, swiftのコード上でコメントアウトしているので参照してください). ==== 配列宣言と操作比較 ==== Processing int array[]; // int[] array; もOK array = new int[3]; array[0] = 0; array[1] = 1; array[2] = 2; print(array[0]+","+array[1]+","+array[2]); c++ #include int array[3]; int main() { array[0] = 0; array[1] = 1; array[2] = 2; printf("%d,%d,%d\n",array[0],array[1],array[2]); } Python array = [] array.append(0) array.append(1) array.append(2) print(array) #print(array[0],array[1],array[2]) Swift var array:[Int] = [] array.append(0) array.append(1) array.append(2) print(array) // print(array[0], ",", array[1], ",",array[2]) ===== 条件分岐(if文) ===== 基本的にはそんなに大きな違いはありません.if とその条件を示すものでOKです.processing, c++, swiftは理解しやすいと思いますが,pythonだけ すこし書式が異なります. - {}(波括弧)が省略される - 条件文の後に:(コロン)がつく - 条件の分岐先は必ず字下げ(インデント:タブ等で行頭をあける )を行い,処理をまとめる 特に3つ目のインデントについては独特なのでしっかり抑えておきましょう.一般的な言語では処理の単位を{}(波括弧)でまとめることをやったり しますが,pythonでは{}(波括弧)は使わずにインデントのみで行います. ==== if文の比較例 ==== Processing int value = 10; if( value > 5 ){ print("bigger than 5"); } Openframeworks int value = 10; if( value > 5 ){ print("bigger than 5"); } Python value = 10 if value > 5 : print("bigger than 5") Swift var value:Int = 10 if value > 5 { print("bigger than 5") } ===== for文 ===== for文もループ回数の指定について,python, swift共に少し異なります.三つの配列の値をforループで表示するプログラムを下記に示します. ポイントとしては,ループする回数指定が少しスマートになっているところです.もちろんc++でも同じようなことはできます.c++の例2で紹介するように vector型を利用することで,配列サイズに動的に調整したループを実行することができます.pythonやswiftではあまり手打ちでforのループ回数を設定 せず,対象となる変数や配列のサイズに応じてループをさせるのが基本として考えてください. ==== for文の比較例 ==== Processing int array[]; array = new int[]{0,1,2}; for( int i = 0; i < 3; i++ ){ println(array[i]); } C++例1 #include int array[] = {0,1,2}; int main() { for( int i = 0; i < 3; i++){ std::cout << array[i] << std::endl; } } C++例2 #include #include std::vector array{0,1,2}; int main() { for( int i = 0; i < array.size() ; i++){ std::cout << array.at(i) << std::endl; } } Python例1 array = [0,1,2] for a in array: print(a) Python例1 array = [0,1,2] for a in range(0,3): print(a) Swift例1 var array:[Int] = [0,1,2] for i in array{ print(i) } Swift例2 var array:[Int] = [0,1,2] for i in 0..<3{ print(i) } ===== 関数 ===== 二つの引数を掛け算したものを返す関数を例にそれぞの記述を比較してみます.pythonの記法が型に関わる部分が省かれているのでだいぶスッキリして みえます.pythonでも型を明示することは可能ですが,このように無駄な記載を省き,可読性を向上させる工夫がなされています.swiftのように型の 明示を死守することは,ハードコーダーにはうれしかったりします.それぞれ一長一短なわけですが, ==== 関数記述の比較 ==== Processing int calculate(int x, int y) { return x*y; } void setup() { print(calculate(2, 5)); } Openframeworks #include int calculate(int x, int y){ return x*y; } int main() { std::cout << calculate(2,5) << std::endl; } Python def calculate(x,y): return x*y print(calculate(2,5)) Swift func calculate(x:Int, y:Int) -> Int{ return x*y } print(calculate(x:2, y:5)) 以上、簡単ではありますが、それぞれの代表的な言語を題材に文法比較を行いました。基本的には自分の頭の整理と忘備録のために作成しています。みなさんのお口に合うでしょうか?