タイトルに偽り有ります。
.NETじゃなくて、C#との比較。
pukiwikiの制限でタイトルに#が使えないのでタイトルには.NETと書きました。
また、比較に用いているのはそれぞれ
ライブラリを使用するために、コーディングする上で必要なことは以下の2点
ライブラリ(Pythonではモジュールに対応)の使用にあたっては、実行されるソースコードを記載したファイルからライブラリが参照できるように設定される(参照設定される)ことが最低限必要となる。
ここで、参照設定がされただけでは、単にライブラリ内のメソッドを使用できるに過ぎず、実際にソースコード上で使用するにあたっては、ライブラリ内の名前空間+メソッド名を記載する必要がある。毎回、名前空間+メソッド名を記載するのは非効率的なため、特段問題が生じない限りにおいては、デフォルトの名前空間を設定し、ライブラリ内のメソッド使用時に、名前空間の記載を省略できるように設定することが、望ましい。
名前空間は、同じクラス名で中身の違うクラスを区別するために付けられたIDのようなもの。
クラス名とは、別物。ライブラリ名と一致するとは限らない。
ただし、.NETの場合DLL名を『名前空間+クラス名』とすることが推奨されている。(ので、うっかり名前空間とクラス名を同じものと理解してしまっても止むを得ない。と思う。)
C#の場合、1つのライブラリの中に、複数の名前空間があり、各名前空間の中に複数のクラスがある。
Pythonの場合、モジュール名と名前空間とは同一であり、モジュール内に複数のクラスがある。
C# | Python | |
ライブラリXを使用 | (別途設定) | import X |
ライブラリX内の名前空間Aを使用するようにデフォルト名前空間を設定 | using A | import A from X |
AにBという別名をつけて使用 | using B = A | import A from X as B |
C#のusingは、デフォルトの名前空間を指定する(メソッド呼び出しに名前空間を指定するのを省略する)に過ぎない。
参照設定は、別途設定する必要あり。(ビルド時に、コンパイラにパラメータとして、参照するdllの情報を渡す?)
Pythonのimportは、モジュールを参照する。fromの有無で、importの役割が微妙に異なることに注意。
from無し→モジュールを参照、from有り→モジュールのうち使用するクラスを指定。
ていうか、Pythonの場合、ソースコードはそのまま、文頭から順次実行される。
一方、C#の場合は、C#で書かれたソースコードをMSILに変換するにあたり、メイン関数を指定してないと現状変換できない(ので、ビルド時にエラーになる。てことはあれか、メイン関数が必要なのはMSILに変換するコンパイラの仕様か?)。
ところで、オブジェクト指向言語においてメイン「関数」って呼び方していいんですかね?正しくは、C言語におけるメイン関数に相当するもの、って言ったほうがいい??
C#
static void Main(){}
Python
if __name__ == "__main__":
直接実行されたソースコードファイルの場合のみ、
__name__変数には、__main__が入る。
このため、仮に、実行されたソースコードファイルから
呼び出されるソースコードファイルにメイン関数のようなものが記入されていても
if __name__ == "__main__":
に続いて、そのメイン関数みたいなものを書いておけば、
実行されずに済む。
C#
// 以降、文末までがコメントして扱われる /* 複数の文のコメントアウトも可能 */
Python
# Perlと同様、この記号で文末までコメントアウト ''' シングルまたはダブルクオテーション3つで囲んで、なおかつ これらの記号と同じインデント内に配置すれば、コメントアウトっぽく扱うこと可能 (単に、複数文を文字列にしているに過ぎないことに注意) '''
'''によるコメントアウト方法は、
クラス、関数/メソッド宣言の際にそれらの内容を説明するドキュメントの生成に使われる。
この場合、'''に続いて、要約文を。次に空行を挟んで、引数の説明などを自由形式で記述する。
ドキュメンテーションの方法については、詳しくは下記参照。
http://www.python.jp/doc/2.4/tut/node6.html
C#
if() { } else if () { } else { }
elseifは、用意されていないので、ifの入れ子を用いる。
注意点として "{}"を省略した場合、空行を挟むまで続く行が
全てifの入れ子として扱われる。
if(false) MethodA(); // falseの場合にMethodAが実行されないのは明らかとして MethodB(); //このMethodBも実行されないことに注意 //こんな風に書くと、、、 if(flag1) MethodA(); if(flag2) MethodB(); //こう解釈されることに注意 if(flag1) { MethodA(); if(flag2) MethodB(); //if(flag1)の入れ子内の処理と解釈される }
Python
if : #..... elif #...... else
C#
switch() { case x: break; //必須 case y: goto default; //個人的に好きじゃない。 default: break; }
Pythonに、switch構文は存在しない。
switch構文っぽくみせるテクニック
参考サイト http://surgo.jp/2008/11/pythonswitch.html
C#
do〜whileループあり。 while(){ //break; //continue; } do{ }while()
Pythonはelseの定義可。注意点としては、whileの条件式判定の結果、else節のコードに飛ぶので、break文で抜けた場合には、else節のコードは実行されない。
while : #continue else #break
C#
foreach(var a in x) { //.......... }
Python
for a in x : .....
PythonはforがC#でいうところのforeachの役割を果たす。
C#
開始条件、終了条件、繰り返し時の実行式を全て任意に設定可能。(複数の式を突っ込むことも可能。また、これら3つの式に依存性がなくても問題ない。3つの式はすべてオプション扱い。)
for(int i=0; i<max ; i++) { }
Python では、range関数で連番を生成できる。
for a in range(max) : #............
また、ループ回数を取得したい場合
listA = ["A","B","C"] for i, value in enumerate(listA): print "%d %s" % (i, value)
http://php6.jp/python/tips/enumerate/
とすると良い。
C#,Pythonともに同じ
C#
break continue
Python
break continue
C#では、数値計算時のオーバーフローをチェック可能
checked{ //計算 }
Pythonでは該当する構文見つからず。
Python
try: try_something ... except Exception_1: handler_1 ... except Exception_2: handler_2 ... else: do_something_unless_exception ... finally: this_is_always_done ...
try節 実行時にエラーが発生しなかったらelse節を実行
C#
try { //例外が投げられる可能性のあるコード } catch(例外の種類) { //例外処理コード } finally { //例外発生の有無にかかわらず実行したいコード //リソースの破棄などを行う }
C#でいうX.Contains() !X.Contains()
C#
// <条件式>? <正の場合の値> : <偽の場合の値> int a = (x > 5) ? 10 : 0;
Python
# <正の場合の値> if <条件式> else <偽の場合の値> a = 10 if x>5 else 0
C# | Python | |
配列 | T[] | [a,b](リストで兼用) |
リスト | List<T> | [a,b] |
タプル | Tuple<T> | (a,b) |
連想配列 | Dictionary<T1,T2> | {"a":x,"b":y} |
お題:引数を2倍する関数
C#
//匿名メソッドを参照する変数(クロージャ)を用意したい場合 (C#2.0) delegate double bai(double x) = new delegate(double x){ x*2; } //C#3.5から採用された汎用のデリゲート型を用いるなら Func<double,double> bai = new delegate(double x){ x*2; } //使いきりであれば、C#3.0から採用されたラムダ式を使用 //ラムダ式を用いる場合、引数については型推論が働くので型の指定が省略可能な場合がある。 (x) => x*2; // また、文が可能 (x) => {HogehogeMethod(); return x*2;}
Python
bai = lambda x: x*2
Pythonの場合、式のみ可。文は無理。
JavaプログラマーのためのPython比較メモ
http://akj.akjava.com/javapython_gwtext/Main.html
Python 101
http://www.ibm.com/developerworks/jp/linux/library/l-python.html
PythonのリストとJavaのリストの比較 - Sticker@Something
http://d.hatena.ne.jp/hikm/20080221/1203619883
Java and Python « Python Conquers The Universe
http://pythonconquerstheuniverse.wordpress.com/category/java-and-python/
PythonとJavaのコード比較 - モジログ
http://mojix.org/2003/07/21/233418
配列操作の比較表: Ruby, Python, JavaScript, Perl, C++ - bkブログ
http://0xcc.net/blog/archives/000043.html
配列操作の比較表:Java,PHP,Python,Ruby : fujishinko 雑記帳
http://mblog.excite.co.jp/user/fujishinko/entry/detail/?id=6792747
python tips ― 002 for ループ構文:python と C/Java との比較 « Python sf
http://loboskobayashi.wordpress.com/2010/01/31/python-tips-002-for-%E3%83%AB%E3%83%BC%E3%83%97%E6%A7%8B%E6%96%87python-%E3%81%A8-cjava-%E3%81%A8%E3%81%AE%E6%AF%94%E8%BC%83/