C#erによるPython学習、C#とPythonの違い

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の抵抗が薄れ始めています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください