はてブロ@ama_ch

https://twitter.com/ama_ch

今日のPython

タプル

タプルとは

リストによく似たデータ型。書き換えることができない。

タプルを定義する

p.62

>>> t = (1, 2, 3, 4, 5)
>>> t
(1, 2, 3, 4, 5)

丸カッコでくくる。

書き換えられないけど

タプル同士を連結して新しいタプルを作ることはできる。
p.63

>>> t1 = (1, 2, 3)
>>> t2 = (4, 5, 6)
>>> t3 = t1 + t2    #連結
>>> t3
(1, 2, 3, 4, 5, 6)
タプルの利点

タプルは辞書のキーにできる。

>>> dict = { (1, 2, 3):"tuple_key"}
>>> dict[(1, 2, 3)]
'tuple_key'

リストで同じことをやるとエラー。

>>> dict = { [1, 2, 3]:"list_key"}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable

型のエラー:リストオブジェクトはハッシュにできないよ!
かな?


組み込み型のまとめ

p.65 「コレクション型の分類」

シーケンス型 マップ型
文字列,リスト,タプル 辞書

シーケンス型は、要素を順番に並べる型。マップ型は、キーと値のペアで要素を管理する。


「変更可能性による組み込み型の分類」

変更可能 変更不可能
リスト,辞書 文字列,タプル

変更可能な組み込み型は、要素を追加したり変更・削除するといった操作が可能。


リストとタプルの相互変換

p.67

>>> l = [1, 2, 3]
>>> t = (4, 5, 6)
>>> a = list(t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable
>>> a = tuple(l)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable

みんPyによるとこれでリストとタプルの相互変換ができるはずなのに、エラーが・・・
「リスト/タプルオブジェクトは呼び出せません」? なぜだ!


条件分岐

if文

p.70

>>> bmi = 23.0
>>> if bmi < 18.5:
...     print u"やせ"
... elif 18.5 <= bmi < 25.0:
...     print u"標準"
... elif 25.0 <= bmi < 30.0:
...     print u"肥満"
... elif bmi >= 30.0:
...     print u"ピザデブ"
... 
標準

if 条件:
[tab] 処理
elif 条件:
[tab] 処理
else 条件:
[tab] その他処理
って感じ。
18.5 <= bmi < 25.0 こんな風に挟み込んで書けるの面白いね。Cとかなら、
bmi >= 18.5 && bmi < 25.0 こんな風になるのに。
あと、演算子は基本的にCとかJavaと同じのが使えてる。

比較演算子

p.74 知らなかった演算子

演算子 説明
x in y xという要素がyというシーケンスに含まれる場合、Trueとなる
not TrueとFalseを逆にする。Cでいう!(x == y)。not x == y のように書く。
論理演算子

p.75
Pythonでは、

  • && ではなく and を使う。
  • || ではなく or を使う。
  • &や|はビット演算子を表し、こちらはビット操作に用いる。

if bmi >= 18.5 and bmi < 25.0:  こういうことか。

for文

Pythonのfor文は特殊です!
繰り返し変数とシーケンス(リスト)を用意し、シーケンスの要素が順番に繰り返し変数に代入される。
p.81

>>> n = range(10)   # 0〜9のリストを作成
>>> n
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for item in n:
...     print item
... 
0
1
2
3
4
5
6
7
8
9
>>> for item in n:
...     print item,   #改行せずに出力
... 
0 1 2 3 4 5 6 7 8 9

組み込み関数range()は、0〜カッコ内の数字-1 までの数値リストを作る。
例 : range(5) == [0, 1, 2, 3, 4]
通常、print文は出力のあと改行する。だが、print文の最後に,(コンマ)を記述すると、改行せずに空白を出力する*1。最後の要素を出力したあと改行してる気がするけど、どうなってるんだろう?

少しだけスマートに書く(シーケンスをあらかじめ変数に代入しない)

p.82

>>> for item in range(10):
...     print item,
... 
0 1 2 3 4 5 6 7 8 9
シーケンスの範囲を指定

p.82

>>> for item in range(5, 10):   # 5〜9のリストを作成
...     print item,
... 
5 6 7 8 9
n個おきのリスト

p.82

>>> for item in range(10, 50, 5):  # 10〜49で、5個おきのリスト
...     print item,
... 
10 15 20 25 30 35 40 45

今日はここまで

うぅ・・・序盤なのに20ページしか進まなかった;
しかし組み込み関数が充実していることを改めて実感。

*1:p.67のコラムより