Python 11日目

リスト型のメソッドは9個。
append,extend,insert,remove,pop,index,count,sort,reverse.
簡単な覚え方とかないかな?
aeirpicsr


そういえばこれを書き始める前にチュートリアル少し読んだことがあった。
このあたりのスタックとして使うなど見覚えがある。


リスト型の長さの最大値は何で決まる?
長整数型のようにメモリで決まるのか?


filter()
map()
reduce()
これらは組み込み関数。メソッドではない。


filterは入力されたシーケンスと同じ型のシーケンスを返す
filter()のサンプルプログラム
2で割ったあまり、3で割ったあまりともに0でない数字を返す関数に、2から25の数字を入れたので、[5,7...23]になるというプログラムだと思う。
思うが、returnの後は条件文になっている。
条件文が返す値は真か偽かではなかったか?


mapはリストを返す。
名前からし写像を返すのだろう。
やはりプログラム経験がほとんどないのはこういうときに、どう役に立つのかイメージしにくい点で不利だ。


reduce()は単一の値を返す。
シーケンスが空だと例外を返す。


3つの関数はどれもシーケンスを引値にもつ。
これが実用的なツールということは、プログラムではシーケンス型の処理が多いのだろう。


リストの内包表記
for文あるいはif文を使ってリストを作れる。

サンプルコードについて
.strip()は文字列シーケンスの先頭、末尾にあるスペースを削除する?
'passion fruits 'を見るとわかるが先頭、末尾以外のスペースは削除されない。

内包表記は[式 と それに続くfor if]か。式が必ず必要で、その式がリストの中に入る。
式の部分には3*xみたいなひとつの式、[x,x*2]みたいなリスト、(x,x*2)見たいなタプルが可能。
タプルは代入するだけなら、()括弧がなくても作れるが、内包表記では()は必須。
他にも必須な状況があったはず、もうタプルを使うときは必ず()で囲むと覚えておいたほうがいい。


内包表記にfor文が複数ある場合、for文は入れ子になる。
後に書かれた、for文が中に入る。
つまりこのサンプルは
for x in vec1
 for y in vec2
と同じforの関係になっている。
for y in vec2
 for x in vec1
ではない。


内包表記は奥が深そうだ。map()よりはるかに柔軟ということは、内包表記さえ覚えてしまえばmap()は不要?
しかし、内包表記をうまく使ったサンプルを探してこないと、自分だけじゃマスターできない。


タプル
タプルの要素にリストが指定可能。
変更可能?不可能?
タプルのパック=タプルへの代入?
タプルのパック⇔シーケンスのアンパック
パック⇔アンパックになっているが
左辺はタプルで右辺はシーケンスになっていて非対称。
複数同時代入とタプルの関係は不明?


集合
集合のデータ型を作るためには、リストlistを作る⇒set(list)しかないのか?
リスト、タプルのような[]括弧でくくるやり方はなし?
いや、set([a,b,c...x])でできるのか?
⇒後で試す
要素が含まれるかどうかの判定=メンバシップテストは高速
おそらくリストと比べてだと思う。
リストは便利な機能が多いけど、低速なんじゃないかと予想。
set()に対して、何を引数に渡すかで、要素が何になるのかが変わるのか。
前半のset()ではリストを引数に渡したので、リストの要素を、集合の要素に持つ集合ができた。
後半の集合間の計算のときは、set()に対して、文字列を引数に渡したので、文字列の文字を要素に持つ集合ができた?


集合間の演算
a内の一意な文字。やっぱりさっきの文字列を与えた時の挙動は違うかも。
でもaだけで、一意な文字になるならそれでいいような。
一意な文字の出てくる順番はあってる?
'r'の位置がここにいる理由がないのだが?
set()同士の演算はset()を返すのか?
それなら順番は関係ないから不定かも。
結合、交差、差分、対象差はどれだ。
キーのない辞書とみなしてもいいのかな?


辞書
キーにはタプルが指定可能。ただし、タプルの要素として変更可能な要素が入っている場合は不可。
キーが一意でなければならないので、変更不可の型しかキーに指定できない。


辞書の内容をfor文に使うには.iteritems()メソッドが便利。
シーケンスの、インデックスと要素を同時に取り出せるenumerate関数。
2つ以上のシーケンスを同時にループするためにzip関数。
逆方向のシーケンスループにはreverse()を使う。
xrange()見たことない。
並び順にループするにはsorted()を使う。
for f in sorted(set(basket))
inの後はsorted(...)でいいのか。何か変数に代入する必要があるのかと思ってた。


ループのテクニック
辞書のループのときに、iteritems()を使うとキーと値を同時に取り出せる。
シーケンスのループのときに、enumerate()を使うと要素のインデックスと要素を同時に取り出せる。
2つ以上のシーケンスを同時にループ、zip()を使う。
%sの使い方がまだ不明。%(q,a)を代入するんだろうけど。


条件文
スペルミス 条件(condition)
is 、not isは変更可能なオブジェクトに対してのみ、意味がある。
比較演算子の優先度はすべて同じ、数値演算子よりも優先度が低い。
比較演算の連鎖
aand>orの順で優先度が高い。
notがもっとも優先される。

and と or は短絡演算子と呼ばれる。
結果が確定した時点で、評価をやめる。
⇒ということは、しっかりテストしないとバグの元になるということか。

Pythonでは代入=と、比較演算==を間違えないように式の中で代入はできない。


同じ型のシーケンスを比較したときのみ、要素を比較する。
型の異なるシーケンスを比較した場合、要素の比較はせず、型ごとに決まった結果になる。