りきゅーの技術メモ

SFC18。東京に魂を売った関西人。コンピュータサイエンス、ドローン、お茶、弓道、哲学とか。スケボーかスノボー始めたい。

【Python基礎講座2】変数・データ型②

f:id:shinta2000ttt:20180923164744j:plain:w600

変数

変数とはデータを格納しておく為の箱みたいなもの。以下のように、イコール(=)で変数を定義・代入する。
Pythonにおいてイコールは同値の意味を持たない。

fruit = "apple"

one = 1

右辺のデータを左辺の変数に代入することで、変数で代入したデータを表現できるようになる。

>>>company = "google"
>>>print(company)     #変数companyと文字列"google"は同じものだと認識される
google

変数の名前は文字(a,b,c..)でも数字(1,2,3...)でも構わない。ただし文字はアルファベット小文字を使うこと!また複数の単語を使う場合は単語間はアンダーバー(_)で区切る。
これらはPEP8というPythonのコーディング規約で定められている。

os_name_1 = "Linux"

os_name_2 = "macintosh"
変数の値の更新

変数の中のデータを更新したい(変えたい)時は、もう一度定義時と同じイコールの構文で新しいデータを代入すればいい。

>>>animal = "cat"     #変数animalに文字列”cat”を代入
>>>print(animal)
cat

>>>animal = "dog"     #変数animalの値を文字列”dog”に更新
>>>print(animal)
dog

データ型②(リスト・辞書)


プログラミング言語には複数のデータをまとめて扱うためのデータ型がいくつか存在する。

["a", "b", variable, 9, 26]     #リスト

{"a": "aaa", "b": 26, "k": variable2}      #辞書

("a", "b", 2018, variable3)     #タプル

{"a", "b", 30, variable4}     #セット

これらのデータ型はどのプログラミング言語にも存在していて、これらはあくまでPythonの名前である。例えば、JavaScriptではリストは配列、辞書はオブジェクトと呼ばれたりする。
Pythonの辞書はディクショナリと呼ばれることもある。(まあ英語にしただけだよね。)

リスト・辞書・タプル・セットもまた変数に代入できる。
タプル・セットに関しては次回紹介する。

リスト

リストは角括弧( [] )で表される。リストに収納されるデータをその要素という。
リストは要素に番号をつけて管理する。この番号のことをインデックスという。
インデックスは0番からなので注意!

リストを作るには各括弧で要素を囲うか、list関数に文字列やリスト、タプルなどを渡す。

>>>test_list1 = ["Fortran", "CPBOL", "Lisp", "Algol", "Scheme", "Pascal"]   #角括弧でリストを作る
>>>test_list1
['Fortran', 'CPBOL', 'Lisp', 'Algol', 'Scheme', 'Pascal']

>>>test_list2 = list(("Fortran", "CPBOL", "Lisp", 1, 2, 3))     #list関数にタプルを渡してリストを作る
>>>test_list2
['Fortran', 'CPBOL', 'Lisp', 1, 2, 3]

>>>test_list3 = list("Apple")     #list関数に文字列を渡してリストを作る
>>>test_list3
['A', 'p', 'p', 'l', 'e']
インデックス参照

リストを変数に代入した後、その変数名の後ろに角括弧でインデックスを指定すると、代入されているリストの指定したインデックスの要素を参照できる。

>>>fruits = ["apple", "orange", "grape", "strawberry"]
>>>print(fruits[0])     #リストfruitsのインデックス0を参照
apple

>>>print(fruits[2])
grape     #リストfruitsのインデックス2を参照

ちなみに最後のインデックスは-1 番、最後から2つ目は-2番....とも表現できる。

>>>print(fruits[-1])     #リストfruitsのインデックス-1を参照
strawberry
要素の更新

インデックス参照を用いて、指定したインデックスの要素を更新することができる。指定したインデックスに新たな値を代入するという形で書ける。

>>>fruits[2] = "banana"     #2番目の要素"grape"を"banana"に変更
>>>fruits
['apple', 'orange', 'banana', 'strawberry']
スライス

リストが代入された変数に対して角括弧でインデックスの範囲を指定すると、その範囲の要素を取り出せる。これをスライスという。
※正確には指定範囲の要素のみのリストが新たに作られる。

範囲は角括弧内に、インデックスの数字とコロン(:)で指定する。
例えば、インデックス1番から3番までの要素を取り出したいなら、変数[1:4]という風に指定する。つまりn 番まで取り出したい時は、n + 1番まで指定する必要がある。

>>>animals = ["cat", "dog", "pigeon", "giraffe", "zebra", "penguin"]
>>>animals[1:4]     #1~3番の要素取り出し
['dog', 'pigeon', 'giraffe']

