python　自分用メモ


#####・辞書
辞書は{キー1: 値1, キー2: 値2, …}のように作ります。
例)
dictonary_name = {key_name: value1, key_name: value2, ...}
殆どの場合、文字列が使われる。
辞書は{}で囲む。リストは[]
辞書内には順番がない。
printで出力すると、記述とは異なる順番で出ることがある。
dictonary_name[key_name]と書くと対応した、value値を取り出せる。
	→key_nameがリストのindex番号とように扱われてるんだな。
・key_nameが文字列の場合。
　"key_name"のように辞書内で書かれている。
　出力するときも、dictonary_name["key_name"]　の形で""を忘れないようにする

値の更新
dictonary_name["key_name"]　＝　new_value
値の追加
辞書名[新しいキー名] = 値

辞書もfor分の範囲として利用できる。
for i in 辞書:
　　　　print(i) #インデント必須
	　→iは値ではなく、キー名が出力される
	対応した値が欲しい場合、辞書[キー名]で値を得る必要あり
		
		
#####・while分
インテンドしている行が処理内容になる。
無限ループにならないよう注意
break　（pythonは:いらない)を記述することで、繰り返しブロックから強制的に抜けることができる。
if節と組み合わせて使うと効果的。
continue その特定の繰り返しのみをスキップすることができる
	例)x ==　2のとき continue　でx == 2のときの処理をスキップする。
	
	
#####・input()
input("文字列")で標準入力させる時に、文字を出力できる。文字列は""いるのです！!!!


---
---

#####・関数
関数はprint(),len(),input()など予め用意されているものもある。
自分で作ることもできる。


#####・関数の作り方
def 関数名():
　　　　実行する処理	#インデント必須
例)
def hello():
　　　　print("Hello World")
関数は定義すればすぐに使える。
hello()	←　関数の呼び出し。()がいる。


#####・引数を受け取れる関数
def　関数名(仮引数):　　　#仮引数：引数を受け取るための指定
　　　　実行する処理　　　　#インデント必須
例)
def hello(name):
　　　　print("Hello" + name)
hello("John")	#Johnがnameに代入される
※例のごとく、文字列なら""がいるのです！

#####・変数の範囲：スコープ
仮引数や、関数の中で定義した変数は
その関数の内部でしか利用できない。
例）
上記の変数nameはhello()のなかでしか利用できない。
外でprint(name)としても、エラーになる。
→NameError:name "name" is not defined
	

#####・引数を複数受け取る
関数作成時の仮引数に , で区切って新しく変数を追加すればいい。
def hello(name, message):　　　#左から順番に第一引数、第二引数となる
　　　　print(name +"さん" +message)
hello("john", "こんにちは")　　　　#作成した引数の順序で値が代入される。

#####・引数の初期値
def hello(name, message="こんにちは")	#このように引数に初期値を設定することもできる
　　　　print(name + message)
hello("guest", "hello")
でもちろん上書きもできる。


#####・関数の戻り値
関数で処理されて結果を戻すことができる。：戻り値
def 関数名():
　　　　return 戻り値　#呼び出し元に値を返す
　　　　#return a + b 　などできる。
変数名 =関数名() #とすることで直接戻り値を代入できる

#####・return
returnは戻り値を返すだけでなく、関数を終了させる役割を持つ。
return移行の行は実行されない


#####・モジュール：行がとても長いときに！（つかこれクラスオブジェクトじゃね）
name.py がpythonの書かれたファイル名である。　＝モジュール
とあるモジュールから別のモジュールを読み込むことで、別のモジュールのコードを読み込むことができる。

import を使うことで別のモジュールを読み込める
import モジュール名
　　　　→モジュール名はファイル名から.pyを除いたもの。
モジュール名.関数名()	
でモジュール内部の関数を実行することができる。 . でつなぐ。


#####・ライブラリー
pythonではあらかじめ便利なモジュールが作られていて、利用することができる。
例 random.py
from モジュール名 import 関数名()	
	#で特定の関数のみをモジュールから取り出すこともできる。
	#この場合は、モジュール名.はいらず、　関数名()　のみで実行できる。


---
---


#####・クラス　と　インスタンス
クラスは、設計図である。
インスタンスは、設計図（クラス）から作られた具体的なモノである。


#####・インスタンスの生成方法
１，クラスを用意する
２，クラスからインスタンスを生成する instance
３，インスタンスに情報を追加する

１，class　の作り方
class　クラス名:	#クラス名の最初の文字は大文字にしよう
ex)
class Hello:	#：もいる。
　　　　#インデントして処理内容の記述　
　　　　pass　#passと記述すると何もないという意味
Pythonでは、ブロックが空の場合にはpassキーワードを記述しなければ構文エラーになります。

２，インスタンスの生成
menu_item1 = MenuItem()	　　　#クラス名()。()必須
インスタンス名 = クラス名() で変数に代入することもできる
	※インスタンス名は、変数名と同じ。
	
3、作成したインスタンスに情報を追加する
インスタンス名.変数名　#インスタンス内部に変数を作成することができる
menu_item1.name = "サンドイッチ"　#nameがインスタンス変数
print(menu_item1.name)	#これでインスタンス内部の変数を利用できる。変数名のみnameだけじゃ無理


