pythonのオブジェクト周り基礎知識 メモ

前回の記事に引き続き、友人がpythonを勉強しているので、ついでに自分もちょっとだけやってます。

 

普段はPHPを使っているので違いを楽しみながらやっています。

 

今日はオブジェクト周りの基礎を勉強したので、メモ程度に残していこうと思います。

 

こちらのサイトを先生にして進めました。

www.python.jp

 

オブジェクトとは

整数、実数などのデータや、関数のようなプログラムをまとめてオブジェクトと呼ぶ。
プログラマが名前をつけられるもの。(if, while等は含まない)

 

リストオブジェクト(配列)

決まった順番で並べられた情報を表現したもの

// 作成
fruit_list = ['apple', 'banana', 'water melon']
print(fruit_list) // ['apple', 'banana', 'water melon']

// 参照
fruit_list = ['apple', 'banana', 'water melon']
print(fruit_list[0]) // apple
print(fruit_list[1]) // banana

// 挿入
fruit_list = ['apple', 'banana', 'water melon']
fruit_list.insert(1, 'grape')

print(fruit_list) // ['apple', 'grape', 'banana', 'water melon']

// 置換
fruit_list = ['apple', 'banana', 'water melon']
fruit_list[0] = 'orange'

print(fruit_list) // ['orange', 'banana', 'water melon']

// 削除
fruit_list = ['apple', 'banana', 'water melon']
del fruit_list[1]
print(fruit_list) // ['apple', 'water melon']

// 長さ
fruit_list = ['apple', 'banana', 'water melon']
print(len(fruit_list)) // 3

// 繰り返し処理
fruit_list = ['apple', 'banana', 'water melon']

for fruit in fruit_list
    print(fruit)

 

辞書オブジェクト(連想配列

// 作成
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
print(fruit_dict) // {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}

// 参照
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
print(fruit_dict['apple']) // りんご

// 追加
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
fruit_dict['orange'] = 'みかん'
print(fruit_dict) // {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ', 'orange': 'みかん'}

// 置換
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
fruit_dict['apple'] = '林檎'
print(fruit_dict) // {'apple': '林檎', 'banana': 'バナナ', 'water melon': 'スイカ'}

// 削除
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
del fruit_dict['apple']
print(fruit_dict) // {'banana': 'バナナ', 'water melon': 'スイカ'}

// 長さ
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}
print(len(fruit_dict)) // 3

// 存在確認
fruit_dict = {'apple': 'りんご', 'banana': 'バナナ', 'water melon': 'スイカ'}

print('apple' in fruit_dict) // true
print('orange' in fruit_dict) // false

 

タプル

ある対象を構成する要素の組み合わせを表現
※辞書オブジェクトはイコールの組み合わせと理解。

 

人形町という地点を構成する要素 = 緯度, 経度

ningyocho = (35.686321, 139.782211)

 

人間の体型表現を構成する要素 = バスト、ウエスト、ヒップ

person = (82, 50, 78)

 

タプル操作

// 参照
print(person[0]) // 82

// 比較 要素数同じ
最初の要素から順番に比較し、差が出た時点で判定
person1 = (82, 50, 78)
person2 = (78, 45, 70)

print(person1 > person2) // true

// 比較 要素数違う
できるところまで比較し、そこまで同じなら要素数が少ない方が小さいと判定される

person1 = (82, 50, 78)
person2 = (82, 50)

print(person1 > person2) // true

// 追加・削除・変更
できない。上書きのみ可能

color = (0, 0, 0)
print(color) // (0, 0, 0)

color = (255, 0, 0) // 上書き
print(print) // (255, 0, 0)

 

タプルとリストの違い

どちらでも実現できることは変わらない。
ある対象を構成する要素を表現する場合にタプルを使う。
単純な集合を表現するならリスト

使い分けるメリット

・タプルを使うことで処理効率が良くなる(らしい)
・タプルを使っているということは、何かを構成するための要素であることをコードから示せる

 

コレクション

リスト、辞書オブジェクト、タプルのような複数のオブジェクトを集約することを目的としたオブジェクトのこと。

コレクション
└ リスト
└ 辞書オブジェクト
└ タプル
└ 文字列
└ …

シーケンス

インデックスを指定して参照できるオブジェクトのこと
シーケンス
└ リスト
└ 辞書オブジェクト
└ タプル
└ 文字列

辞書オブジェクトはkeyを使って参照するので、シーケンスではない。
シーケンスは不等号による比較ができるが、シーケンスではないコレクション(辞書オブジェクト)は比較できない。おそらく順番の概念がないから。

コレクションのアンパック

各要素を変数に一括で入れる

// リスト
fruit_list = ['apple', 'banana', 'water melon']
fruit1, fruit2, fruit3 = fruit_list
print(fruit1) // 'apple'
print(fruit2) // 'banana'
print(fruit3) // 'water melon'
// タプル person = (82, 50, 78) bust, west, hip = person // 省略
// 文字列 word = 'hey' word1, word2, word3 = word
// 省略
// 辞書オブジェクトは? 順番の概念がないからできないかも

 

イカ割りゲーム

サイトの一番最後に演習問題がありました。

イカ割りゲームを自分で作ってみようと言うものでした。

要件を適当にしか把握してなかったのでアウトプットは若干違いましたが、一応1から書き切ることはできました。

github.com

 

元々の要件は東西南北に1マス移動できるボタンを設定して、だんだん近づけていってスイカを割るという要件だったみたいです。

 

自分が作ったのは移動距離もランダムにして3回まで挑戦できるようなゲームです。

じゃんけんみたいな感じです。

 

イカ割り失敗パターン

root@efb2d6a99458:/var/www/html# python water_melon_break_game.py
イカの位置は左から0マス目, 上から2マス目です。
プレイヤーの位置は左から1マス目, 上から2マス目です。
イカ割りを始めるにはそのままエンターキーを押してください。あと3回まで挑戦できます。
2点間の距離: (-1, 0)
これから移動する距離: (1, -2)
残念!もう一回チャレンジしてね!
イカ割りを始めるにはそのままエンターキーを押してください。あと2回まで挑戦できます。
2点間の距離: (-1, 0)
これから移動する距離: (1, -1)
残念!もう一回チャレンジしてね!
イカ割りを始めるにはそのままエンターキーを押してください。あと1回まで挑戦できます。
2点間の距離: (-1, 0)
これから移動する距離: (-1, -2)
運がなかったみたいだね..

 

イカ割り成功パターン

root@efb2d6a99458:/var/www/html# python water_melon_break_game.py
イカの位置は左から0マス目, 上から1マス目です。
プレイヤーの位置は左から2マス目, 上から2マス目です。
イカ割りを始めるにはそのままエンターキーを押してください。あと3回まで挑戦できます。
2点間の距離: (-2, -1)
これから移動する距離: (-2, -2)
残念!もう一回チャレンジしてね!
イカ割りを始めるにはそのままエンターキーを押してください。あと2回まで挑戦できます。
2点間の距離: (-2, -1)
これから移動する距離: (-2, 0)
残念!もう一回チャレンジしてね!
イカ割りを始めるにはそのままエンターキーを押してください。あと1回まで挑戦できます。
2点間の距離: (-2, -1)
これから移動する距離: (-2, -1)
イカが割れました!おめでとう!

 

とりあえずタプルの使い方とか基本的なpythonの書き方は分かってきたのでよしとします。