他言語からの流入組が最小工数でPythonを学ぶシリーズです。
Python文法詳解を読みながらアウトプットしていきます。
[arst_toc tag=\"h4\"]
いくら何でも公式を上から順番に読むのは時間がかかり過ぎるし、
550ページとかある本なんて読みたくないので、なるべく薄くて枠だけ書いてある本が良いなと。
Python文法詳解posted with amazlet at 19.05.25石本 敦夫 オライリージャパン 売り上げランキング: 432,601Amazon.co.jpで詳細を見る
インデントとブロック
ブロックはbeginや { などの予約語ではなく、インデントを使う。
公式は以下。
[clink implicit=\"false\" url=\"https://docs.python.org/2.0/ref/indentation.html\" imgurl=\"https://www.python.org/static/img/python-logo@2x.png\" title=\"2.1.7 Indentation\" excerpt=\"Leading whitespace (spaces and tabs) at the beginning of a logical line is used to compute the indentation level of the line, which in turn is used to determine the grouping of statements.\"]
公式に面白い例が載ってた。
見た目上、インデントが無茶苦茶だけれども文法的には合理性がある例。
要するにインデントとインデント解除の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だけなので、
実際のインデント数はプロジェクトによるとのこと。ほうほう。
ただ、スペースとタブの混在禁止はこの際ハッキリさせましょう、という流れ。
比較と、比較の連接
比較演算子について公式は以下。
[clink implicit=\"false\" url=\"https://docs.python.org/ja/3/library/stdtypes.html#comparisons\" imgurl=\"https://www.python.org/static/img/python-logo@2x.png\" title=\"2.1.7 Indentation\" title=\"比較\" excerpt=\"Python には 8 種の比較演算があります。比較演算の優先順位は全て同じです (ブール演算より高い優先順位です)。比較は任意に連鎖できます; \"]
比較演算子を連接できる。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は変更不能で一意でなければならない、と書いてある。
[clink implicit=\"false\" url=\"https://docs.python.org/ja/3/tutorial/datastructures.html#dictionaries\" imgurl=\"https://www.python.org/static/img/python-logo@2x.png\" title=\"5.5. 辞書型 (dictionary)\" excerpt=\"もう一つ、有用な型が Python に組み込まれています。それは 辞書 (dictionary)です。辞書は他の言語にも 連想記憶 (associated memory) や 連想配列 (associative array) という名前で存在することがあります。ある範囲の数でインデクス化されているシーケンスと異なり、辞書は キー (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オブジェクト
よくあるパターン。要素の順序を走査するためのインターフェースを実装したオブジェクト。
本家によるとこんな感じ。
[clink implicit=\"false\" url=\"https://docs.python.org/ja/3/glossary.html#term-iterable\" imgurl=\"https://www.python.org/static/img/python-logo@2x.png\" title=\"iterable\" excerpt=\"(反復可能オブジェクト) 要素を一度に 1 つずつ返せるオブジェクトです。 反復可能オブジェクトの例には、(list, str, tuple といった) 全てのシーケンス型や、 dict や ファイルオブジェクト といった幾つかの非シーケンス型、 あるいは Sequence 意味論を実装した __iter__() メソッドか __getitem__() メソッドを持つ任意のクラスのインスタンスが含まれます。\"]