#####・クラスの中に処理を追加する
クラスの中で定義した関数のことをメソッドと呼ぶ。
メソッドと通常の関数で違うのは、
class MenuItem:
　　　　def hello(self):
　　　　　　　　#このように第一引数にselfを追加する！ということ
　　　　　　　　#selfには、呼び出したインスタンスが代入されている
　　　　　　　　#self = インスタンスそれ自体。
　　　　　　　　print("こんにちは")
ちなみにdefはdefineの意味。
インスタンス.メソッド名()　　とすることで呼び出すことができる
menu_item1 = MenuItem()
menu_item1.hello()	#クラスの内部で定義されたメソッド
またクラスの中で定義されインスタンスに対して呼び出されたものを「インスタンスメソッド」と呼ぶ。直上

#####・selfについて
self =　インスタンス　である。
class MenuItem:
　　　　def info(self):
　　　　　　　　print(self.name)　#このようにselfをインスタンスの代わりに使える
　　　　　　　#printの代わりにreturn self.nameで戻り値とすることもできる。　
menu_item1 = MenuItem()
menu_item1.name = "サンドイッチ"
menu_item1.info()　　　#サンドイッチ　が出力される
classでメソッドを定義する時に、インスタンス名がわからないからselfとしている。
selfがインスタンス名の代わりになるからインスタンスで定義される変数も自由に使えると。
便利だねぇself。

#####・インスタンスメソッドの引数
class MenuItem:
	def get_total_price(self, count):

menu_item1 = MenuItem()
menu_item1.get_total_price(4)	#この4は第2引数に代入される
　　　#第一引数はインスタンスが入るからね。
　
						
#####・__init__メソッド。インスタンスを生成した直後に自動で呼び出されるメソッド。
MenuItem()　が実行される
	↓
MenuItemクラスのインスタンスが生成される
	↓ _init_メソッドがあれば・・・
生成されたインスタンスに対して
__init__メソッドが自動で呼び出される!
class MenuItem:
　　　　def __init__(self):	#作り方は普通のメソッド作成と同じ
　　　　　　　　print("メニューが生成されました")
　　　　　　　　self.変数名 = 値	#インスタンス作成ときに変数に値を代入できる
			↑でもこれだといろいろなインスタンス全部が同じ値になっちゃう！
				↑__init__()メソッドに引数を追加すれば良いんじゃよ。
…
menu_item1 = MenuItem()	#このときに,__init__()が自動実行される
__init__()メソッドによって、インスタンス作成ときにインスタンス変数に値を代入できる。

#####・__init__()メソッドに引数を追加する
class MenuItem:
　　　　def __init__(self, name, price):
　　　　　　　　self.name = name
　　　　　　　　self.price = price	#OK.インスタンスに引数が代入されるんよ。
あれ？引数はいつ渡すの？
menu_item1 =MenuItem("サンドイッチ", 500)	#このようにインスタンスを作る時にクラスの()にいれるんよ。
変数 = クラス名(引数1, 引数2)　だね


#####・クラスオブジェクトを別のファイルに移してimportする
別ファイルをモジュールとよんだね。
import モジュール名
モジュール名.クラス名　でクラスがインスタンス化できるよ。
from モジュール名 import クラス名
この場合は直接クラス名のみだけで、インスタンス化できるよ。モジュール名はいらないよ。

・インスタンスをリストに入れる。
クラスから作成したインスタンスをリストにいれてまとめることができるよ。
for i in リスト名：　	などで利用ができて便利だお

・round(小数)
小数を四捨五入してくれる関数


---
---


#####・クラスの継承
class 新しいクラス名(継承したいクラス名):
	とすることで他のクラスを継承できる。
	継承元を親クラス
	継承したクラスを子クラスと呼ぶ
class Food(MenuItem):
　　　　pass
　　　　#Foodが子。MenuItemが親。
		
継承を行うと、元のクラスのインスタンスメソッドを引き継ぐ。
__init__()メソッドや変数などをそのまま使うことができる。
※インスタンスメソッド：クラスの中で定義された関数のこと。
また子クラスでは、親クラスにない独自のメソッドを追加することもできる。


・継承したクラスで親クラスのメソッドを上書きする。：オーバーライド
親クラスの__init__()メソッドや他のメソッドを子クラスで再定義して上書きすることもできる。
親クラスにあるメソッドと同じ名前のメソッドを、子クラスに作成すると上書きされる。
子クラスのインスタンスでは、上書きされたメソッドが表示される。
※つまり、同名のメソッドがあれば子クラスが優先される。


#####・super()
オーバーライドしたメソッドの中でsuper()とすることで親クラスを呼び出すことができる。
super() = 親クラス名
super().__init__()	とすることで、親クラスの__init__()メソッドを利用できる。

class MenuItem:	#親
　　　　def __init__(self, name, price):
　　　　　　　　self.name = name
　　　　　　　　self.price =price

class Food(MenuItem):	#継承先の子
　　　　def __init__(self, name, price, calorie):	#メソッドのオーバーライド
　　　　　　　　super().__init__(name, price)	
　　　　　　　　#引数は内部でまた特定の値を与える必要があるから記述
　　　　　　　　self.calorie =calorie
親クラスの__init__()を子クラスでも使用できる。