Overfiction

本とデジタルガジェットの感想を好きに語る

【独習】『プログラミング超初心者が初心者になるためのPython入門(2)』【前編】

f:id:yukitan_i:20170705181345j:plain

あいかわらず雰囲気で Python の勉強をしています。

今回の教材は プログラミング超初心者が初心者になるためのPython入門(2) リスト・タプル・ディクショナリ・if・for ループ編 。前回のヤツの続編。待望の第二弾。Kindle 価格250円ですが、やはりオーナーライブラリーの対象商品なので、Kindle端末があればタダで読めます(2017年7月現在)。ほんなこつありがたいです。


一度に覚えきれなかったので…ひとまず前編ということで、リストとタプルとディクショナリというヤツを勉強する。

リストを作ってみる
>>> x = ["Hello"]
>>> print x
['Hello']
>>> print type(x)
<type 'list'>
リストに複数の要素を入れてみる
>>> print ["a","b","c","d","e"]
['a', 'b', 'c', 'd', 'e']

>>> print ["a","b","c",1,2,3] #数値もOK
['a', 'b', 'c', 1, 2, 3]

>>> print ["a","b",["c",1,2,3]]  #リスト内にリストを入れることも可
['a', 'b', ['c', 1, 2, 3]]

リスト内が入れ子になっている構造をネストと表現する。

リストのインデクシング

要素には(例によって)0から始まる連番が割り振られている。

>>> print ["a","b","c","d","e"][0]
a

>>> print ["a","b",["c",1,2,3]][2] 
['c', 1, 2, 3]

#インデックスを連続して指定することで、入れ子になっているリスト内の要素を取り出すこともできる。
>>> print ["a","b",["c",1,2,3]][2][0]
c

>>> print ["a","b",["c",["d","e"]]][2][1][0] #3重ネストの場合
d

#マイナスの値を指定した場合、逆向きにインデクシングされる(0からではなく、-1から始まることに注意)。
>>> print ["a","b","c","d","e"][-1]
e

#存在しないインデックスを指定するとエラーになる。
>>> print ["a","b","c","d","e"][10]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
リストのスライシングをする
>>> print ["a","b","c","d","e"][0:3]
['a', 'b', 'c']

>>> print ["a","b","c","d","e"][3:]
['d', 'e']

>>> print ["a","b","c","d","e"][-5:-2] #マイナスのインデックス指定も可
['a', 'b', 'c']

>>> print [0,1,2,3,4,5,6,7,8,9][0:9:2] #ひとつおきに取り出す場合
[0, 2, 4, 6, 8]

>>> print [0,1,2,3,4,5,6,7,8,9][3:10:3] #ふたつおきに取り出す場合
[3, 6, 9]

#インデクシングとスライシングを併用する
>>> print ["a","b","c",[0,1,2,3]][3][1:3]
[1, 2]

#インデクシングを利用してリストの中身を変更する
>>> x = ["a","b","c"]
>>> x[1] = "BBB"
>>> print x
['a', 'BBB', 'c']
リストに対するメソッド

append メソッド

リストに要素を追加する

>>> x = ["a","b","c"]
>>> x.append("d")
>>> print x
['a', 'b', 'c', 'd']

extend メソッド

リストを延長する

>>> x = ["a","b","c"]
>>> x.extend(["d","e"])
>>> print x
['a', 'b', 'c', 'd', 'e']

#appendで同じことをやろうとすると、違う結果が出る。
>>> x = ["a","b","c"]
>>> x.append(["d","e"])
>>> print x
['a', 'b', 'c', ['d', 'e']]

removeメソッド

リストの要素を削除する

>>> x = ["a","b","c"]
>>> x.remove("b")
>>> print x
['a', 'c']

# 指定した要素が複数あっても、最初の1個しか消えない
>>> x = ["a","b","b","c"]
>>> x.remove("b")
>>> print x
['a', 'b', 'c']
delステートメント

インデックスの値で消去する要素を指定する。

delはメソッドではなくステートメント。文法が違う。お、おう……ちょっと混乱してきた。

>>> x = ["a","b","c"]
>>> del x[1]
>>> print x
['a', 'c']

>>> x = ["a","b","c"]
>>> del x[1:] #スライシングで指定した場合
>>> print x
['a']
popメソッド
  • リストに入っている最後のオブジェクトを消す。
  • 消えたオブジェクトを戻す

……かなり混乱してきた。

>>> x = ["a","b","c"]
>>> y = x.pop()
>>> print x
['a', 'b']
>>> print y
c

>>> x = ["a","b","c"]
>>> y = x.pop(0) #pop対象をインデックスで指定することも可能
>>> print x
['b', 'c']
>>> print y
a
sort、reverseメソッド

sort:昇順に並べ替える

>>> x = ["c","d","a","b"]
>>> x.sort()
>>> print x
['a', 'b', 'c', 'd']

reverse:リストの要素を逆向きに並べ替える

