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"