>>>animals[0:3]      #0~2番の要素取り出し
['cat', 'dog', 'pigeon']

>>>animals[1:-2]     #1~-3番の要素取り出し
['dog', 'pigeon', 'giraffe']

>>>animals[-4:-1]     #-4(2)~-2(4)番の要素取り出し
['pigeon', 'giraffe', 'zebra']

ちなみに始まりのインデックスを指定しない( [:4など] )と0番から指定のインデックスまで、終わりのインデックスを指定しない( [3:]など )と指定のインデックスから-1番(最後のインデックス)までを選択できる。

>>>animals[:4]     #0~3番の要素取り出し
['cat', 'dog', 'pigeon', 'giraffe']

>>>animals[3:]     #3~-1番の要素取り出し
['giraffe', 'zebra', 'penguin']
ステップ

スライスの角括弧内のインデックス指定に続けてさらにコロンと数字を書くと、指定の範囲を何個飛ばしで取り出すかを指定できる。これをステップという。
変数[n:m:k]はnからm-1の範囲の要素をk-1個飛ばしで取り出すという意味。注意が必要なのは、例えば1個飛ばしにしたい場合はkのところを2にしなくてはいけないこと!

>>>animals[1:5:2]     #1~4番の要素を1個飛ばしで取り出し
['dog', 'giraffe']

>>>animals[::3]     #最初から最後まで2個飛ばしで取り出し
['cat', 'giraffe']
リバース

変数[::-1]と書くとリストの要素を逆順にしたリストを取得できる。リバースという。

>>>animals[::-1]     #要素を逆順にしたリストを取得
['penguin', 'zebra', 'giraffe', 'pigeon', 'dog', 'cat']

辞書(ディクショナリ)

辞書は波括弧( {} )で表される。
辞書にはインデックスはなく、それぞれの要素に固有のキーというものを対応させて管理する。キーは文字列リテラルで書き、名前に重複があってはならない。

student = {"name": "Kenji", "age": 19,"city": "Tokyo", "university": "Keio univ"}
#{キー:値}と書く、キー&値の間はコンマで区切る
値の参照

リストではインデックスで要素を参照したが、辞書にインデックスは無い。辞書では対をなすキーで値(要素)を参照する。変数["キー"]でそのキーに対応する値を参照できる。

>>>print(student["name"])
Kenji

print(student["city"])
Tokyo
値の更新

リスト同様に値の参照を用いて、指定のキーに新しい値を代入するという形で書ける。

>>>student["university"] = "Waseda univ"     #キー"university"の値"Keio univ"を"Waseda univ"に変更
>>>student
{'name': 'Kenji', 'age': 19, 'city': 'Tokyo', 'university': 'Waseda univ'}

辞書を作るには波括弧で要素を囲むか、dict関数でキーワード引数を使ってキーと値を指定するか、dict関数にキーと値を要素にもつタプル、を要素にしたリストを渡す方法がある。
タプルに関しては次の記事で紹介するので、知らない人はそっちで勉強してから、もう一度この記事を読んで欲しい。
※キーワード引数については関数について紹介する記事で詳しく書くが、キーワード = という風に関数に渡すものだと考えてもらって良い。

>>>test_dict1 = {"Japan": 1.26, "Brazil": 2.63, "USA": 3.25, "China": 13.86}     #波括弧で辞書を作る
>>>test_dict1
{'Japan': 1.26, 'Brazil': 2.63, 'USA': 3.25, 'China': 13.86} 

>>>test_dict2 = dict("Japan"=1.26, "Brazil"=2.63, "USA"=3.25, "China"=13.86)     #dict関数でキーワード引数を使って辞書を作る
>>>test_dict2
{'Japan': 1.26, 'Brazil': 2.63, 'USA': 3.25, 'China': 13.86}

>>>test_dict3 = dict([("Japan", 1.26), ("Brazil", 2.63), ("USA", 3.25), ("China", 13.86)])     #dict関数にタプルを要素としたリストを渡して辞書を作る
>>>test_dict3
{'Japan': 1.26, 'Brazil': 2.63, 'USA': 3.25, 'China': 13.86}

このほかzip関数というものを使って辞書を作ることもできるが、その説明には繰り返し(for文)という処理が欲しく、それはまだ紹介していないので、またの機会に説明する。

まとめ

以上、今回は変数とリスト・辞書について基本的な部分を説明した。
リストと辞書の重要な特徴をまとめると、

リスト:インデックスでデータ(要素)を管理。ゆえにデータの重複は許される。

辞書:キーでデータ(値)を管理。よってデータに順序はない。またキーの名前に重複があってはならない。キーに重複無しならば、データの重複は許される。

質問やご意見受付中。。。