lispとrubyとpythonと(python)
つぎ。python。
書いたの始めてに近いから間違ってるかも。
# -*- coding:utf-8 -*- #↑日本語とおすため #コメントは#で始める #後で使う(withステートメント) from __future__ import with_statement import sys #標準出力に表示 print "こんにちは" #,をつけると改行がつかない print "こんにちは", #改行は\n print "こんにちは\n" #タブは\t print "こんにちは\tこんにちは" #フォーマット print "こんにちは%s" % "世界" #pythonのprintは文らしい。ゲゲ #文だからこれはだめ #p = print #文字列に出力 from StringIO import StringIO strm = StringIO() print >> strm , "こんにちは%s:%s" % ("あ","い") print strm.getvalue() #関数定義 def fun0(msg): print "「%s」を引数としてfunが呼ばれた" % msg #条件分岐 def fun1 (n): if n < 10: print "10未満" else: print "10以上" def fun2 (n): if n == 0: print "0です" elif n < 5: print "5未満です" elif n == 5: print "5です" elif n > 5: print "5より大きいです" #繰り返し def fun3(n): for i in range(n): print "繰り返し%s回目" % i def fun4(n): i = 0 while(i < n): print "繰り返し%s回目" % i i = i + 1 else: print "ブレーク以外で終了した" ##こんなのもアリか ##にしてもprintが文なのは微妙じゃないか、と思ったら ##python3000では関数になるらしい ##よかった def p0(s): print "繰り返し%s回目" % i def fun4_1(n): map(p0,range(n)) #定数定義 #pythonには定数がない?? #変数 ##トップレベルで宣言するとグローバル変数 val = "グローバル" print val ##グローバル変数は関数の中でも見える def fun5(): print "fun5 関数の中:%s" % val fun5() ##グローバル変数を関数の中で書き換えることはできない val = "グローバル" def fun6(): val = "関数の中で書き換え" print "fun6 関数の中:%s" % val fun6() print "トップレベル:%s" % val ##global宣言すればグローバル変数を関数の中で書きかえることができる val = "グローバル" def fun7(): global val val = "関数の中で書き換え" print "fun7 関数の中:%s" % val fun7() print "トップレベル:%s" % val ##globalsでグローバル変数の一覧がとれる def listGlobals(): print "グローバル変数の一覧" for v in globals(): print v listGlobals() ##localsでローカル変数の一覧がとれる def fun8(): a = 0 b = 0 c = 0 print "ローカル変数の一覧" for v in locals(): print v fun8() ##del文で変数を削除できる ##hashで持ってる感じ。あと関数と変数で名前空間が分かれてない。 #schemeと一緒やね。 del val listGlobals() #クラス定義 class Cls0: "テスト用のベースクラス" slot0 = "" slot1 = "" ##コンストラクタ def __init__(self): self.slot0 = "初期値" self.slot1 = "初期値" def set(self,val0,val1): self.slot0 = val0 self.slot1 = val1 def disp(self): print "Cls0 %s:%s" % (self.slot0,self.slot1) ##継承 ##多重継承もあり class Cls1(Cls0): slot2 = "" ##引数付きのコンストラクタ def __init__(self,val2): ##基底クラスの呼び出し Cls0.__init__(self) self.slot2 = val2 def set(self,val0,val1,val2): Cls0.set(self,val0,val1) self.slot2 = val2 def dispp(self): print "Cls1 %s:%s:%s" % (self.slot0,self.slot1,self.slot2) o0 = Cls0() o0.disp() o1 = Cls1("初期値2") o1.disp() #ラムダ式 ##pythonのラムダには文が渡せない。からこれはだめ ##f = lambda s:print(s) ##これなら大丈夫(なんだかなぁ・・・) def p(s): print s f0 = lambda s:p(s) f0("こんにちは") ##引数が二つのときはこんな感じ f1 = lambda a,b:p(a + b) f1("あいうえお","かきくけこ") #クロージャ def make_decorator(prefix,suffix): return lambda (s) : prefix + s + suffix decorator = make_decorator("<",">") print decorator("html") #pythonと言えばジェネレータ(らしい) ##イテレータプロトコルを持つクラス class Cls2: def __init__(self,initval): self.val = initval def __iter__(self): return self def next(self): rtn = self.val self.val = self.val + 1 return rtn o2 = Cls2(0) for i in o2: if i > 2: break print "ループ:%s\n" % i ##ジェネレータ ##C#のyieldと同じ感じ def repeat(n,val): for i in range(n): yield val for v in repeat(3,"value"): print v #pythonでRAIIといえばwithステートメント #最初のこれはここのため #from __future__ import with_statement #import sys class Cls3: def __init__(self,data): self.data = data def __enter__(self): print "__enter__" def __exit__(self, type, value, traceback): print value print "__exit__" return True def disp(self): print self.data ##こっちはうまくいくけど o3 = Cls3("データ") with o3: o3.disp() print "top" ##こっちがダメなのがわからない。 # with Cls3("データa") as o4: # print "::" + o4 # o4.disp() # print "top"