ラスボス系後輩ヒロインAIチャットボットを作りたい・Pythonの基礎②

※この記事はQiitaにもクロス投稿しています。
前回の続きから行きます。

そういえばRubyで str[n] を見たときはぎょっとしたんですけど、あれ考えてみればchar[]の扱いをStringに取り込んだだけなのでそんな変な動きでもないですね。char[]の存在自体忘れてたけど……char*とか懐かしすぎる……

リストとタプルと辞書と集合

名前 書式 注釈
リスト [val] 順番が保証される。重複した値も許可する。上書き可能。
タプル (val) 順番が保証される。重複した値も許可する。上書きできない。
辞書 {key:val} 順番は保証されない。キーが一意となる。上書き可能。
集合 {val} 順番は保証されない。重複した値は入らない。上書き可能。

「二通りの意味でPythonicな」という記述に首を傾げてコードを眺めていたのですが、なるほどMonty PythonとPythonのダブルミーニングか……
Monty PythonはあれかなイギリスのTeam Nacsって認識でいいかな。怒られるかな。

タプル、一回読んだだけだとちょっと理解できなかったけどPHPのlist()みたいなことができると思えばだいたい合ってるっぽい?

php > $arr = ['ruby', 'diamond', 'perl'];  
php > list($a, $b, $c) = $arr;  
php > echo $a;  
ruby  
php > echo $b;  
diamond  
php > echo $c;  
perl
>>> a, b, c = {'ruby', 'diamond', 'perl'}  
>>> a  
'ruby'  
>>> b  
'diamond'  
>>> c  
'perl'

ただケツカンマだけはちょっと受け付けない。まあ要素一個のタプルなんて使わないでしょうし別にいいけど。
可変長の引数を取る関数には *args てきなことをやるらしい。

リストの方はざっと見た感じ「どう書いても動くな……」という印象。index, count, join, sort, len, copy と欲しいものがだいたいあり、脳死状態で書いても安定して動いてくれそう。
中でも「マーベラス!!!」とテンション爆上げ&内心スタンディングオベーションしたのが in 構文。

>>> 'fizz' in ['hoge', 'fuga', 'poyo']  
False

この構文すっごい素敵。エンジニアの手に馴染みやすく英語としてそのまま読み下すこともできる! 最強では?! 好き!

辞書はだいたい連想配列、ハッシュマップと似たようなものなので違和感も疑問も特に無い。dict()を使った変換はCSV読み込みあたりで使いそう?

foreach($line as $key => $val){  
  $arr[$key] = $val;  
}

みたいなこと書かないで済むのは地味に便利っぽい。
辞書のupdate関数はなんでupdate? と思ったけど要は「Aの辞書をBの辞書で上書きする」みたいなことだと思えばよさそう。Bの辞書に無いものは上書きされない。
こちらもdel, keys, values, items, copy と大体必要そうなものが揃っていて便利っぽい。updateがあってinsertが無いのちょっともやっとするけど。

集合は数学の集合だと思えばいいらしい。和集合、差集合、積集合、排他的論理和などが取れる。

名前 記号 意味
和集合 & a & b
積集合 a|b
差集合 - a-b
排他的論理和 ^ a^b
部分集合 <= a<=b aはbの部分集合である
真部分集合 < a<b aはbの真部分集合である
上位集合 >= a>=b aはbの上位集合である
真上位集合 > a>b aはbの真上位集合である

半角パイプ入れられなかった……

>>> language = {'python', 'ruby', 'perl', 'java'}  
>>> gem = {'sapphire', 'ruby', 'diamond', 'quartz'}  
>>> language & gem  
{'ruby'}  
>>> language ^ gem  
{'diamond', 'perl', 'quartz', 'python', 'sapphire', 'java'}  
>>> language | gem  
{'diamond', 'perl', 'quartz', 'python', 'ruby', 'sapphire', 'java'}  
>>> language < gem  
False

というわけで割合サクッと三章が終わってしまった(見積もりが下手!)ので四章に行きます。