インデントとブロック,比較と、比較の連接,辞書オブジェクト,リストとタプル,if … elif … else,for,while,iteratableオブジェクト

他言語からの流入組が最小工数でPythonを学ぶシリーズです。
Python文法詳解を読みながらアウトプットしていきます。

いくら何でも公式を上から順番に読むのは時間がかかり過ぎるし、
550ページとかある本なんて読みたくないので、なるべく薄くて枠だけ書いてある本が良いなと。

Python文法詳解
Python文法詳解

posted with amazlet at 19.05.25
石本 敦夫
オライリージャパン
売り上げランキング: 432,601

インデントとブロック

ブロックはbeginや { などの予約語ではなく、インデントを使う。
公式は以下。

公式に面白い例が載ってた。
見た目上、インデントが無茶苦茶だけれども文法的には合理性がある例。
要するにインデントとインデント解除のconsistencyがあればOK。


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には無い感じ。


a=50
# 通常
if (0 < a) and (a < 100):
     print("OK")
else:
     print("NG")
# 連接
if 0 < a < 100:
     print("OK")
else:
     print("NG")

辞書オブジェクト

KeyValue型。本家は以下。Keyは変更不能で一意でなければならない、と書いてある。


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]) # エラー

キーを文字列にして連想配列みたくできる。
連想配列のキーにできるかどうかは、その型が更新可能であるかどうか?


b = {'hoge1':'fuga1','hoge2':'fuga2'}
print(b) # {'hoge1':'fuga1','hoge2':'fuga2'}

リストとタプル

似て非なる配列的データ構造、リストとタプル。
リストの方は更新可能。タプルは更新不能。
任意の型を要素としてとれるので、配列ではなくリスト。


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

序数を使ってシーケンシャルアクセスできる。


ary = [1,5,3,4,9]
print(ary[3]) # 4
str = 'abcdef'
print(str[1]) # b

負の序数を使うと後ろから数える。


ary = [1,5,3,4,9]
print(ary[-1]) # 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]

レンジ指定で要素を更新できる。


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オブジェクト。それ以外は真。


a = 50
if 0 < a < 35:
     print("OK")
elif 35 <= a < 100:
     print("So much")
else:
     print("NG")

for,while

forループとwhileループがある。iteratableオブジェクトを指定できる。
whileループについて。


str = "aiueo"
stop = len(str)
i=0
while i < stop:
     print(str[i])
     i += 1
# a
# i
# u
# e
# o

forループについて。


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で中断した場合は実行されない。


str = 'abcde'
for c in str:
     print(c)
else:
     print('ループ終了')
# a
# b
# c
# d
# e
# ループ終了

iteratableオブジェクト

よくあるパターン。要素の順序を走査するためのインターフェースを実装したオブジェクト。
本家によるとこんな感じ。