2021年現在、仕事では 「C# + C言語のDLL」の開発がほとんどで、Pythonを使う機会が無いのですが、さすがに Python を勉強するか?と思っています。
しかし、C#脳でPythonを勉強していると、なんで、こうするの?と思う事がよくあります。
でも、私がVB6.0から→(C++/CLI)→C#に乗り換えた時もC#の何がいいの?とか思ってましたが、今はC#最高!になってます。(C++/CLIはやらなきゃ良かった。。)
Python最高!になる日は来るのだろうか??
(2021.5.22追記)
Pythonを集中的に勉強しだしてから半年たちましたが、ようやくPythonでもいいかも?と思えるようになってきました。最初の1か月ぐらいはPythonが嫌でしょうがなかったですけどねww
開発環境もVisual Studio2019であれば、デバッグなどはC#と同じようにステップ実行やウォッチなども使えるので便利です。Visual Studio Codeも使ってみましたが、コーディングはVS Codeの方がやりやすいように感じましたが、デバッグは慣れもあって、Visual Studioの方が良かったです。
Visual Studio2015も使いましたが、Pythonの環境を構築するのが難しくて断念しました。
Pythonを始めてモヤモヤポイントがGUIをどうするの?というのがあったのですが、tkinterを使うとC#と同じようなGUIを作る事ができます。
Pythonは処理時間が遅くない?という思いもありましたが、OpenCVやnumpyなどを使えば処理が遅い事は無いですし、C#でやっていた時のように重たい処理はC言語ライブラリを作成し、DllImportで関数を呼んでいたのと同じ様に、Pythonではctypesというモジュールを使うと、C言語ライブラリの関数を呼ぶ事が可能になります。
あとは、Pythonではフリーで使えるライブラリが圧倒的に多いので、目的に合ったライブラリが見つかれば、開発時間の短縮にもつながると思います。
以下は、C#から見たときのPythonの違いを書いています。
構文的な違い
- 終端文字(;)が無い
- if文やfor文などの中カッコ({})が無い代わりに、行の最後にコロン(:)を付けてインデントを揃える
- クラスのNewがない。
Newが無いので関数を呼んでいるのか?クラスをインスタンスしているのか?分かりづらい - クラスにprivate/publicが無い。基本、publicだが代替手法がある
- オーバーロードがない。→デフォルト引数で代替できるところまで。
- ラベルやボタンなどのC#で言うところのコントロールはPythonでは ウィジェット(widget)という
- 特殊メソッドなるものがある
型宣言がない
int a = 123;
string b = "abc";
a = 123
b = "abc"
型が無いのに型違いでエラーになる事もあり、なかなか慣れません。。
とくに関数に変数を渡す時がわかりずらい。
型を調べるには type()関数を使うとできます。
a = 100
b = "abc"
print(type(a))
print(type(b))
# 型が XX かどうか?
if (type(a) is int):
print("int型です")
elif (type(a) is float):
print("float型です")
elif (type(a) is str):
print("str型です")
else:
print("その他の型です")
実行結果
<class ‘int’>
<class ‘str’> int型です |
型は、全てがC#でいうところのobject型に近い
行のコメント
// 一行のコメント
# 一行のコメント
行の先頭にシャープ(#)を付けます。
複数行のコメント
/*
複数行の
コメント
*/
"""
複数行の
コメント
"""
シングルクォーテーション(‘)を3つ(”’)もしくは ダブルクォーテーション(“)を3つ(”””‘)でコメントにしたい部分を囲います。
関数のコメント
/// <summary>
/// aとbを足す
/// </summary>
/// <param name="a">足す値a</param>
/// <param name="b">足す値b</param>
/// <returns></returns>
private static int Add(int a, int b)
{
return a + b;
}
C#では、関数の上の行でスラッシュ(/)を3つ(///)書くと、XMLコメントのフォーマットが表示されるので、そこにコメントを記載します。
def add(a, b):
"""
[概要]
aとbを足したものを返す
[パラメータ]
a : 足す値a
b : 足す値b
[注釈]
aとbは同じ型のこと
"""
return a + b
関数名の行の下にインデントして、シングルクォーテーション(‘)を3つ(”’)もしくは ダブルクォーテーション(“)を3つ(”””‘)でコメントにしたい部分を囲います。
一般的なコメントの定型は分からないのですが、上記プログラムのように記載すると、開発環境によって、以下のように関数の説明が表示されます。
インクリメント/デクリメント
int i = 0;
i++; // インクリメント
i--; // デクリメント
i = 0
i += 1 # インクリメント
i -= 1 # デクリメント
値の代入は参照渡し?
まずは下記のサンプルをご覧ください。
a = 100
print(id(a))
a = 200
print(id(a))
b = a
print(id(b))
実行結果
10917664
10920864 10920864 |
id()関数はポインタ?みたいなのを取得できる関数がすが、上記の例では a に値を入れるたびに id が変わっています。さらに b に a を代入すると、a と b の id は等しくなります。
ただし、C#の参照渡し/値渡しの感覚とは少し異なるので注意が必要です。
どちらかというと、ポインタの値渡し(アドレスの値を渡す)と言った方が近いかもしれません。
まとめ
C#とPythonの違いは、当然ながら他にもたくさんありますが、個別にまとめたいと思います。
PythonはC#と比べて、処理は遅そうだし、画像の表示(フレームレート)も遅そうだし、GUIプログラムを作るのも大変そう。。と不安に思いながら勉強していてます。
Pythonの場合、処理をベタに書いている(クラスではない)例の紹介が多く、さらに、ほとんどがCUI(Character-based User Interface)なので、クラスでGUIなC#に慣れていると、どうしても抵抗があったのですが、GUIモジュールのTkinterをクラスで書き始めると、少しPythonの抵抗が薄れ始めています。