[an error occurred while processing this directive]
[an error occurred while processing this directive]
基本的なTips
まずはHello
str = "Hello, Py!\n"
print str
f_name = "Kei"
l_name = "Takahashi"
print "Hello, %s %s\n" %(f_name, l_name)
%sは後ろの変数リストで順番に置換されます。
変数展開
perlの変数展開みたいなことをしたかったら、"%(変数名)型"と書いて、最後にlocals()を書く。
name = 'kei'
text = 'Hello, %(name)s" %(locals())
改行が入る長い文字列だとこんな感じ。
name = 'kei'
msg = "hello"
print """
To : %(name)s
Message : %(msg)s
"""%( locals() )
とすると、%(name)sと%(msg)sが変数nameと変数msgの内容に置換される。
配列
A = ('red', 'freen', 'blue')
color = A[0]
長い文字列
str = """hello,
I
am
a
warlus
"""
print str
chompのかわり
perlのchomp()みたいに、文末の余計な改行を削除するには、strip()を用いる。
a = "abc\n"
print a.strip()
乱数
乱数cgi。
#!/usr/bin/python
import whrandom
col = ('#f00', '#0f0', '#00f')
pat = ('Goo', 'Chok', 'Par')
r = whrandom.randint(0, 2)
print "Content-type: text/html\n\n"
print "<html><body style='color:%s;'>%s</body></html>" %(col[r], pat[r])
ループ
for文、だけどforeachっぽい。
print "<table>"
for i in range(3):
print "<tr>"
for j in range(4):
print "<td>i=%d, j=%d</td>" %(i, j)
print "</tr>"
print "</table>"
range(n)は、0からn-1までのリストを作るので注意。0,1,2としたければ、range(3)です。
ファイル
fp = open("hoge.txt", "r")
for l in fp.readlines():
print l
fp.close()
split
文字列を分割。
str = "kei:rei:,mei"
A = str.split(":")
A[0] = "kei", A[1] = rei, A[2] = meiになります。
正規表現パッケージのreを使うと、もっと柔軟にできます。
import re
str = """kei, rei,
mei"""
A = re.split(",\s*:", str)
これもA[0] = "kei", A[1] = rei, A[2] = meiになります。
標準入力から一行ずつ読む
for str in fileinput.input():
(strに一行分の文字列が入ってるので、適当に処理する)
コマンドライン引数 (argv, args, argc)
コマンドライン引数はsys.argvに入っています。
引数のリストでループ。
for str in argv[1:]:
(なんかする)
ファイル一行読んで**する
新しいpythonではこんな風に書けるみたい。
for s in open("sample.txt", "r"):
print s # などなど。
互換性重視ならこっち。
fn = open("sample.txt", "r")
for s in fn.readlines():
print s # などなど。
whileを使って書きたいとき、EOFに達するとFalseが返ってくるらしい。
fn = open("sample.txt", "r")
while True:
s = fn.readlines()
if not s: break
print s # などなど。
というふうに書ける。
global変数
global変数のサンプル
関数中でglobalと書いたら、それで外部からアクセスできる。
def hoge():
global na
na = "name"
hoge()
print na
書かなかったら、hoge()内で普通のローカル変数naが出来てしまう。
関数・クラス・パッケージ
-
関数の書き方。
def myPrint():
print "Hello, Python!\n"
{}の代わりにインデント。返り値の型は指定しません。
-
クラスの作り方。
class MyClass :
def __init__(self):
self.members = ["kei", "rei", "mei"]
def write(self):
for s in self.members:
print s
または
class MyClass(Object) :
...(以下同じ)
です。とりあえず上の書き方で問題ないでしょう。
__init__()がコンストラクタ。メンバ変数は使うときにself経由で指定します。
クラスのインスタンスを作るときは
A = MyClass()
A.write()
のようにします。
-
スタティック(静的)なメソッドや変数の書き方。
スタティック変数は、外部からクラス名.変数名で初期化するとOKです。
クラス内のメソッドでも使えます。
class MyClass :
def ...
...
MyClass.name = "kei"
またメンバ関数は、まず関数を宣言してから、classmethodでstaticに呼び出せるという指定をします。
この例では、write()をスタティックなstaticWrite()という名前で登録します。(同じwriteという名前も使えます)
classmethodのインデントの位置に注意してください。
class A:
def write(self):
print "hoge"
staticWrite = classmethod(write)
A.staticWrite()
-
パッケージの作り方。
今のフォルダからサブディレクトリを作って、そこにファイルを置く。
たとえばMyModuleというフォルダを作って、中にchild.pyを作ってみる。
これをparent.pyから呼び出してみる。
+ MyModule - child.py
|
` parent.py
child.pyの中身はこんな感じ。
[child.py]
def myPrint():
print "Hello, Python!\n"
class MyClass :
def __init__(self):
self.members = ["kei", "rei", "mei"]
def write(self):
for s in self.members:
print s
これをparent.pyから呼び出すには、こう書く。
import MyModule.test
# 関数はこんな感じ。
MyModule.test.myPrint()
# クラスはこんな感じ。
obj = MyModule.test.MyClass()
obj.write()
ここでは
import ディレクトリ名.ファイル名
# (ただしファイル名は.pyを除いたもの)
と書いたが、ファイル名が__init__.pyの時は省略できることになっている。
これを利用して、MyModule/__init__.pyを以下のような内容にすると、importが簡単にできる。
[MyModule/__init__.py]
import test
[parent.py]
import MyModule
MyModule.test.myPrint()
obj = MyModule.test.MyClass()
obj.write()
-
クラスを作ったら、__str__()を書くと(overrideすると)、printの引数に渡したときの挙動を指定できる。
class Apple :
def __init__(self) :
self.name = "Apple"
def __str__(self) :
return "I'm Apple, nice to meet you"
a = Apple()
print a
とすると、print aで"I'm Apple..."と表示される。
-
ヘッダファイルみたく、定数を色々宣言するには、consts.pyとかいうファイルを作って、importするとか。
consts.py
MASTER = 0
SLAVE = 1
main.py
from consts import *
...
-
継承はクラス名(親クラス)で気軽に出来るけど、継承先のメソッドは自動では呼び出されない。
class A(object):
def __init__(self):
self.x = "a"
self.y = "a"
class B(A):
def __init__(self):
A.__init__() # A()のコンストラクタを呼び出し
self.x = "b"
class C(A):
def __init__(self):
self.x = "c"
c = C()
b = B()
print b.x # "b"と出力される
print b.y # "a"と出力される
print c.y # エラー
リストの足し算
例えば (x,y) みたいな二次元データの足し算をしたいとき、リスト内包表現を使うと
こんな風に書けます。
A = [1,2]
B = [3,4]
C = [A[i] + B[i] for i in range(len(A))]
enumerate を使った方が少しだけ短い?
C = [a + B[i] for i,a in enumerate(A)]
[an error occurred while processing this directive]