>>> x = ["c","d","a","b"]
>>> x.reverse()
>>> print x
['b', 'a', 'd', 'c']

sortとreverseを組み合わせると、降順に並べ替えることが可能

>>> x = ["c","d","a","b"]
>>> x.sort()
>>> x.reverse()
>>> print x
['d', 'c', 'b', 'a']

こういう工夫は嫌いじゃない。

リストを自動で作る
#list関数 文字列からリストを作る
>>> print list("abc")
['a', 'b', 'c']

#range関数
>>> print range(5)
[0, 1, 2, 3, 4]

>>> print range(2,10) #2から9までのリストを作る
[2, 3, 4, 5, 6, 7, 8, 9]

>>> print range(2,10,2) #2から9までで、1個おきのリストを作る
[2, 4, 6, 8]
タプルとリストの違い

リストに似ているが内容が変わりにくい。リストは内容を変更しやすいのがいいところでもあり、悪いところでもあり。

>>> type(("Hello","World"))
<type 'tuple'>

#append等のメソッドは使えない
>>> x = ("a","b","c")
>>> x.append("d")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
ディクショナリを作ってみる
>>> print {"a":"apple"}
{'a': 'apple'}

>>> print type({"a":"apple"})
<type 'dict'>

>>> print {"a":"apple","b":"ball","C":"cat"}
{'a': 'apple', 'C': 'cat', 'b': 'ball'}

# aというキーで、ディクショナリから値を取り出してみる
>>> print {"a":"apple","b":"ball","C":"cat"}["a"]
apple

# キーは数字でもOK
>>> print {1:"apple",2:"ball",3:"cat"}[2]
ball

# 値が数字でもOK
>>> print {1:100,2:1000,3:10000}[3]
10000
ディクショナリに要素を加えたり減らしたりしてみる
>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> x["d"]= "dog"
>>> print x
{'a': 'apple', 'c': 'cat', 'b': 'ball', 'd': 'dog'}

#既存のキーを指定した場合、キーに対応した値が置き換わる。

>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> print x
{'a': 'apple', 'c': 'cat', 'b': 'ball'}
>>> x["c"] = "cat2"
>>> print x
{'a': 'apple', 'c': 'cat2', 'b': 'ball'}

#要素の削除は、リストと同様にdelステートメントが使える
>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> print x
{'a': 'apple', 'c': 'cat', 'b': 'ball'}
>>> del x["c"]
>>> print x
{'a': 'apple', 'b': 'ball'}
ディクショナリに対するメソッド

popメソッド

使い方はリストのときと同じ

>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> y = x.pop("c")
>>> print x
{'a': 'apple', 'b': 'ball'}
>>> print y
cat

#popには、そのキーが見つからないときに返す値も指定できる。
>>> print {"a":"apple","b":"ball","c":"cat"}.pop("b","Not Found")
ball

>>> print {"a":"apple","b":"ball","c":"cat"}.pop("d","Not Found")
Not Found

#キー"d"が見つからなかったので、Not Foundが返ってきた。

updateメソッド

ディクショナリの内容を更新する。

>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> x.update({"d":"dog","e":"egg"})
>>> print x
{'a': 'apple', 'c': 'cat', 'b': 'ball', 'e': 'egg', 'd': 'dog'}

#付け加える要素は変数に入れてもOK
>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> y = {"d":"dog","e":"egg"}
>>> x.update(y)
>>> print x
{'a': 'apple', 'c': 'cat', 'b': 'ball', 'e': 'egg', 'd': 'dog'}

#既存のキーを指定した場合は、対応する値が更新される
>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> y = {"c":"cat2","e":"egg"}
>>> x.update(y)
>>> print x
{'a': 'apple', 'c': 'cat2', 'b': 'ball', 'e': 'egg'}

keys、values、itemsメソッド

keys = キーだけを出力する

>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> print x.keys()
['a', 'c', 'b']

# キーはリスト型で出力される→リストとして操作可能

>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> y = x.keys()
>>> print y
['a', 'c', 'b']
>>> print x[y[0]] #インデクシングを使って、"a"に対応する値を表示させる
apple

values = 値だけを出力する

>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> print x.values()
['apple', 'cat', 'ball']

items = キーと値に順番にアクセスしたいとき便利

>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> print x.items()
[('a', 'apple'), ('c', 'cat'), ('b', 'ball')]
#全体としてはリストで、キーと値はタプルで出力される

has_keyメソッド

ディクショナリに、特定のキーが含まれているかどうかを調べる。

has_keysではないことに注意。

>>> x = {"a":"apple","b":"ball","c":"cat"}
>>> print x.has_key("a")
True
#値はTrueかFalseで返ってくる。

理解できなくはないんだけれど、さすがに混乱することが多くなってきた。メソッドとかステートメントとか、カタカナがいっぱい出てきてすごい。これが本物のプログラミングの世界なんだ……!