====== プログラミング文法一覧 ======
このページは,馬場が意気揚々と学生にプログラムを書いて見せたところ,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))
以上、簡単ではありますが、それぞれの代表的な言語を題材に文法比較を行いました。基本的には自分の頭の整理と忘備録のために作成しています。みなさんのお口に合うでしょうか?