python 高階関数について
高階関数について
■enumerateについて 今のループが何番目かのインデックスを扱うのに便利なenumerate関数。 enumerate関数は列挙オブジェクトを返し、forループにおいては、インデックスを利用したいループに使われます 引数にどの数字からカウントを始めるのか指定するstartを設定できる。デフォルトは0。
work_time_list = [3, 5, 2, 4, 2, 5, 4] for index,work_time in enumerate(work_time_list,start=1): print("{}日目の勤務予定:{}時間".format(index,work_time)) 1日目の勤務予定: 3時間 2日目の勤務予定: 5時間 3日目の勤務予定: 2時間 4日目の勤務予定: 4時間 5日目の勤務予定: 2時間 6日目の勤務予定: 5時間 7日目の勤務予定: 4時間
■zip関数について
zip関数の引数は、3つ以上指定可能。 for文で使うと、ループごとに要素を2つ受け取って処理を進めていきます。
day_list = ['月', '火', '水', '木', '金', '土', '日'] work_time_list = [3, 5, 2, 4, 2, 5, 4] for day,work_time in zip(day_list,work_time_list): print('{}曜日の勤務時間: {}時間'.format(day, work_time))
■リスト内包表記について
[リストの各要素になる値 for 変数 in ...]
・for ... in ... の書き方はいつものfor文と同じ ・for文をリスト [] で囲むように書く ・「リストの各要素になる値」を for の左側に書く
python クラスとインスタンスについて
クラスとインスタンス
クラスから作られたオブジェクトのことを、インスタンスという。
■クラス変数について クラス変数とは、クラス自体が保持する変数を指す。 クラス名の下に宣言された変数はクラス変数とみなす。
クラス変数が定義されていると、インスタンス作成時に、インスタンスにも同じ変数名が設定されます。 つまり、(同名のインスタンス変数がなければ)selfを通してクラス変数を利用できます。 これは、クラス変数をインスタンス変数のデフォルト値にするための機能ですが、紛らわしいです。 クラス自体が保持する変数は、self.変数名としないでクラス名.変数名の形式で利用するようにしましょう。 特別な理由がない限り、self.変数名で利用したい場合は、クラス変数は定義せずにinitメソッド内で定義する。
■クラスのイメージ pyq
ソフトウェアの設計において最も重要なのは、抽象化する力です。複数の物事の共通点を見つけて、それらをひとつの概念として抽出する(=これがクラスになる)ことが必要。共通点を見つけて同じ性質を与えることで(個人という概念を抽出して属性を付与する)、ボリュームが増えたり減ったりしてもモノとして機能するようになります。なので、自分が作っているシステムの動作イメージから、動作の過程で必要な情報は一体何なのかを考えてカテゴリー分けを行い、ひとつのコンセプトや概念として抽出することが重要です。
■クラスのイメージ
「ヒト」・・・そのシステムやアプリケーションにおける登場人物 「モノ」・・・そのシステムやアプリケーションで扱うサービス
class sample1: name = "name" print(sample1.name) sample1.name="changed_name" print(sample1.name) print() class sample2: def __init__(self,value): self.value =value s1=sample2("AAA") s2=sample2("BBB") print(s1.value) print(s2.value) s1.value="CCC" print(s1.value) print(s2.value)
■メソッド クラスが内包する関数をメソッドと呼びます。メソッドはクラスに関連する処理を記述。 クラスが内包するデータを属性と呼びます。属性はクラスのインスタンスごとのデータを保持。
__init__
クラスからインスタンスが生成された直後に実行される、特殊なメソッド
class User(object): def __init__(self, aa, bb): self.aa = namae self.bb = tosi def info(self): return self.namae + ':' + str(self.tosi)
■他のクラスがアクセスできるかどうかを制限について (アンダースコア×2)で始まるクラス変数やインスタンス変数については、クラス名やオブジェクト名を経由して参照できなくなります。データに対してアクセス制限をつけることができます。 num2や__num3にアクセスするには、このように関数の内部からアクセスする。
class sample: num1 =100 __num2 =200 def __init__(self): self.__num3 =300 def show_num(self): print(sample.__num2) print(self.__num3) print(sample.num1) s = sample() s.show_num()
100 200 300
name変数は、実行されている状況により値が変わります。 python xxx.pyと実行した場合:xxx.pyの中では、nameの値は'main'という固有の文字列になる。
■クラスの継承
クラスには親子関係を定義できます。あるクラスの情報(変数や関数)を引き継いで、新しいクラスを作成できます。
class A: def __init__(self): self.name = 'Class A' class B(A): pass b = B() print(b.name) # Class A
■オーバーライド 継承では同じメソッドがあると、内容を上書きして差し替えることが可能です。
親クラスのメソッドに、子クラスからアクセスする時に使うのが、super関数です。 super().親クラスのメソッド(引数)のように記述します。
class A: def hello(self): print("Class A says Hello") class B(A): def hello(self): super().hello() print("Class B says Hello") b =B() b.hello()
Class A says Hello Class B says Hello
■クラス作成
class Menu: def __init__(self,name,price): self.name=name self.price=price def discount20(self): return int(self.price*0.8) def main(): """メインの処理""" menu_1 = Menu('のり弁', 350) menu_2 = Menu('シャケ弁', 400) print(menu_1.name + 'は' + str(menu_1.discount20()) + '円(通常:' + str(menu_1.price) + '円)') print(menu_2.name + 'は' + str(menu_2.discount20()) + '円(通常:' + str(menu_2.price) + '円)') if __name__ == '__main__': main() >> のり弁は280円(通常:350円) シャケ弁は320円(通常:400円)