他言語からの流入組が最小工数でPythonを学ぶシリーズです。
Python文法詳解を読みながらアウトプットしていきます。
いくら何でも公式を上から順番に読むのは時間がかかり過ぎるし、
550ページとかある本なんて読みたくないので、なるべく薄くて枠だけ書いてある本が良いなと。
インデントとブロック
ブロックはbeginや { などの予約語ではなく、インデントを使う。
公式は以下。
公式に面白い例が載ってた。
見た目上、インデントが無茶苦茶だけれども文法的には合理性がある例。
要するにインデントとインデント解除のconsistencyがあればOK。
1 2 3 4 5 6 7 8 9 10 11 |
def perm(l): # Compute the list of all permutations of l if len(l) <= 1: return [l] r = [] for i in range(len(l)): s = l[:i] + l[i+1:] p = perm(s) for x in p: r.append(l[i:i+1] + x) return r |
コーデイング規約によると、お作法としてスペースの個数は4個。だそうだ。
タブではなくスペースでインデントするなんて信じられない…。
エディタにタブ=スペース4個の設定を追加しないと。
言語仕様上の制約はインデントのconsistencyだけなので、
実際のインデント数はプロジェクトによるとのこと。ほうほう。
ただ、スペースとタブの混在禁止はこの際ハッキリさせましょう、という流れ。
比較と、比較の連接
比較演算子について公式は以下。
比較演算子を連接できる。PHPとRubyには無い感じ。
1 2 3 4 5 6 7 8 9 10 11 |
a=50 # 通常 if (0 < a) and (a < 100): print("OK") else: print("NG") # 連接 if 0 < a < 100: print("OK") else: print("NG") |
辞書オブジェクト
KeyValue型。本家は以下。Keyは変更不能で一意でなければならない、と書いてある。
1 2 3 4 5 6 7 8 9 10 11 |
a = {1:'one',2:'two'} print(a) # {1:'one',2:'two'} # 代入 print(a[1]) # 'one' a[1] = '壱' print(a[1]) # '壱' # 削除 del a[1] print(a[1]) # エラー |
キーを文字列にして連想配列みたくできる。
連想配列のキーにできるかどうかは、その型が更新可能であるかどうか?
1 2 |
b = {'hoge1':'fuga1','hoge2':'fuga2'} print(b) # {'hoge1':'fuga1','hoge2':'fuga2'} |
リストとタプル
似て非なる配列的データ構造、リストとタプル。
リストの方は更新可能。タプルは更新不能。
任意の型を要素としてとれるので、配列ではなくリスト。
1 2 3 4 5 6 7 8 9 10 |
L1 = [1,2,3,4,5] print(L1) # [1,2,3,4,5] L2 = (1,2,3,4,5) print(L2) # (1,2,3,4,5) L1[0] = 'hoge' print(L1) # ['hoge', 2, 3, 4, 5] L2[0] = 100 # TypeError: 'tuple' object does not support item assignment |
序数を使ってシーケンシャルアクセスできる。
1 2 3 4 |
ary = [1,5,3,4,9] print(ary[3]) # 4 str = 'abcdef' print(str[1]) # b |
負の序数を使うと後ろから数える。
1 2 |
ary = [1,5,3,4,9] print(ary[-1]) # 4 |
レンジも使える。
1 2 3 4 |
ary = [1,5,3,4,9] print(ary[1:3]) # [5,3,4] print(ary[-3:-1]) # [5,3,4] print(ary[:3]) # [1,5,3] |
レンジ指定で要素を更新できる。
1 2 3 |
ary = [1,5,3,4,9] ary[2:3] = [100,200] print(ary)# [1, 5, 100, 200, 4, 9] |
if … elif … else
elseif が elif。
論理式が偽になるのは”数値の0″、空のコレクション、Noneオブジェクト。それ以外は真。
1 2 3 4 5 6 7 |
a = 50 if 0 < a < 35: print("OK") elif 35 <= a < 100: print("So much") else: print("NG") |
for,while
forループとwhileループがある。iteratableオブジェクトを指定できる。
whileループについて。
1 2 3 4 5 6 7 8 9 10 11 |
str = "aiueo" stop = len(str) i=0 while i < stop: print(str[i]) i += 1 # a # i # u # e # o |
forループについて。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
str = 'abcde' for c in str: print(c) # a # b # c # d # e # continue, break str = 'abcde' for c in str: if c == 'c': continue if c == 'e': break print(c) # a # b # d |
whileループ、forループの終了時に実行するブロックをelseで定義できる。
breakで中断した場合は実行されない。
1 2 3 4 5 6 7 8 9 10 11 |
str = 'abcde' for c in str: print(c) else: print('ループ終了') # a # b # c # d # e # ループ終了 |
iteratableオブジェクト
よくあるパターン。要素の順序を走査するためのインターフェースを実装したオブジェクト。
本家によるとこんな感じ。