最近はRoguelike関係の話題ばっかです。
[NetHack]
[EM]
[FHS]
[Spork]
[UNH]
[Xang]
[変愚]
[Tiny]
antenna side: Dempa++
Twitter side: @dplusplus
↓に便乗してPython版も書いてみました。
ほとんど上記の記事と同じような内容で書いたのでPython入門記事としては色々抜けていたりしますがご了承ください。
Pythonは現在3.x系がリリースされていますが本記事では基本的にPython2.6について書きます。
参考文献:
pythonはそのまま実行すると対話環境として働きます。
% python (中略) Type "help", "copyright", "credits" or "license" for more information. >>> print 'hello' hello >>> 1 + 2 3
help()に関数やその他のオブジェクトを渡すことでヘルプが(あれば)見られます。qをタイプするとヘルプを抜けます。
>>> help(1) Help on int object: class int(object) | int(x[, base]) -> integer (以下略)
dir()にオブジェクトを渡すことでオブジェクトの属性名一覧がリストとなって返されます。
>>> dir(1) ['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
どんな関数があるかを調べるのに使ったりしますが、標準のままではだいぶ見辛いので外部モジュールのseeの導入をおすすめします。
type()でオブジェクトの型を調べます。
>>> type('hoge') <type 'str'>
exit()を呼び出すと終了します。
print文です。自動的に末尾に改行が付加されます。
print 'Hello world'
一行コメントです。#から行末までがコメントアウトされます。
# コメント
Pythonには変数の宣言はありません。変数に代入する型も制限されません。
a = 1 a = 'hoge' # aを上書き
% python hoge.py
整数や小数、複素数が使えます。末尾にjを付与すると虚数を表します。
num = 1 num = 3.14 num = 1 + 1j
num = 1 + 1 # 2 num = 1 - 1 # 0 num = 1 * 2 # 2 num = 5 / 2 # 2 (整数どうしの除算は整数に切り捨てられる) num = 5.0 / 2 # 2.5 (どちらかが小数なら結果も小数) num = 5 % 2 # 3 (剰余をとる) num = 2 ** 3 # 8 (累乗)
Pythonには++演算子がないので、+=や-=を使います。
i += 1 i -= 1
Pythonの論理演算は以下のとおりです。orやandはTrue/Falseを返すわけではないことに注意。
x or y # x が偽なら y 、そうでなければ x x and y # x が偽なら x 、そうでなければ y not x # x が偽なら True 、そうでなければ False
また、'''〜'''、"""〜"""で複数行にわたるブロック文字列を構成できます。クォートに囲まれている範囲では改行がそのまま扱われます。
str1 = 'abc' str2 = "def" str3 = '''ghi jkl mno'''
C言語でいうところのsprintf的な操作は%演算子、あるいはformat()関数で行います。
str4 = '%s def' % str1 # 'abc def' str5 = '%s %s' % (str1, str2) # 'abc def' str6 = '{0} {1}'.format(str1, str2) # 'abc def'
各種文字操作です。
# 結合 join1 = 'hoge' + 'moge' # 'hogemoge' join2 = ','.join(['aaa', 'bbb', 'ccc']) # 'aaa,bbb,ccc' # 分割 record = 'aaa,bbb,ccc'.split(',') # ['aaa', 'bbb', 'ccc'] # 長さ(文字数) length = len('Supercalifragilisticexpialidocious') # 34 # 切り出し substr1 = 'abcde'[0:2] # 'ab' substr2 = 'abcde'[2:] # 'cde' # 検索 result = 'abcd'.find('cd') # 見つかった場合はその位置、見つからなかった場合は-1が返る
いわゆる配列です。要素としてどんな型のものでも含むことができます。
# 空リストの作成 list1 = [] # 複数要素からなるリストを作成 list2 = [0, 1, 2] # 連番のリストを生成 list3 = range(5) # [0, 1, 2, 3, 4]
# 要素の参照 list2[1] # 1 list2[-1] # 2 インデックスに負数を指定することで後ろから辿れる # 要素の代入 list2[0] = 100
len(list3) # 5
array = [1, 2, 3, 4] # 任意の要素を取り出す first = array.pop(0) # first == 1, array == [2, 3, 4] # 任意の要素を追加する array.insert(0, 5) # array == [5, 2, 3] # 末尾を取り出す last = array.pop() # last == 3, array = [5, 2] # 末尾に追加 array.append(9) # array == [5, 2, 9] # 末尾にリストを追加 array.extend([0, 1]) # array == [5, 2, 9, 0, 1]
他の言語でハッシュや連想配列、マップ等と呼ばれているものと似たようなものです。
dic = {} # 空ディクショナリ dic = {'a': 1, 'b': 2}
# 要素の参照 dic['a'] # 1 # 要素の代入 dic['a'] = 100 dic['c'] = 42
# キーの取得 dic.keys() # ['a', 'c', 'b'] (辞書式順や追加順に並ぶとは限らない) # 値の取得 dic.values() # キーの存在確認 'a' in dic # True # ハッシュのキーの削除 del dic['a']
Pythonは一般的なプログラミング言語と異なり、タブやスペースによるインデント(字下げ)が意味を持ちます。
同じ深さのインデントは同じブロックに属するものとみなされます。
if 条件: print 'true'
if 条件: print 'true' else: print 'false'
他の言語のようにelse ifではなくelifです。
if 条件1: print 'if1' elif 条件2: print 'if2'
i = 0 while i < 5: # 処理 i += 1
いわゆる無限ループには while 1:が主に使われます。
for i in range(5): # inの右に渡されたリスト等の要素がiに代入されて処理される print i
for i in xrange(1000000): print 'a'
関数は以下のようにして記述します。返り値はreturn文で返します。(return文がない場合はNoneが返ります) def sum(num1, num2): return num1 + num2
ファイルコピーの例を示します。
# ファイルを読み込みモードでオープン orig = open('orig.txt') # ファイルを書き込みモードでオープン copy = open('copy.txt', 'w') for line in orig: # lineは改行文字を含む copy.write(line) orig.close() copy.close()
pythonにおいて、None、False、ゼロとして解釈できる数値(0, 0.0, 0j)、空文字列('')、空リスト、空タプル、空ディクショナリは偽と評価されます*1。
その他は真と評価されます。
num = int(1.5) # 1
num = round(3.14159, 3) # 3.142 num = round(1250, -2) # 1300 桁数に負数も指定できる
# 10進表記で変換 int('100') # 1 # 基数を指定して変換 int('FFFF', 16) # 65535 # 小数 float('1.0') # 1.0
str(1234) # '1234'
list('hoge') # ['h', 'o', 'g', 'e']
sys.stdout.write('hogehoge')
sys.argvにリスト形式で格納されています。sys.argv[0]はスクリプト自身を指します。
import sys print sys.argv
以下のように3項演算子のような書き方ができます。
result = 'true_value' if 条件 else 'false_value'
クラスはclass 名前:で定義します。
class Person(): def __init__(self, name, age): self.name, self.age = name, age self.address = None jhon = Person('Jhon', 15) print jhon.name jhon.address = 'USA, Earth'
mapを使ってリスト等の各要素を変換できます。リスト内包表記も使えます。
map1 = map(str, range(5)) # ['0', '1', '2', '3', '4'] map2 = [str(x) for x in range(5)] # ['0', '1', '2', '3', '4']
filterを使ってリスト等の各要素から条件に合うものを抽出したリストを生成できます。リスト内包表記も使えます。
filter1 = filter(lambda x: 'cat' in x, ['cat', 'dog', 'catalog']) # ['cat', 'catalog'] filter2 = [x for x in ['cat', 'dog', 'catalog'] if 'cat' in x]
タプル代入、リスト代入と呼ばれる代入方法があります。
(a, b) = (1, 2)
[c, d] = [a, b]
a, b = b, a # a, bの値を交換
raiseで例外を投げ、try〜except〜finally文で捕捉します。
try: #何かの処理 if 条件: raise Exception(); except Exception, e: # 捕捉したException型の例外はeに代入される (略) finally: # 例外の有無に関わらず実行されるブロック (略)
*1:__len__()が0を返すようなオブジェクト、__nonzero__()がFalseを返すようなオブジェクトも偽と評価される