私的AI研究会 > Python覚書2
def 関数名(引数1, 引数2,...): # 関数の処理を記述 return 戻り値
$ vi test.py #!/usr/bin/env python import sys def my_sum(x,y): z = x + y return z if __name__ == '__main__': out = my_sum(int(sys.argv[1]), int(sys.argv[2])) print(out)・if __name__ == "__main__":は、「このモジュールが(他のプログラムから呼び出されたのではなく)自身が実行された場合」という意味がある。
実行結果
$ python test.py 1 2 $ 3
$ vi my_function.py #!/usr/bin/env python def my_sum(x,y): z = x + y return z def my_dif(x,y): z = x - y return z
import 関数のファイル名
$ vi test2.py #!/usr/bin/env python import my_function if __name__ == '__main__': a = my_function.my_sum(2,1) b = my_function.my_dif(2,1) print(a) print(b)
実行結果
$ python test2.py 3 1
$ tree . ├── my_module │ ├── __init__.py │ └── my_function.py ├── test.py └── test2.py
from ディレクトリ名 import モジュール名
vi test3.py #!/usr/bin/env python from my_module import my_function if __name__ == '__main__': a = my_function.my_sum(2,1) b = my_function.my_dif(2,1) print(a) print(b)
実行結果
$ python test2.py 3 1
from math import cos,sin,tan print("{0}".format(cos(1)))from モジュール名 import メンバ,メンバ,… で指定したメンバだけをインポートる。
$ tree . └── my_module ├── __init__.py ├── my_module_sub1 │ ├── __init__.py │ ├── my_function2.py │ └── my_function3.py ├── my_module_sub2 │ ├── __init__.py │ └── my_function4.py ├── my_function.py └── my_function1.py
パッケージのインポート方法
import my_module
import my_module.my_module_sub1
import my_module.my_module_sub2.my_function4
from my_module.my_module_sub2 import my_function4
timeモジュールのsleepという関数を使用する場合の例
import time print('start') time.sleep(3) print('end')
import time as t print('start') t.sleep(3) print('end')
from time import sleep print('start') sleep(3) print('end')
どの読み込み方法でも同じ結果。
import math print("pi = {0}".format(math.pi)) print("floor(5.2) = {0}".format(math.floor(5.2))) print("ceil(5.2) = {0}".format(math.ceil(5.2)))・piは円周率の値を返します。 ・floor(小数)は引数の小数以下の最大の整数を返す。
class クラス名: 処理コード
$ vi class_test.py class TestClass: pass中身のないクラスを作成。つづいて「()」を後ろにつけてインスタンスを生成する。
class TestClass: pass x = TestClass()
class TestClass2: val = [] def __init__(self): print("init:" + str(self.val)) # 初期化 self.val.append(1) self.val.append(2) self.val.append(3) def test_method1(self): print("test_method2:" + str(self.val)) testClass2 = TestClass2() testClass2.test_method1()
実行結果
init:[] test_method2:[1, 2, 3]
- コーディング例 (コンストラクタに引数を渡す場合)
class TestClass3: val = [] def __init__(self, val1, val2): # 初期化 self.val.append(val1) self.val.append(val2) print("init:" + str(self.val)) testClass3 = TestClass3(1, 2)
実行結果
init:[1, 2]
- コンストラクタがない場合、何もしないコンストラクタが定義されていると同義。
class TestClass4: val = [] def __del__(self): # デストラクタ print("del:デストラクタ") testClass4 = TestClass4() del testClass4
実行結果
del:デストラクタ
- 「仕様上、プロセス終了までにデストラクタが必ず呼び出される保証がない」「複数のオブジェクトが相互作用する場合、どのオブジェクトのデストラクタを先に実行するか決定できないため挙動が怪しくなる」などの理由で、ほとんどの場合デストラクタは定義しない。
class Parent: parent_val = "Parent" def parent_function(self): print("ParentMethod:" + self.parent_val) class Child(Parent): child_val = "Child" def child_function(self): print("ChildMethod:" + self.child_val) child = Child() print(child.parent_val) print(child.child_val) child.parent_function() child.child_function()
実行結果
Parent Child ParentMethod:Parent ChildMethod:Child
- 作成したChildインスタンスでは、Childクラスの変数、メソッドだけでなくParentクラスの変数、メソッドも使用できる。
- Childクラスのメソッド内からもParentクラスの要素を呼び出すことができる。
- 継承元と継承先に同じ名前の変数、メソッドが定義されている場合、作成したインスタンスのクラスの内容が優先される。ただし、継承先のメソッド内からは、継承元の変数、メソッドを「super().」という修飾子を付けることで呼び出すことが可能。
- コンストラクタは作成したインスタンスのコンストラクタのみ呼び出される。
継承元クラスのコンストラクタを呼び出したいときは、継承先のコンストラクタ内で継承元のコンストラクタを呼び出す。class Parent: def __init__(self): print("Parentコンストラクタ") class Child(Parent): def __init__(self): super().__init__() print("Childコンストラクタ")
class Spam: __attr = 100 def __init__(self): self.__attr = 999 def method(self): self.__method() def __method(self): print(self.__attr) spam =Spam() spam.method() #OK spam.__method() #NG spam.__attr #NG
class TestStaticMethod: @staticmethod def function(): print("staticメソッド") TestStaticMethod.function() # staticメソッド testStaticMethod = TestStaticMethod() testStaticMethod.function() # staticメソッドインスタンスからも呼び出すことが可能。
class TestClassMethod: @classmethod def function(cls): print("classメソッド:{}".format(cls)) TestClassMethod.function() # classメソッド:<class '__main__.TestClassMethod'> testClassMethod = TestClassMethod() testClassMethod.function() # classメソッド:<class '__main__.TestClassMethod'>
class TestClass5: val = "クラス変数" def __init__(self, arg): self.x = arg testClass5_1 = TestClass5("インスタンス変数1") testClass5_2 = TestClass5("インスタンス変数2") print(TestClass5.val) # クラス変数 print(testClass5_1.x) # インスタンス変数1 print(testClass5_2.x) # インスタンス変数2 print(testClass5_1.val) # クラス変数