fkeiwkblog

日記や、今時のAIの餌(学習の)を生産してます。プログラムライブラリなど

Python レベル別 の中級向け

オブジェクト指向プログラミング

class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
  
    def say_hello(self):  
        print("Hello, my name is " + self.name)  
  
person = Person("Alice", 20)  
print(person.name)  
person.say_hello()  

Personというクラスを定義します。クラスは、オブジェクトを作成するための設計図のようなものです。initメソッドは、クラスからオブジェクトを作成する際に呼び出される特殊なメソッドで、初期化を行います。

self.name = nameは、オブジェクトの属性nameに引数nameを代入するコードです。self.age = ageは、オブジェクトの属性ageに引数ageを代入するコードです。person = Person("Alice", 20)は、Personクラスからpersonというオブジェクトを作成します。

print(person.name)は、personオブジェクトの属性nameを出力するコードです。person.say_hello()は、personオブジェクトのsay_helloメソッドを呼び出すコードです。say_helloメソッドは、self.nameを出力するメソッドです。

ファイルの入出力

# ファイルに書き込む  
with open("output.txt", "w") as f:  
    f.write("Hello, World!")  
  
# ファイルから読み込む  
with open("input.txt", "r") as f:  
    data = f.read()  
    print(data)  

with open("output.txt", "w") as f:は、ファイルoutput.txtを書き込みモードで開き、ファイルオブジェクトfを作成するコードです。f.write("Hello, World!")は、ファイルオブジェクトfに"Hello, World!"という文字列を書き込むコードです。

with open("input.txt", "r") as f:は、ファイルinput.txtを読み込みモードで開き、ファイルオブジェクトfを作成するコードです。data = f.read()は、ファイルオブジェクトfから全てのデータを読み込み、変数dataに代入するコードです。print(data)は、変数dataを出力するコードです。

## 正規表現  
import re  
  
text = "The quick brown fox jumps over the lazy dog."  
pattern = "fox"  
result = re.search(pattern, text)  
if result:  
    print("マッチしました")  
else:  
    print("マッチしませんでした")  

reモジュールをインポートしています。textに文字列を代入します。patternに正規表現のパターンを指定します。re.search(pattern, text)は、textに対してpatternを検索するコードです。resultには、patternにマッチした部分が格納されます。

if result:は、resultがNoneでない場合(つまり、patternにマッチした場合)にTrueとなります。elseの場合は、resultがNoneである場合(つまり、patternにマッチしなかった場合)に実行されます。

モジュールの作成と使用

  
# mymodule.py  
def greet(name):  
    print("Hello, " + name + "!")  
  
if __name__ == "__main__":  
    greet("Alice")  
  
# main.py  
import mymodule  
  
mymodule.greet("Bob")  

mymodule.pyというモジュールを定義します。greet関数を定義して、nameを引数に取り、"Hello, "とnameと"!"を連結した文字列を出力します。if name == "main":は、このスクリプトが直接実行された場合に、greet("Alice")を実行するためのコードです。

main.pyでは、mymoduleをインポートして、mymodule.greet("Bob")を実行しています。

マルチスレッドプログラミング

import threading  
  
def worker(n):  
    print("Worker" + str(n) + " started")  
    for i in range(5):  
        print("Worker" + str(n) + " working")  
    print("Worker" + str(n) + " finished")  
  
threads = []  
for i in range(3):  
    t = threading.Thread(target=worker, args=(i,))  
    threads.append(t)  
    t.start()  
  
for t in threads:  
    t.join()  

threadingモジュールをインポートしています。worker関数を定義して、nを引数に取り、スレッドが実行する処理を記述しています。forループで、worker関数を3つのスレッドで実行しています。Threadオブジェクトを作成し、targetにworker関数、argsに引数を指定します。

threads.append(t)は、tをthreadsリストに追加するコードです。t.start()は、tのスレッドを開始するコードです。forループで、すべてのスレッドの終了を待っています。

デバッグ技術

def divide(a, b):  
    try:  
        result = a / b  
        return result  
    except ZeroDivisionError:  
        print("0で割ることはできません")  
        return None  
  
x = 10  
y = 0  
z = divide(x, y)  
print(z)  

divide関数を定義して、aとbを引数に取り、aをbで割った結果を返します。tryブロックで割り算を実行しています。もしbが0で割り算ができない場合は、exceptブロックでZeroDivisionErrorをキャッチし、エラーメッセージを出力します。

x = 10とy = 0を定義し、zにdivide(x, y)の結果を代入します。print(z)は、zを出力するコードです。実行結果は、0で割ることはできませんというエラーメッセージが出力され、Noneがzに代入されます。

ユニット操作

ユニット操作とは、プログラムにおいて単位テストを行うことを指します。単位テストは、関数やメソッドなどの小さな単位に対して、テストを実行することです。ユニット操作を実行することで、個々の関数やメソッドが正しく動作していることを確認することができます。

ユニット操作は、以下の手順で実行されます。

テスト対象の関数やメソッドを選択する
テストケースを用意する
テストケースを実行する
結果を検証する
テストケースは、入力値や期待される出力値を定義することで作成されます。テストケースを実行することで、テスト対象の関数やメソッドが期待される結果を返すかどうかを確認することができます。

Pythonには、標準ライブラリにunittestモジュールが用意されています。unittestモジュールは、テストケースを定義するためのクラスやメソッド、アサーションなどを提供しています。

以下は、unittestモジュールを使ったユニット操作の例です。

import unittest  
  
def add(x, y):  
    return x + y  
  
class TestAdd(unittest.TestCase):  
    def test_add(self):  
        self.assertEqual(add(1, 2), 3)  
        self.assertEqual(add(-1, 1), 0)  
        self.assertEqual(add(0, 0), 0)  
  
if __name__ == '__main__':  
    unittest.main()  
  

add関数を定義し、xとyを引数に取り、xとyを加算した結果を返します。TestAddクラスを定義して、test_addメソッドを定義しています。test_addメソッドでは、assertEqualメソッドを使って、add関数の結果が期待される値に等しいかどうかを検証しています。

if name == 'main':は、このスクリプトが直接実行された場合に、unittest.main()を実行するためのコードです。unittest.main()は、TestAddクラスのtest_addメソッドを実行して、結果を出力します。

以上のように、unittestモジュールを使ってユニット操作を実行することで、関数やメソッドの正確性を確認することができます。