【超まとめ】解説!!「Pythonの基礎まとめ」【AI/Python】

こんにちはヤク学長です。 データサイエンティスト兼ファーマシストで、アルゴリズムやBI開発を行っています。 本記事の目的は、「pythonの基本操作を知る」ことを目的としています。
【Python】WindowsにPythonをインストールしよう【入門編】
【本記事のもくじ】 まず、「Python」に真剣に取り組むための概要を解説します。 下記の方法で、簡単に概要を抑えることができます。
  • 1.3分で学ぶpythonの基礎知識
  • 2.基本構文:標準入出力 , コメント文 , 変数
  • 3.基本構文:変数の応用 , 定数 , format文の応用
  • 4.基本構文:論理型
  • 5.基本構文:数値型
  • 6.python(数値について, 2 進数 , 8 進数 , 16 進数)
  • 7.python数値について(複素数)
  • 8.文字列メソッド
  • 9.数値型から文字列型へ(str関数)
  • 10.文字列型から数値型へ(int,float関数)
  • 11.リスト(配列)型
  • 12.辞書型
  • 13.タプル
  • 14.セット
  • 15.制御文(if文)
  • 16.ループ文(while)
  • 17.関数
  • 18.グローバル変数
  • 19.inner関数とノンローカル変数
  • 20.ジェネレータ関数
  • 21.高階関数
  • 22.lambda式
  • 23.再帰
  • 24.リスト内包表記
  • 25.デコレータ関数
  • 26.オブジェクト指向:クラスの定義
  • 27.インスタンスメソッド、クラスメソッド、スタティックメソッド
  • 28.オブジェクト指向:継承
  • 29.クラスの多重継承
  • 30.ファイル入力
  • 31.ファイル出力
  • 32.with文を使ってファイルを開く
  • 33.ファイルの便利な活用方法
  • 34.圧縮ファイルの扱い
  • 35.高度なファイルの操作
それでは、上から順番に見ていきます。 なお、本上記の方法を抑えれば成果が出ます。 記事の内容は「転載 & 引用OK」問題ありません。
目次

1.3分で学ぶpythonの基礎知識

Pythonは、高水準のプログラミング言語です。 一般的なプログラミングタスクからWeb開発、科学計算、データ分析、人工知能まで、幅広い用途で利用されています。 読みやすさや簡潔な文法が特長で、多くのユーザーや開発者がいる活発なコミュニティが存在しています。

Pythonはどんなことができる?

Pythonは多用途の言語で、以下のタスクなどに利用することができます:
  • Web開発(DjangoやFlaskといったフレームワークを使用)
  • 科学計算やデータ分析(NumPy、Pandas、Matplotlibといったライブラリを使用)
  • 人工知能や機械学習(TensorFlowやPyTorchといったライブラリを使用)
  • スクリプトや自動化(バッチ処理やシステム管理などのタスク)
  • GUI開発(TkinterやPyQtといったライブラリを使用)
  • ゲーム開発(Pygameといったライブラリを使用)
  • ネットワークプログラミング(TwistedやScapyといったライブラリを使用)
これらはただいくつかの例ですが、Pythonを使用すると可能性はほぼ無限です。

2.基本構文:標準入出力 , コメント文 , 変数

関数と引数

関数は、プログラムの中で再利用可能なコードブロックであり、一定の入力を受け取り、処理を行い、出力を返すものです。関数を使用することで、同じコードを繰り返し書く必要がなくなり、コードの再利用性や保守性が向上します。 一方、引数は、関数に渡される入力値のことです。関数は、引数に基づいて処理を実行し、結果を返します。引数は、必須であったり、オプションであったり、複数あったりする場合があります。引数を使うことで、同じ処理を行う関数でも、引数によって異なる結果を返すことができます。 関数と引数は、一緒に使われることが多く、引数を指定することで関数の動作をカスタマイズすることができます。また、関数を使うことで、複雑な処理をシンプルに記述することができ、コードの可読性を向上させることができます。 以下にPythonの関数と引数の例を示します。
# 関数の定義
def greet(name):
print("こんにちは、" + name + "さん!")
# 関数の呼び出し
greet("太郎") # こんにちは、太郎さん!と出力される
greet("花子") # こんにちは、花子さん!と出力される
この例では、greet()という関数を定義しています。この関数は、nameという引数を受け取り、その引数を使って挨拶のメッセージを出力します。そして、greet()関数をgreet("太郎")greet("花子")のように呼び出しています。これにより、関数は異なる引数値を受け取り、それに基づいて適切な出力を行います。 また、関数は複数の引数を受け取ることもできます。例えば、次のように2つの引数を受け取る関数を定義できます。
# 関数の定義
def add_numbers(x, y):
return x + y
# 関数の呼び出し
result = add_numbers(3, 5) # resultに8が代入される
この例では、add_numbers()という関数を定義しています。この関数は、2つの引数xyを受け取り、それらの値を足し合わせた結果を返します。そして、add_numbers(3, 5)のように関数を呼び出しています。これにより、関数は2つの引数を受け取り、それらの値を足し合わせた結果である8を返します。 引数を使用することで、関数を柔軟にすることができます。関数が受け取る引数の数と型は、関数が行う処理をカスタマイズするための重要な要素です。

標準出力:print()

print(“Hello World”) 
→Hello World が出力される

コメント文:# や ””” ”””

#コメント
→コメントを残すことができる
""
 複数行にまたがったコメント
""
→コメントを複数行に渡って表示させることができる

標準入力:input関数

name = input("あなたの名前は?")
→nameという変数に標準入力情報が入る

標準出力の一部に変数に値を入れる:format関数

print("My name is {}". format (name))
→{}に. format (name)のnameが入る

変数

値を入れて取り出すときにしようするもの
b = 'hello'
→bに文字列 hello が入る
a = b = 'hello'
→aと b に文字列 hello が入る
print("My name is {}". format (a, b))
→My name is ‘hello’ ‘hello’が出力される

3.基本構文:変数の応用、定数、format文の応用

変数の応用

変数に使える文字は、大文字・小文字のアルファベット、アンダースコアー 、数字、日本語の ASCII 文字がある。
 animal = 'dog'
 動物 = 'cat'
 print(動物)
→catが出力される

定数

定数とは一度値を設定すると 変更してはいけない 変数。全て大文字で定義する
 LEGAL_AGE = 18
 age = 18
 if age < LEGAL_AGE: #ageが20より小さいときに処理を実行
   print('未成年')
 else:
   print('成人')
→成人が出力される

format文の応用

pythonのバージョンによってはfとして省略することが可能
 print(f'age = {age}')
→age = 18
 print(f'{age=}')
→age=18

sepとend

sependは、Pythonのprint()関数のオプション引数で、出力時の区切り文字や末尾文字列を指定することができます。 sepは、オブジェクト間の区切り文字を指定するために使用されます。デフォルトのsepは、オブジェクト間に空白文字(スペース)が挿入されますが、これを変更することができます。例えば、以下のようにsepをカンマに設定すると、オブジェクト間にカンマが挿入されます。
print('apple', 'banana', 'orange', sep=', ')
# 出力結果: apple, banana, orange
endは、出力結果の末尾に追加される文字列を指定するために使用されます。デフォルトのendは改行文字(\n)ですが、これを変更することができます。例えば、以下のようにendを空文字列に設定すると、改行せずに出力されます。
print('Hello, world!', end='')
print('How are you?')
# 出力結果: Hello, world!How are you?
sependを使うことで、print()関数の出力結果をカスタマイズすることができます。

4.基本構文:論理型

論理型

論理型とは、True と False の二つの値を扱う変数の型です。
 is_animal = False  #変数 is_animal に False を代入
 if is_animal:
 print('動物')
→is_animal が True の場合のみ if の中の処理を実行する この場合は、出力されない

or文

ORの場合、 A OR B の A, Bのどちらか
 is_man = False
 is_adult = True
 if is_man or is_adult:
 print('男か大人です')
→出力される

and文

ANDの場合、 A AND B の A, B どちらも
 if is_man and is_adult:
 print('成人の男性です')
→出力されない

5.基本構文:数値型

数値型

+:加算、 — : 引き算 , * : 掛け算 , / : 割り算 (小数点以下計算)

 value = 1
 print(value)
→1
 value = -2
 print(value)
→-2
 value = value + 4
 print(value)
→2
print(value * 4)
→8
print(value)
→2
print(value / 3)
→0.6666666666666666

//: 割り算(小数点以下切り下げ ), %:剰余

 value = 10
 print(value //3)
→3
 print(value % 3)
→1

**:べき乗

 value += 3 # value = value + 3
 print(value)
→13
print(value ** 3)
→2197

浮動小数点数

 height = 175.5
 print(height)
→175.5
print(type(height))
→高さが定義されている場合、出力は <class ‘type’> になります。
print(height + 10)
→185.5

>、 <<:シフト演算

value = 8
 print(value >> 2)
→2
 print(value << 3)
→64

&, |:ビット演算 (and,or)

print(12 & 21)
→12 & 21 = 01100 and 10101 = 00100 = 4
print(12 | 21)
→12 | 21 = 01100 or 10101 = 11101 = 29

.python(数値について。 2 進数 , 8 進数 , 16 進数)

2進数の表記

2進数は数値の前に「0b」、8進数は「0o」、16進数は「0x」をつけます。 右辺は2進数のため、変数ageには7が格納されます。
age=0b111
 print(age)
→7 右辺は8進数のため、変数ageには9が格納されます。
 age=0o11
 print(age)
→9 右辺は16進数のため、変数ageには17が格納されます。
 age=0x11
 print(age)
→11

2進数の文字列変換

2進数の数値を文字列にするにはbin数値、8進数の場合はoct数値、16進数はhex数値を用います。
 print(bin(15))
→2進数としてOb1111が表示されます。
 print(oct(15))
→8進数としてOo17が表示されます。
 print(hex(15))
→16進数としてOxfが表示されます。

7.python数値について(複素数)

複素数は、実数と虚数を含んだ数値です。 実数が3、虚数が2の場合、複素数として、3+2jと表示します
a=1+3j
b=3+5j
print(a+b)
→複素数4+8jが表示されます。
print(a*b)
→複素数12+14jが表示されます。

複素数を表す方法:complex関数

実数が3、虚数が2の場合、複素数としてcomplex(3,2)と表示します
 a=complex(1,3)
 b=complex(3,5)
 print(a+b)
→複素数4+8jが表示されます。
 print(a*b)
→複素数12+14jが表示されます。 ※複素数型の実数と虚数をそれぞれ、取り出すには、real,imagを利用します。
 a=complex(1,3)
 print(a.real)
→1.0
 print(a.imag)
→3.0 文字列を変数として扱う時は、””で囲って変数に代入する。 また、”””~”””とすると改行も自由に挿入して宣言することもできる。
 fruit=“apple”
 fruit*5
→fruitを5回表示させる
 fruit[3]
→fruitに格納した4番目の文字を表示
fruit="""apple
 orange
 grape
 """
→apple banana grape

8.文字列メソッド

count関数(指定した文字列が何個存在するか)

 msg='ABCDEABC'
 print(msg.count('ABCDEF'))
→0

startswith(対象の文字列が指定した文字列で始まっているか),endswith(starwithの逆)

 print(msg.startswith('ABCD'))
→TRUE
 print(msg.endswith('FABC'))
→False

strip,rstrip,lstrip

 print(msg.strip('ACB'))
→DE
 print(msg.rstrip('ACB'))
→ABCDE
 print(msg.lstrip('ACB'))
→DEABC

upper,lower,swapcase,replace,capitalize

 msg='abcABC'
 msg_u=msg.upper()
 msg_l=msg.lower()
 msg_s=msg.swapcase()
 print(msg_u)
→ABCABC
 print(msg_l)
→abcabc
 print(msg_s)
→ABCabc
msg='Helloworld'
 print(msg.capitalize())
→Helloworld

文字列の一部取り出し、format関数、文字列から数値への変換、islower,isupper

msg='h'
 print(msg.isupper())
→False
msg='hello,myname'
 print(msg[0:10:2])
→hllo,myname
 name='Tanaka'
 msg=f'mynameis{name=}
 print(msg)
→mynameisname=’Tanaka’
 msg='12.21'
 int_msg=float(msg)
 print(int_msg)
→12.21

find,index,rfind,rindex

 msg='ABCDEABC'
 print(msg.rfind('ABDC'))
→-1

9.数値型から文字列型へ(str関数)

 int_num=10
 float_num=10.25
 print("int_num="+int_num)
→文字列型+int型では、エラーとなる

str関数で解消

 print("int_num="+str(int_num))
 print("float_num="+str(float_num))

10.文字列型から数値型へ(int,float関数)

 int_str="10"
 float_str="10,25"
 int(int_str)
→文字列”10″が整数10に変換されます。
 float(float_str)
→文字列”10,25″が浮動小数点数10.25に変換されます。

11.リスト(配列)型

リストの型

リスト変数のイメージはなにか一つの箱を思い浮かべてください。 この箱の中に複数の値を入れることができるものだと思ってください。[]かっこで表記します。
list_a=[1,2,3,4]
※list_aに数値1,2,3,4を格納します。
print(list_a[0])
※0を指定するとlistの1番目の要素である1が表示されます (indexは0から始まります)
list_a=[1,2,"apple",4]
※list_aに数値1,2,4と文字列のappleを格納します。
print(list_a[-2])
※-2を指定するとlistの最後から2番目の要素 →appleが表示されます
list_a=[1,[0,1,"apple"],3,"melon"]
※list_aに数値1,3と文字列のapple,リスト[0,1,”apple”]を格納します。
print(list_a[1][2])
※listの2番目の配列の3番目の要素 →appleが表示されます。
list_a[1][2]='pin'
※listの2番目の配列の3番目の要素がpinになります。

リストのスライス

list_a[0:2]
※1番目から2番目までの値
list_a[0:4:2]
※1番目から4番目まで1つ飛ばし
list_a[-3:]
※最後から3番目以降

リストのメソッド

append: ※値を一つ追加 extend: ※リストにリストを追加して拡張 insert: ※リストに位置を指定して値を追加 clear: ※リストを初期化 remove: ※指定した要素をリストから削除 pop: ※指定したインデックスの要素を取り出して削除 count: ※指定した値がリストに含まれる数を返す index: ※指定した値のインデックスを返す copy: ※リストをそのままコピーして新たなリストを作成し、返す

並び替え

sort: ※リストを並び替える(同じ型でないとエラー)sortedでもできる reverse: ※リストの順番を入れ替える

リストの注意点

リストはPythonのプログラミングにおいて非常に便利なデータ構造ですが、いくつかの注意点があります。
  • リストの要素には異なる型を混ぜることができますが、コードの可読性を損なうことがあります。特に、同じ型の要素の場合、コードを読みやすくするために、異なる型を混ぜないようにすることが望ましいです。
  • リストは可変オブジェクトであるため、リスト自体やリストの要素を変更することができます。そのため、同じリストを参照する複数の変数がある場合、ある変数を通じて行った変更は、他の変数にも反映されます。
  • リストは、大量の要素を持つ場合、メモリ使用量が大きくなるため、パフォーマンスの低下が発生する可能性があります。この場合、ジェネレーター式などの遅延評価の手法を使用することで、リストよりも少ないメモリ使用量で処理を行うことができます。
  • リストの操作によって、リストの要素数が変わる場合(例えば、append()remove())、ループ内で操作を行うと予期しない結果が得られる可能性があります。この場合、イテレーターやコピーを使用することで、問題を回避することができます。
  • リストの要素はインデックス番号でアクセスできますが、存在しないインデックスを指定すると、IndexError例外が発生します。また、負のインデックスを指定すると、後ろから数えたインデックス番号に変換されます。例えば、リストの最後の要素にアクセスするには、list[-1]と指定することができます。
これらの注意点を把握し、適切にリストを扱うことが重要です。

リストはcopyを使おう

Pythonのリストには、参照による代入が行われる場合があります。つまり、リスト変数を新しい変数に代入した場合、元のリストと新しい変数が同じオブジェクトを参照するようになります。そのため、元のリストに変更を加えると、新しい変数にも変更が反映されます。 例えば、以下のコードを考えてみましょう。
original_list = [1, 2, 3]
new_list = original_list
original_list.append(4)
print(new_list)
このコードを実行すると、出力結果は[1, 2, 3, 4]になります。つまり、original_listnew_listは同じオブジェクトを参照しているため、original_listに要素を追加すると、new_listにも変更が反映されていることがわかります。 このような問題を回避するためには、リストのcopy()メソッドを使用して、新しいリストを作成することができます。copy()メソッドを使用すると、元のリストとは別のオブジェクトを参照する新しいリストが作成されます。 例えば、以下のコードを考えてみましょう。
original_list = [1, 2, 3]
new_list = original_list.copy()
original_list.append(4)
print(new_list)
このコードを実行すると、出力結果は[1, 2, 3]になります。つまり、original_listnew_listは別々のオブジェクトを参照しているため、original_listに要素を追加しても、new_listには変更が反映されないことがわかります。 したがって、リストをコピーする場合は、copy()メソッドを使用することをお勧めします。また、Python 3.3以降では、list()を使用しても同じようにコピーすることができます。例えば、以下のように使用できます。
original_list = [1, 2, 3]
new_list = list(original_list)
original_list.append(4)
print(new_list)
このコードを実行すると、出力結果は[1, 2, 3]になります。

リストの具体的な利用方法

リストはPythonのプログラムにおいて、様々な用途で利用されます。以下に具体的なリストの利用方法をいくつか紹介します。
  • データの格納と処理:リストは、データの集合を格納し、そのデータを処理するために使用されます。例えば、整数のリストを定義し、その合計値を計算することができます。
numbers = [1, 2, 3, 4, 5]
total = sum(numbers)
print(total) # 出力結果: 15
  • データのフィルタリング:リスト内の特定のデータを抽出することができます。例えば、偶数だけを抽出することができます。
numbers = [1, 2, 3, 4, 5]
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers) # 出力結果: [2, 4]
  • データのソート:リストの要素を並び替えることができます。例えば、文字列のリストをアルファベット順に並び替えることができます。
fruits = ['apple', 'orange', 'banana']
sorted_fruits = sorted(fruits)
print(sorted_fruits) # 出力結果: ['apple', 'banana', 'orange']
  • データの追加と削除:リストに要素を追加したり、削除したりすることができます。例えば、新しい果物をリストに追加することができます。
fruits = ['apple', 'orange', 'banana']
fruits.append('kiwi')
print(fruits) # 出力結果: ['apple', 'orange', 'banana', 'kiwi']
  • データの結合:複数のリストを結合することができます。例えば、果物のリストと野菜のリストを結合することができます。
fruits = ['apple', 'orange', 'banana']
vegetables = ['carrot', 'spinach', 'potato']
groceries = fruits + vegetables
print(groceries) # 出力結果: ['apple', 'orange', 'banana', 'carrot', 'spinach', 'potato']
これらはリストの具体的な利用方法の一部であり、リストは非常に柔軟で多目的なデータ構造です。

12.辞書型

dictionary={‘キー1’ : ‘値1′ , ’キー2’ : ‘値2’} このように辞書型は記載します。 {}カーリーブラケットを使用します。
car={“brand”:“Toyota”,“model”:“Prius”,“year”:2015}
※辞書を作成します。
print(car[‘brand’])
※取り出せなかった場合エラー
print(car.get(‘brand’))
※取り出せなかったNone →変数キー、変数.キーとすることで値を取り出すことができます。 上の例では、Toyota
print(car.get(‘Model’,‘Doesnot
※carにModelというキーが存在しない場合、Doesnotexistを返します
car.keys()
※carのキー’brand’,‘model’,‘が返される
car.values()
※carの値’Toyota’,‘Prius’,2015が返される
car.items()
※carのキーとバリューがそれぞれが返される

for文

for key,valueincar.items():
  print("key={},value={}".format(key,value))
※key,valueをそれぞれ取り出し、ループ内で回すことができる

if文については後を参照

if key in car:
  print(car[‘key’])

辞書型(ディクショナリー)のメソッド

car={"brand":"Toyota","model":"Prius","year":2015}
car.update({'country':japan','prefecture':'Aichi'})
※辞書carにcountryとprefectureを値と共に追加します。
car['city']='Toyota-shi'
value=car.popitem()
※最後に追加した要素を削除します。この場合、city)が削除されます。 ※valueに(‘city’,’Toyotashiとタプルにして返されます。
value=car.pop('prefecture')
※指定したキーを削除します。また、valueにAichiが入ります。
car.clear()
※carに入った値が全て削除されます。
delcar
※辞書carが削除されます。

辞書型のkey value updateメソッド

Pythonの辞書型は、キーと値のペアを保存するためのデータ構造で、キーはユニークである必要があります。辞書型の要素の追加、更新、削除には、以下のような方法があります。
  • 要素の追加
辞書型に新しい要素を追加するには、新しいキーと値のペアを辞書型に追加するだけです。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
my_dict["kiwi"] = 4
print(my_dict) # 出力結果: {"apple": 1, "banana": 2, "orange": 3, "kiwi": 4}
  • 要素の更新
辞書型の要素を更新するには、辞書型のキーを指定して、新しい値を代入するだけです。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
my_dict["orange"] = 4
print(my_dict) # 出力結果: {"apple": 1, "banana": 2, "orange": 4}
  • 複数の要素の更新
辞書型の複数の要素を更新するには、update()メソッドを使用します。このメソッドは、辞書型またはキーと値のペアを引数として受け取り、それらを辞書型に追加します。既存のキーがある場合は、新しい値で上書きされます。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
new_dict = {"kiwi": 4, "orange": 5}
my_dict.update(new_dict)
print(my_dict) # 出力結果: {"apple": 1, "banana": 2, "orange": 5, "kiwi": 4}
  • 要素の削除
辞書型から要素を削除するには、del文を使用して、キーを指定して要素を削除するだけです。
my_dict = {"apple": 1, "banana": 2, "orange": 3}
del my_dict["banana"]
print(my_dict) # 出力結果: {"apple": 1, "orange": 3}
辞書型は、キーと値のペアを保存するための強力なデータ構造であり、上記の方法を使用して、要素の追加、更新、削除を行うことができます。

辞書のコピーに注意

Pythonの辞書にも、リスト同様に参照による代入が行われる場合があります。つまり、辞書変数を新しい変数に代入した場合、元の辞書と新しい変数が同じオブジェクトを参照するようになります。そのため、元の辞書に変更を加えると、新しい変数にも変更が反映されます。 例えば、以下のコードを考えてみましょう。
original_dict = {'a': 1, 'b': 2, 'c': 3}
new_dict = original_dict
original_dict['d'] = 4
print(new_dict)
このコードを実行すると、出力結果は{'a': 1, 'b': 2, 'c': 3, 'd': 4}になります。つまり、original_dictnew_dictは同じオブジェクトを参照しているため、original_dictに要素を追加すると、new_dictにも変更が反映されていることがわかります。 このような問題を回避するためには、辞書のcopy()メソッドを使用して、新しい辞書を作成することができます。copy()メソッドを使用すると、元の辞書とは別のオブジェクトを参照する新しい辞書が作成されます。 例えば、以下のコードを考えてみましょう。
original_dict = {'a': 1, 'b': 2, 'c': 3}
new_dict = original_dict.copy()
original_dict['d'] = 4
print(new_dict)
Pythonの辞書にも、リスト同様に参照による代入が行われる場合があります。つまり、辞書変数を新しい変数に代入した場合、元の辞書と新しい変数が同じオブジェクトを参照するようになります。そのため、元の辞書に変更を加えると、新しい変数にも変更が反映されます。 例えば、以下のコードを考えてみましょう。
new_dict = copy.deepcopy(original_dict)
original_dict['a'].append(4)
print(new_dict)

辞書とリストの違い

Pythonのリストと辞書は、どちらも複数の要素を格納できるデータ型ですが、いくつかの違いがあります。
  • インデックスの使い方
リストは要素の順序があり、0から始まる整数のインデックスを使用して、特定の要素を取得することができます。一方、辞書はキーと呼ばれる値を使用して、要素にアクセスします。
  • 要素の重複の扱い
リストは同じ値を複数回含むことができますが、辞書のキーは一意でなければなりません。つまり、辞書には同じキーを持つ複数の要素を格納することはできません。
  • ミュータブルオブジェクトとしての扱い
リストはミュータブル(変更可能)オブジェクトであり、リスト内の要素を変更したり、要素を追加したり、削除したりすることができます。一方、辞書もミュータブルオブジェクトであり、辞書の要素を追加、削除、更新することができます。ただし、辞書のキーは変更することができないため、キーを変更するには、一度削除してから新しいキーで要素を再追加する必要があります。
  • 要素の順序
リストは順序があり、要素が追加された順序で格納されます。一方、辞書の要素には順序がありません。そのため、辞書の要素を取得するたびに、要素の順序が変わる可能性があります。 以上のように、リストと辞書にはいくつかの違いがあります。適切に使用することで、それぞれのデータ型の特性を最大限に活用できます。

13.タプル

タプルは値を複数入れるものです。リストに似ていますが、最も重要なポイントは、「値を変更、追加できない」点です。
fruit=(‘apple’,‘banana’,‘orange’,‘lemon’)
※タプルの宣言
print(fruit[0])
※タプルの一番目の要素にアクセスします
fruit[0]=‘pain’
※TypeErrorタプルは値を変更することができない
fruit=fruit + (‘grape’,)
※タプルに要素を追加するには、+ でタプルの形にします。

タプルのメソッドcount,index

リストをタプルに変換する
list_a=['banana','apple','grape]
fruit=tuple(list_a)
※tuple()とすると、リストをタプルに変換することができる リストと違う特徴 {(‘A’,‘B’):‘value’} ➀配列よりもタプルの方が、アクセスするスピードが速い ➁ハッシュ化して辞書型のキーとして、利用できる ➂値が変更されないことを保障できる (MONTH=(‘Jan’,‘Feb’,….)など)

タプルの結合

タプルの結合には、演算子 + を使用します。タプル a とタプル b を結合する場合は、次のように書きます。
a = (1, 2, 3)
b = (4, 5, 6)
c = a + b
print(c) # (1, 2, 3, 4, 5, 6)
この例では、2つのタプル ab を結合して、新しいタプル c を作成しました。c の要素は、まずタプル a の要素が先に来て、続いてタプル b の要素が並びます。 注意点としては、タプル自体は不変(immutable)なので、結合を行った結果、新しいタプルが生成されます。元のタプル自体が変更されるわけではありません

タプルのアンパッキング

タプルのアンパッキングとは、タプルの要素を個別の変数に分解することです。タプルを使って関数の戻り値を複数返したり、1つのタプルで複数の値をグループ化することができますが、その後、個々の要素にアクセスする必要がある場合があります。このような場合に、タプルのアンパッキングを利用します。 たとえば、次のようなタプルがあるとします。
a = (1, 2, 3)
このタプルの要素を個別の変数に代入するには、以下のように書きます。
x, y, z = a
print(x) # 1
print(y) # 2
print(z) # 3
この例では、タプル a の要素をそれぞれ変数 xyz に代入しています。変数に代入される値は、タプルの要素の順序に従います。 また、タプルのアンパッキングでは、不要な要素を _ で省略することができます。たとえば、次のように書くことができます。
x, _, z = a
print(x) # 1
print(z) # 3
この場合、2番目の要素が省略され、代入される変数は xz のみです。

タプルの使い方

タプルは、複数の要素を1つのオブジェクトにまとめることができるデータ型です。以下に、タプルの使い方についていくつか例を挙げます。
  • 複数の値を1つの変数にまとめる
タプルを使うことで、複数の値を1つの変数にまとめることができます。たとえば、次のように書くことができます。
point = (3, 5)
このように書くことで、2つの値を1つのオブジェクトにまとめています。
  • 複数の値を関数の戻り値として返す
関数の戻り値として、複数の値をタプルでまとめて返すことができます。たとえば、次のような関数があるとします。
def get_name_and_age():
name = "Alice"
age = 20
return name, age
この関数は、2つの値 nameage を返していますが、タプルでまとめて返しています。この関数を呼び出すと、次のように書くことができます。
result = get_name_and_age()
print(result) # ('Alice', 20)
戻り値を受け取る変数には、タプルが代入されます。
  • 複数の値を一度に代入する
タプルを使うことで、複数の変数に一度に値を代入することができます。たとえば、次のように書くことができます。
x, y = (1, 2)
このように書くことで、タプル (1, 2) の要素が、変数 xy にそれぞれ代入されます。これは、次のように書いた場合と同じです。
t = (1, 2)
x = t[0]
y = t[1]
  • イミュータブルなリストとして使用する
タプルはイミュータブルなので、一度作成したタプルは変更できません。そのため、タプルはイミュータブルなリストとして使用することもできます。たとえば、次のように書くことができます。
colors = ("red", "green", "blue")
このように書くことで、リストと同様に、複数の要素をまとめたオブジェクトを作成することができます。

14.セット

セットは、リスト、タプルと似たように複数の値を入れる入れ物です 特徴 ➀同じ値を持つことがない(ユニーク) ➁順序が保持されていない(挿入された順番通りに取り出すことができない) ➂集合処理を高速で行うことができる
set_a=a’,‘b’,‘c’,‘d’,‘a‘}
※setを作成、aが2つ入っていますが、ユニークの特徴から一つしか入りません
print(set_a)
※set_aには、{‘a’,’d’,’c’,’d’} の4つの要素があります。
print('e' in set_a)
※set_aには、’e’が入っていないため、Falseが返ります。
print('e' not in set_a)
※set_aには、’e’が入っていないため、Trueが返ります。
print(len(set_a))
※set_aの数を返します。この場合4が返ります。
set_a.add('e’)
※set_aに‘e’を追加します。
set_a.remove('e’)
※set_aから‘e’を削除します。‘e’がない場合は、KeyErrorを返します。
set_a.discard(‘e’)
※set_aから‘e’を削除します。‘e’がない場合でも、エラーは発生しません。
set_a.pop()
※set_aから任意の要素を取り出し削除します。
set_a.clear()
※set_aから全ての要素を削除します。

セットのメソッド

union(|) ※ユニオン、和集合を返します。 intersection(&) ※集合の共通する要素、積集合を返します。 difference(-) ※片方の集合にあり、片方の集合にない要素、差集合を返します symmetric_difference ※どちらか一方にだけある要素の集合を返します
s={'a','b','c','d'}
t={'c','d','e','f'}
s | t
※sとtのユニオンの集合、a’,’b’,’c’,’d’,’e’,’fを返します
s.union(t)
※sとtのユニオンの集合、a’,’b’,’c’,’d’,’e’,’fを返します
s & t
※sとtの積集合、c’,’dを返します
s.intersection(t)
※sとtの積集合、c’,’dを返します
s - t
※s – t,s.difference(t)では、sとtの差集合、a’,’bを返します
s.difference(t)
※s – t,s.difference(t)では、sとtの差集合、a’,’bを返します
s^t
※s^t,s.symmetric_difference(では、sとtの片方に含まれるa’,’b’,’e’,’fを返します
s.symmetric_difference(t)
※s^t,s.symmetric_difference(では、sとtの片方に含まれるa’,’b’,’e’,’fを返します
s | =t
※s=sとtのユニオン、つまりsにtの値を追加します。
s={'apple','lemon'}
t={'apple','banana','lemon','grape’}
u={‘cherry’}
print(s.issubset(t))
※sの要素は総てtに含まれるため、sはtのサブセットでTrueを返します
print(t.issuperset(s))
※sの要素は総てtに含まれるため、tはsのスーパーセットでTrueを返します
print(t.isdisjoint(u))
※tの要素とuの要素は一つも被っていないため、Trueを返します。

15.制御文(if文)

if文は、渡された値の真偽を評価し、真の場合は実行され、偽の場合は実行されない式です
if評価式: 式 の形で記載されます。
pythonでは、以下の値がFalseとして認識されます Falseとして認識されるもの:None,False,0,”,空リスト,空辞書,空タプル,空セット
[厳密には以下を満たすもの] ■bool()が定義されているクラスで、Falseが返されるもの 変数.bool()= bool(変数)
if文を複数重ねる場合は、elif や elseを利用します
等価性:<,<=,>,>=,!=,==,not if 評価式1: 式 #評価式1が正の場合実行 elif 評価式2: 式 #評価式1が偽で、評価式2が正の場合実行 else: 式 #評価式1も評価式2も偽の場合実行

and or not

複数の条件式を評価する場合、and orを利用します。 また、条件式の否定としてnotが利用されます ➀条件式1 and 条件式2とすると、両方が正しい場合に実行されます。 ➁条件式1 or 条件式2とすると、どちらか一つが正しい場合実行されます。 ➂not 条件式とすると、条件式が誤っている場合に実行されます。

all, any 関数

if文でallとanyを利用すると処理の記載が楽になります。
all : allはオブジェクトの中が全てTrueの場合に処理をする if all(反復可能オブジェクト): #リスト、タプル等、forinでループできる変数を入れます。 処理
any : anyはオブジェクトの一部がTrueの場合に処理をします。 if any(反復可能オブジェクト):

16.ループ文(while)

ループでは、複数回同じコードを実行します。pythonではforやwhileを用いてループを実現します。
 for制御式 式 #ループ内の式が実行される

range関数(for i in range()として利用)

range(5):
※01234を返す
range(2,6):
※2345を返す
range(0,10,3):
※0,3,6,9
for i in range(5):
print(i)
#01234を表示

リストのループ

sample=[‘A’,‘B’,‘C’]
for s in sample:
  print(s)
#ABCを表示 enumerate関数: ※配列の中の値とインデックスを同時に取得する
sample=['A','B','C']
for index , value in enumerate(sample):
   print(index)
#012を表示
print(value)
#ABCを表示 zip関数: ※二つの配列の中の値を同時に取得する
 for a,b in zip(list1,list2):
while: ※whileの中の式がTrueであるうちは処理を実行する
count=0
 while count < 10:
  print(count)
  count += 1

ループ内でのcontinue,break,elseの使い方

continue: ※ループ内にcontinueがあると処理が一度飛ばされます break: ※breakが実行されるとループの外に処理が出ます
for i in range(8):
  if i==5:
  continue
 #iが5の時は、処理が飛ばされますi=6の場合の次の処理に移ります。breakの場合は処理が終了してループの外に出ます
 print(i)
else: ※ループの外に出た際に実行されます(breakでループを抜けた場合には実行されません)
for i in range(10):
 print(i)
else:
 print('ループ終了')
 #ループ終了後実行されます
※セイウチ演算子 := イコールの前に「:」コロンをつけた演算子 セイウチ演算子とは変数の代入と変数の使用を同時に実行できるという特徴を持っています
if(n:=10)>5:
#nに10を代入するのとn>5の比較を同時に実行している
  print( 'nは5より大きい')
一番よく使うパターンは、while文で使用することが多いです。
n=0
while(n:= n + 1) < 10:
 print(n)
n=1
while n < 10:
 print(n)
  n += 1

例外処理(tryとexcept))

例外処理: ※実行時に発生するエラー(実行時エラー)を制御して処理を行う try: 処理 except エラー名 例外発生時の処理
例文)
try:
 a = 10 / 0
except ZeroDivisionError:
 print('例外処理')
FileNotFoundError: ※プログラムで指定されたファイルが見つからないエラー IndexError:  ※配列などで指定したインデックスに値が存在しないエラー TypeError: ※型に関するエラー ZeroDivisoinError: ※0で割ろうとしたことによるエラー Exception: ※すべての例外

例外処理(try, except,else,finally))

例外処理を複数つないだもの
fruits = ['apple','orange','pain']
count = 12
try:
 fruit = fruits[2]
 print(fruit + count)
except IndexError as e:
 print('配列に存在しないインデックスを指定した場合')
except TypeError:
 print('文字列型+数値型等、型の誤ったものと計算した場合などに実行')
except Exception:
 print('全ての例外をキャッチ')
else: 処理 finally: 処理 else,finally:例外処理後に実行される
else:  ※例外が発生しなかった場合に実行され、例外が発生した場合には実行されない finally:  ※例外が発生した場合にも、発生しなかった場合にも実行される

例外を返す(raise)

def devide(a,b):
if(b==0):
 raise ZeroDivisionError('bを0に設定しないでください')
 #raiseをすると呼び出し元にメッセージと共に、例外を返すことができます。
else:
 returna/b
try:
 result = devide(10,0)
 #関数を呼び出した結果、ZeroDivisionErrorが返ってきます。
except ZeroDivisionError as e:
 print('{}:{}'.format(type(e),e))
 #ZeroDivisionErrorが発生したため、:bを0に設定しないでくださいと表示

17.関数

関数とは、複数の処理を1つにまとめたプログラムの部品のことで、プログラムの再利用性を高めるために用いられます。 pythonの関数は以下のように定義します。
def 関数名(): 処理
def print_hello():
  #関数の定義
 print("Hello")
  #関数の処理
 print_hello()
  #関数の呼び出し、Helloが表示されます。
関数に引数を与えるには def 関数名(arg1,arg2):
def num_max(a,b):
 if a>b:
  return a
 else:
  return b
num = num_max(10,20)
 #大きい20が返ってきます
num = num_max(b=20,a=10)
 #引数を直接指定することもできます
ここで、def キーワードで関数を定義します。関数名は、任意の名前をつけることができます。引数は、関数に渡す値のことで、必要な分だけ定義することができます。引数が不要な場合は、空のカッコを書きます。 関数内で実行する処理は、関数名の下にインデントを付けて書きます。処理が終了した後、必要であれば return 文を用いて戻り値を返します。 以下に、具体的な例を挙げます。
def add_numbers(x, y):
z = x + y
return z
result = add_numbers(3, 5)
print(result) # 8
この例では、add_numbers 関数が定義されています。引数として xy を取り、それらを足した結果を z に代入し、return 文で z を返しています。 add_numbers 関数を呼び出す際に、引数として 35 を渡しています。この結果として、関数の処理である x + y の結果である 8result 変数に代入され、print 文で出力されます。

引数

引数とは、関数に渡す値のことを指します。引数を用いることで、関数が必要とするデータを関数の外から指定することができます。引数が指定されなかった場合、関数内で使用するデータを定義することができます。 Pythonでは、引数は以下のように定義します。
def 関数名(引数1, 引数2, ...):
処理1
処理2
...
return 戻り値
引数は、() の中に , 区切りで複数の引数を定義することができます。以下に、引数を用いた具体例を示します。
def greet(name):
print("Hello, " + name + "!")

greet("Alice") # Hello, Alice!
greet("Bob") # Hello, Bob!
この例では、greet 関数が定義されています。引数として name を取り、"Hello, " + name + "!" のように文字列を結合して出力しています。 関数を呼び出す際に、引数として "Alice""Bob" を渡しています。この結果、greet 関数はそれぞれ "Hello, Alice!""Hello, Bob!" を出力します。 また、引数にはデフォルト値を設定することもできます。デフォルト値が設定されている引数は、引数が指定されなかった場合にその値が用いられます。
def greet(name="World"):
print("Hello, " + name + "!")

greet() # Hello, World!
greet("Alice") # Hello, Alice!
greet("Bob") # Hello, Bob!
この例では、greet 関数が再度定義されています。引数として name を取り、デフォルト値を "World" に設定しています。関数を呼び出す際に、引数が指定されなかった場合に "World" が用いられます。この結果、greet()"Hello, World!" を出力します。

位置引数

位置引数とは、引数を関数の呼び出しにおいて、引数を指定する順序によって指定する引数のことを指します。位置引数を使う場合、引数を関数に渡す順番に意識する必要があります。 以下に、位置引数を使った関数の例を示します。
def add(x, y):
return x + y
result = add(3, 5)
print(result) # 8
この例では、add 関数が定義されています。引数として xy を取り、それらを加算して返します。この関数を呼び出す際に、add(3, 5) のように引数を位置引数で指定しています。 この例では、x3y5 が指定されているため、add(3, 5) の戻り値は 8 になります。 位置引数を使う場合、引数を指定する順序によって意味が変わることに注意が必要です。例えば、引数を取る関数 subtract を以下のように定義したとします。
def subtract(x, y):
return x - y
この場合、subtract(3, 5)-2 を返しますが、subtract(5, 3)2 を返します。つまり、位置引数を使う場合は、引数の意味を理解して呼び出す必要があります。

キーワード引数

キーワード引数とは、引数を指定する際に、引数の名前(キーワード)と値を指定する方法のことを指します。キーワード引数を使うことで、引数の順序を気にすることなく、任意の引数を指定することができます。 以下に、キーワード引数を使った関数の例を示します。
def greet(name, message):
print(f"{name}, {message}")

greet(name="Alice", message="Hello") # Alice, Hello
greet(message="Good morning", name="Bob") # Bob, Good morning
この例では、greet 関数が定義されています。引数として namemessage を取り、指定された名前とメッセージを出力します。この関数を呼び出す際に、name="Alice"message="Hello" のようにキーワード引数で指定しています。 この例では、引数を指定する順番を気にする必要がないため、greet(name="Alice", message="Hello")greet(message="Good morning", name="Bob") のように、引数の順序を入れ替えて呼び出すことができます。 また、キーワード引数を使う場合、必須の引数よりも後ろに指定することができます。例えば、以下のような関数を考えてみましょう。
def repeat(message, times=2):
print(message * times)
この関数は、message で指定された文字列を、デフォルトで2回繰り返して出力するものです。times は任意の引数であり、指定されなかった場合はデフォルト値の2が使われます。 この関数を呼び出す際に、repeat("Hello") とすると、"HelloHello" が出力されます。また、repeat("Hi", times=3) とすると、"HiHiHi" が出力されます。ここで、times はキーワード引数として指定されていますが、引数リストの最後に指定されているため、位置引数としても指定することができます。つまり、repeat("Hi", 3) とすることもできます。

デフォルト引数

デフォルト引数とは、関数の引数に初期値を設定することで、その引数が指定されなかった場合に、初期値が使われるようにする機能です。 以下に、デフォルト引数を使った関数の例を示します。
def greet(name, message="Hello"):
print(f"{name}, {message}")

greet("Alice") # Alice, Hello
greet("Bob", "Hi") # Bob, Hi
この例では、greet 関数が定義されています。引数として namemessage を取り、指定された名前とメッセージを出力します。message にはデフォルト引数 "Hello" が設定されています。 この関数を呼び出す際に、greet("Alice") とすると、"Alice, Hello" が出力されます。ここで、message が指定されなかったため、デフォルト引数の "Hello" が使われました。また、greet("Bob", "Hi") とすると、"Bob, Hi" が出力されます。 また、greet("Bob", "Hi") とすると、"Bob, Hi" が出力されます。ここでは、message"Hi" が指定されているため、デフォルト引数は使われませんでした。 デフォルト引数を使うことで、関数の呼び出しをより簡潔にすることができます。ただし、デフォルト引数を使いすぎると、コードが読みにくくなったり、予期しないバグが発生する可能性があるため、注意が必要です。

位置引数のタプル化

位置引数をタプル化することで、可変長の引数を受け取ることができます。タプル化するには、関数の引数にアスタリスク * をつけます。 以下に、位置引数をタプル化する例を示します。
def multiply(*numbers):
result = 1
for n in numbers:
result *= n
return result

print(multiply(2, 3, 4)) # 24
この例では、multiply 関数が定義されています。引数として可変長の位置引数 *numbers を取り、与えられた数値をすべてかけた結果を返します。 この関数を呼び出す際に、multiply(2, 3, 4) とすると、24 が返されます。ここで、引数に与えられた 234 はタプルにまとめられて、numbers に渡されました。 位置引数をタプル化することで、可変長の引数を受け取ることができるため、非常に便利です。例えば、任意の数の引数を受け取り、それらを足し合わせる関数を実装する場合などに活用することができます。

キーワード引数を辞書化してまとめる

複数のキーワード引数を辞書にまとめるには、関数の引数にアスタリスク2つ ** をつけます。このアスタリスク2つによって、関数に渡されたキーワード引数が辞書としてまとめられ、関数内で利用することができます。 以下に例を示します。
def example_function(**kwargs):
print(kwargs)

example_function(a=1, b=2, c=3)
この例では、example_function 関数が定義されています。引数として可変長のキーワード引数 **kwargs を取り、与えられた引数を辞書として表示します。 この関数を呼び出す際に、example_function(a=1, b=2, c=3) とすると、{'a': 1, 'b': 2, 'c': 3} という辞書が表示されます。ここで、引数に与えられた a=1b=2c=3 は、アスタリスク2つによって辞書にまとめられ、kwargs に渡されました。 キーワード引数を辞書化することで、可変長の引数を扱う際に非常に便利です。例えば、Webアプリケーションでリクエストパラメータを受け取り、それを辞書として扱う場合などに活用することができます。

関数のデフォルト値の指定

deffunction(arg1,arg2=100): 可変長引数:場合に応じてその都度、引数の長さが変わるもの 可変長のタプル:*arg1のように「*」を1つつける 可変長の辞書 :**arg2のように「**」を2つつける
defspam(arg1,*arg2):
 print("arg1={},arg2={}".format(arg1,arg2))
  #arg1とarg2を表示します。
 print(type(arg2))
  #<class'が表示され、arg2がタプルであることがわかります。
spam(3,4,5,5)
 #1つ目の引数はarg1,残りはarg2に4,5,5がタプルとして挿入され、"arg1=3,arg2=(4,5,が表示されます)
defspam(arg1,**arg2):
 print("arg1={},arg2={}".format(arg1,arg2))
  #arg1とarg2を表示します。
 print(type(arg2))
  #<classdictが表示され、arg2が辞書型であることがわかります。
spam(3,arg3=5,arg4=6)
  #"arg1=3,arg2={'arg3':5,'arg4':が表示されます。
複数の返り値 return a,b

docstringってなに

docstring とは、Pythonの関数やモジュール、クラスなどのドキュメンテーション文字列のことです。docstring は、関数やクラスの定義の直後に三重引用符で囲まれた文字列で表現され、その関数やクラスが何をするもので、引数や返り値が何であるか、使用例などを記述することができます。 以下は、関数の docstring の例です。
def add_numbers(a, b):
"""
2つの数値を足し合わせる関数

Parameters
----------
a : int
足される数値
b : int
足す数値

Returns
-------
int
2つの数値を足し合わせた結果

Examples
--------
>>> add_numbers(1, 2)
3
>>> add_numbers(10, -5)
5
"""
return a + b
docstring は、Pythonの公式ドキュメントやIDEのヘルプ機能などで利用され、関数やクラスの使い方や挙動を理解するのに役立ちます。docstring はプログラムの可読性を高め、コードの保守性を向上させるためにも重要な役割を果たします。

18.グローバル変数

変数には利用できる領域(名前空間)があります。 別の名前空間の変数を更新することができない場合があります。 例えば、以下のように関数の中から関数の外の変数を書き換えることができません。

globalを使わない場合

def printAnimal():
 animal='cat'
  #ここで宣言した変数animalは関数の外で宣言したanimal(‘dog’)とは異なる変数として扱われ、この関数内のみで有効な変数です。
 print(animal)
  #print(animal)でcatが表示されます。
animal=‘dog’
  #関数外の変数
 print Animal()
 print(animal)
  #このprintでは、関数の外で有効なanimal('dog')が表示されます。上から実行した結果、cat,dogと表示されます。

globalを使った場合

変数の名前空間を広げることができます
def printAnimal():
 global animal
  #animalの前に、globalを付けて、global変数として宣言するとこのanimalは関数の外までスコープが広がります。
  #同名の変数が関数の外に存在する場合は、同じ参照先になります
 animal=‘cat’
  #このanimalはグローバル変数のため、関数の外のanimalの値も変更されます。
 print(animal)
  #print(animal)でcatが表示されます。
animal='dog'
 #関数外の変数
 printAnimal()
 print(animal)
 #関数実行時にanimalの値はcatに書き換えられているため、ここでcatと表示されます。

19.inner関数とノンローカル変数

pythonでは、関数の内部に関数を書くことができます。これをinner関数と言います。また、ノンローカル変数として宣言すると内側の関数から外側の関数で宣言された変数を書き換えられるようになります。

関数内関数

Pythonでは、関数の中に別の関数を定義することができます。これを「関数内関数 (nested function)」と呼びます。関数内関数を使うことで、複雑な処理を単純な関数に分割したり、外部から隠蔽したりすることができます。 以下は、関数内関数を使った例です。
def outer_func():
def inner_func():
print("inner function")

print("outer function")
inner_func()
outer_func という関数の中に、inner_func という関数が定義されています。inner_func は、outer_func 内部でのみ呼び出されるため、外部からは隠蔽されています。 outer_func を呼び出すと、以下のように出力されます。
outer function
inner function
outer_func の中で inner_func を定義して、inner_func を呼び出しています。このように、関数内関数を使うことで、コードの構造を階層化して、関数が行う処理を分割したり、処理の一部をカプセル化することができます。

Inner関数の書き方

def outer():
 def inner():
  #inner関数の処理
  #外の関数から、inner関数を呼び出す等を行う。

nonlocal変数を用いたinner関数の定義

defouter():
 outer_value = '外’
   #外側の変数outer_valueに外という文字が代入されます。
def inner():
  nonlocal outer_value
    #nonlocalと宣言することで、外側の関数の変数であるouter_valueを変更できるようになります。
  inner_value = '内’
    #内側の関数の変数のinner_valueに内という文字が代入されます。
  outer_value = '内側で変更’
    #outer_valueはnonlocalとして宣言しており、このouter_valueを用いて外側の関数の変数outer_valueに文字列内側で変更が代入されます。
  inner()
    #inner関数を実行します。
  return outer_value
    #returnouter_valueこの場合、文字列内側で変更が返されます
value=outer()
 #関数outerを呼び出して、その返り値内側で変更をvalueに代入します。
print(value)
 #value('内側で変更')を表示します。

inner関数の用途

➀外の関数の外からアクセスできないような関数を作成する ➁関数の中で同じ処理が何度も発生する場合に、一つにまとめる ➂デコレータ関数(後述)を作成する

変数の束縛

変数の束縛とは、ある変数に値を代入することによって、その変数に対する参照が作られることを指します。 例えば、以下のコードでは、x10 という値が代入され、x に対する参照が作られています。
x = 10
また、以下のように関数内で変数を定義した場合には、その変数はその関数内でのみ有効であり、関数外での参照はできません。
def my_func():
y = 20
print(y)

my_func() # 20
print(y) # NameError: name 'y' is not defined
このように、変数の束縛によって、ある変数に対する参照が作られ、その変数が有効なスコープが定義されます。変数の束縛は、プログラム内でデータを管理するうえで非常に重要な概念です。

20.ジェネレータ関数

ジェネレータ関数は以下のようにyieldを用います。 def func() yield 〇〇 ➀ジェネレータ関数を宣言して実行すると、yieldの部分で処理がストップし、yieldの〇〇に記載された値(配列、辞書等オブジェクト)が呼び出され元に返されます。 ➁その後、再度ジェネレータ関数を呼び出すと、yieldの部分から処理がスタートし、yieldの部分でストップします。 ➂プログラムが終了するまで、何度もジェネレータ関数を呼び出すことができます。(その度に、yieldからスタート、yieldで終了します)
def generator(max):
  #ジェネレータ関数の宣言
 print("generatercreated")
 n=0
 while n < max:
  yield n
   #呼び出し元にnを返し処理がストップ
  print("yield called")
  n+=1
gen=generator(10)
 #ジェネレータの作成、この時点では処理は走りません。
a = next(gen)
 #generatorを呼び出します。generator createdと表示されて、
  yieldの部分でとまり、yeild nのn(この場合0)が値として返ってきます。
print(a)
 #0が表示されます。

ジェネレータ関数のメソッド

send(): ※yieldで停止している箇所に値を送ります。 throw():  ※指定した例外が発生して処理が終了させます。 close():  ※ジェネレータを正常終了させます。
gen.send(10)
 #yieldの部分に、sendを創出し、yieldの部分の値が10となって処理が進む。
for v in gen:
print(v)
  if v > 2:
  gen.throw (ValueError("InvalidValue"))
 #ValueErrorを送出して処理を終了します。
gen.close()
 #close()をするとジェネレータ処理が強制終了して、以後、generatorは StopIterationと表示されて利用できなくなります。

サブジェネレータ

pythonでは、ジェネレータからジェネレータを呼び出すことができます。 呼び出した時の呼び出し元がジェネレータ、呼び出し先がサブジェネレータと言います。yield fromと記述して、ジェネレータからサブジェネレータを呼び出します。 ➀呼び出し先のサブジェネレータからさらに別のジェネレータを呼び出すこともできます ➁サブジェネレータにreturnを追加することで、呼び出し元ジェネレータに値を返すことができます。 ➂サブジェネレータでyieldを実行すると一番最初の呼び出し元に値を返します。

ジェネレータはどういう場面で使用するのか?

ジェネレータはメモリ使用量を削減するために使われます。 例えば以下の場合、実行される結果は同じですが利用されるメモリ使用量が違います。
list_a == [0,1,2,3,4,5,6,7,8,9]
for i in list_a:
 print(i)
def num(max):
  #generatorを定義
 i = 0
  while i < max
 yield i
  i += 1
for x in num(10):
  #generatorを呼び出し
 print(x)
  #0から9まで表示
generatorが一番多く出番となるのは、何らかのDBから大量のデータを抽出するときです。DBから対象に取得する場合、大変メモリ消費します。 この場合、generatorを使うと使用するメモリをほぼ0にすることができます (ただし、generatorの方が処理は遅いといい欠点があります)

21.高階関数

pythonでは、関数もオブジェクトの一つにすぎないため変数として扱うこともできます。また、関数を他の関数の引数として渡したり、返り値として扱うこともできます。関数を引数にしたり、返り値にする関数を高階関数と言います。 ➀関数を変数のように扱う
def print_hello():
 print("hello")
var = print_hello
 #変数varに関数をオブジェクトとして代入します。
var()
 #このように変数に()を付けると関数が呼び出され、helloが表示されます。
var2=['apple','orange',print_hello]
 #配列の3番目(インデックスだと2)にprint_helloをオブジェクトとして、
  入れておきます。
var2[2]()
 #配列のインデックス2のprint_helloを呼び出すと、helloと表示されます。
➁引数、返り値に関数を利用するやり方
def print_world(msg):
 print("{}world".format(msg))
def print_konnichiwa():
 print("こんにちは")
def print_hellofunc):
 func("hello")
  #引数funcを関数のように利用します。
 return print_konnichiwa
  #関数print_konnichiwaを返します。
var = print_world
  #変数varに関数print_worldをオブジェクトとして代入します。
a = print_hello(var)
  #関数print_helloの引数をprint_worldにして、呼び出します。
  #func("hello")がprint_world("hello")になり、関数で"hello world"が表示されます。
  #また、aには、関数print_konnichiwaが格納されます。
a()
  #関数print_konnichiwaが実行され、"こんにちは"と表示されます。

22.lambda式

#ifを1行で表して代入する
x = 0 if y > 10 else 1
pythonで1行で終わるような関数を用いる場合には、lambda式という無名関数を用いることがよくあります。lambda式は以下のように書きます。 lambda引数: ※返り値
lambda_a = lambdax: x * x
 #aに無名関数のオブジェクトを代入します。
def func(x):
 return x * x
res = lambda_a(12)
 #引数を12として、無名関数を実行します。戻り値は、x * xの144が返ってきます。
print(res)
 #144が表示されます。
lambda_b = lambda x,y,z = 5: x * y * z
 #lambda式で、複数の引数を取り、一部の引数にデフォルト値を入れて定義します。
print(lambda_b(3,4))
 #x=3,y=4として関数が実行され、60が表示されます。
➀条件式を用いたlambda
c = lambda x , y: y if x < y else x
 #x<yの場合yを返し、それ以外はxを返す

23.再帰

再帰とは、関数から自分の関数を呼び出すことです。
def sample(a):
 if a < 0:
  return
 else:
  print(a)
  sample(a-1)
※フィボナッチ数列 1と2のとき:1 3以上のとき:直前の二つの数値の和1,1,2,3,5,8,13,…とする数列
def fib(n):
 if n < 3:
  return 1
 else:
  return fib(n-1) + fib(n-2)

24.リスト内包表記

ループと条件を使って、1行でリストを作成する方法(リスト内包表記) 変数名 = [式 for変数inリスト(if条件式)]
new_list = []
for x in list_a:
 new_list.append(x)
new_list = [x for x in list_a]
new_list = []
for x in list_a:
 if type(x) == int:
  new_list.append(x)
new_list = [x * x for x in list_a if type(x) == int]
ジェネレータを返すには、以下のように宣言します
x=(リスト内包表記)
value = [x for x in range(10000)]
 #リスト
tup = tuple(x for x in range(10000)
 #タプル
gen = (x for x in range(10000))
 #ジェネレータ
set = {x for x in range(10000)}
 #セット

25.デコレータ関数

Pythonの場合、@関数名と関数の前につけることで、デコレータ関数を利用します。 デコレータは、関数オブジェクトを引数にとって引数にとった関数に実行時に変更を加えます。デコレータは関数間で、ある処理を共通に利用したい場合によく用いられます。
def my_decorator (func):
   #デコレータ関数
 def wrapper(*args,**kwargs)
  print('*' * 100)
  func(*args, **kwargs)
  print('*' * 100)
  return 1
 return wrapper
@my_decorator
 #デコレータ関数の利用
def func_a(*args,**kwargs)
 pass
@my_decorator
 #デコレータ関数の利用
def func_b(*args,**kwargs)
 pass
func_a
def wrpper(args,kwargs)
  print('*' * 100)
  func_a(*args,**kwarg)
  print('*' * 100)
  return 1

デコレーター

デコレーターとは、Pythonにおける関数やクラスの機能を拡張するための機能です。デコレーターを用いることで、既存の関数やクラスの機能を改善したり、機能を追加したりすることができます。 デコレーターは、@ を使って定義されます。例えば、以下のようなデコレーターを定義することができます。
def my_decorator(func):
def wrapper():
print("before")
func()
print("after")
return wrapper

@my_decorator
def my_func():
print("my_func")

my_func() # "before", "my_func", "after" の順に表示される
この例では、my_decorator というデコレーターを定義し、my_func に対してそのデコレーターを適用しています。my_decorator は、引数に関数を取り、その関数を実行する前後に処理を追加することができます。具体的には、wrapper という関数を定義して、func() という部分で引数で渡された関数を実行しています。 デコレーターは、関数やクラスの実装を変更せずに機能を追加することができるため、Pythonでよく使用される機能の一つです。例えば、ログを出力するデコレーターや、入力値のチェックを行うデコレーターなどがあります。
以下に、別の具体的なデコレーターの例を示します。
def my_logger(func):
import logging
logging.basicConfig(filename='{}.log'.format(func.__name__), level=logging.INFO)
def wrapper(*args, **kwargs):
logging.info('Ran with args: {}, and kwargs: {}'.format(args, kwargs))
return func(*args, **kwargs)
return wrapper

@my_logger
def add(x, y):
return x + y

add(3, 5) # 8
この例では、my_logger というデコレーターを定義しています。このデコレーターは、引数に関数を取り、その関数が実行された際にログを出力する機能を追加します。具体的には、logging モジュールを使ってログを出力し、wrapper という関数でデコレーターの機能を実現しています。 add 関数に対して @my_logger デコレーターを適用しているため、add 関数が実行された際にはログが出力されます。add(3, 5) を実行すると、ログファイルが作成され、その中には Ran with args: (3, 5), and kwargs: {} というログが記録されます。 このように、デコレーターを使うことで、関数に機能を追加することができます。デコレーターは、例えばログの出力やエラー処理の追加など、様々な用途で使われます。

26.オブジェクト指向:クラスの定義

クラスの定義

クラスは、オブジェクト指向プログラミング(OOP)において、同じ特性や機能を持つオブジェクトの共通の設計図となるものです。クラスには属性(変数)とメソッド(関数)が含まれ、クラスをインスタンス化(オブジェクトを生成)することで、その属性やメソッドを持ったオブジェクトが生成されます。 クラスは、以下のように定義されます。
class クラス名:
def __init__(self, 引数1, 引数2, ...):
# インスタンス化された時に実行される初期化メソッド
self.属性1 = 引数1
self.属性2 = 引数2
...
def メソッド名(self, 引数1, 引数2, ...):
# メソッドの処理
...
クラス名の命名規則は、他のPythonの識別子と同様に、スネークケース(小文字とアンダースコアの組み合わせ)で記述します。クラスの定義は、classキーワードで始まり、コロン:で終わります。 クラスの定義の中で、__init__という特殊なメソッドがあります。これは、クラスがインスタンス化された際に実行される初期化メソッドです。このメソッドの引数には、インスタンス化された際に渡される値を指定します。また、selfという引数があり、これは、インスタンス自身を指します。selfを使って、属性を定義することができます。 クラスには、メソッドも定義することができます。メソッドは、関数と同様に、引数を受け取り、処理を実行します。ただし、メソッドの最初の引数には、selfが必要です。これは、メソッドが呼び出されたインスタンス自身を指すためです。 クラスをインスタンス化するには、以下のように書きます。
インスタンス変数 = クラス名(引数1, 引数2, ...)
このようにすることで、指定した引数を使って、クラスの__init__メソッドが実行され、インスタンスが生成されます。生成されたインスタンスには、クラスで定義された属性やメソッドが含まれます。 クラスを使うことで、オブジェクト指向プログラミングの概念を取り入れることができます。例えば、クラスを使用することで、異なる値を持つ複数のインスタンスを生成することができます。また、同じクラスから生成された複数のインスタンスは、同じ属性やメソッドを持つため、コードの再利用が容易になります。 例えば、以下は、Personクラスを定義し、このクラスからp1p2という2つのインスタンスを生成する例です。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
p1 = Person("Alice", 25)
p2 = Person("Bob", 30)
p1.say_hello() # Hello, my name is Alice and I am 25 years old.
p2.say_hello() # Hello, my name is Bob and I am 30 years old.
この例では、Personクラスには、nameageという2つの属性と、say_helloという1つのメソッドが定義されています。__init__メソッドは、nameageの2つの引数を受け取り、それらを使って、self.nameself.ageという2つの属性を定義しています。say_helloメソッドは、self.nameself.ageの値を使って、挨拶を出力する処理を実行しています。 p1p2という2つのインスタンスを生成するには、Personクラスからオブジェクトを生成し、それぞれに異なるnameageの値を渡します。生成されたインスタンスには、nameageという2つの属性と、say_helloという1つのメソッドが含まれます。p1p2それぞれのsay_helloメソッドを呼び出すことで、それぞれのインスタンスのnameageの値を使った挨拶が出力されます。 このように、クラスを使うことで、複数のインスタンスを生成し、それらを使って処理を実行することができます。また、クラスを使うことで、属性やメソッドの変更が容易になり、コードの再利用が可能になります。 クラスは、Pythonにおける重要な機能の一つであり、Pythonを使ったオブジェクト指向プログラミングの基盤となっています。クラスを理解することで、より高度なPythonプログラミングを行うことができるようになります。

クラスのメソッド

クラス変数、インスタンス変数

pythonには、クラスで定義する属性として、クラス変数とインスタンス変数があります。 ■クラス変数とは クラス変数は、クラス定義内で定義される変数で、すべてのインスタンスで共有されます。 クラス変数は、インスタンスメソッド内でも、クラスメソッド内でも参照できます。また、クラス変数の値を変更すると、そのクラスを基に生成されたすべてのインスタンスに影響します。 ■インスタンス変数とは インスタンス変数は、インスタンスごとに定義される変数で、異なるインスタンスで値が異なります。 インスタンス変数は、インスタンスメソッド内でselfを使って参照できます。インスタンス変数の値を変更すると、そのインスタンスのみに影響します。 以下に、クラス変数とインスタンス変数を使った例を示します。
class MyClass:
class_variable = "class_variable"
def __init__(self, instance_variable):
self.instance_variable = instance_variable
def print_variables(self):
print(f"class_variable: {MyClass.class_variable}")
print(f"instance_variable: {self.instance_variable}")
# クラス変数の参照
print(MyClass.class_variable) # class_variable
# クラス変数の値の変更
MyClass.class_variable = "new_class_variable"
# クラス変数の参照
print(MyClass.class_variable) # new_class_variable
# インスタンスの生成
obj1 = MyClass("instance_variable1")
obj2 = MyClass("instance_variable2")
#インスタンス変数の参照
obj1.print_variables() # class_variable: new_class_variable, instance_variable: instance_variable1
obj2.print_variables() # class_variable: new_class_variable, instance_variable: instance_variable2
# インスタンス変数の値の変更
obj1.instance_variable = "new_instance_variable1"
# インスタンス変数の参照
obj1.print_variables() # class_variable: new_class_variable, instance_variable: new_instance_variable1
obj2.print_variables() # class_variable: new_class_variable, instance_variable: instance_variable2
その後、MyClassクラスを元に、2つのインスタンスobj1obj2を生成します。obj1obj2instance_variableはそれぞれ"instance_variable1""instance_variable2"となっています。obj1obj2print_variablesメソッドを呼び出すことで、class_variableinstance_variableの値を出力しています。この結果、class_variableはクラス変数の値である"new_class_variable"になっており、instance_variableはそれぞれのインスタンス変数の値が表示されています。 次に、obj1instance_variableの値を"new_instance_variable1"に変更します。obj1print_variablesメソッドを呼び出すことで、instance_variableが新しい値に変更されていることが確認できます。しかし、obj2instance_variableは変更されていないことがわかります。 このように、クラス変数とインスタンス変数は、それぞれ異なる使い方があります。クラス変数は、すべてのインスタンスで共有される変数で、値を変更することで、そのクラスを基に生成されたすべてのインスタンスに影響を与えることができます。一方、インスタンス変数は、それぞれのインスタンスごとに異なる値を持ち、値を変更することで、そのインスタンスのみに影響を与えることができます。

オブジェクトの最後に実行される処理

コンストラクタ __init__

コンストラクタは、オブジェクトが生成されるときに自動的に呼び出される特殊なメソッドで、__init__という名前で定義されます。コンストラクタは、新しいオブジェクトが生成されたときに、そのオブジェクトが持つべき初期状態を設定するために使用されます。例えば、オブジェクトが持つインスタンス変数の初期値を設定する場合などがあります。 例えば、クラスのプロパティを初期化する際などに、コンストラクタを利用すると便利です。
class sample_class :
 def __init__ (self, msg):
  print("コンストラクタが呼び出されます ")
  self.msg = msg
   #プロパティ msg をコンストラクタの引数 msg で初期化します。
 def print_msg (self):
  print(self.msg)
   #プロパティ msg を表示します。
sample =sample_class ("Hello“, )
 #インスタンス作成時にコンストラクタ init が実行されます。
 #"コンストラクタが呼び出されましたと表示されたのち、プロパティ msg に ”Hello” が格納されます。
sample.print_msg()
 #インスタンス sample の print_msg メソッドを実行します。
 #プロパティ msg は "Hello”なので、 print(self.msg) で "Hello" と表示されます。

デストラクタ

デストラクタは、オブジェクトが不要になり、メモリから解放されるときに自動的に呼び出される特殊なメソッドで、__del__という名前で定義されます。デストラクタは、オブジェクトが持つリソースを解放するために使用されます。例えば、ファイルハンドルを閉じたり、データベース接続を解除したりする場合などがあります。
class del_sample:
 def __del__(self):
  print("delが呼び出されました。 ")
del1 =del_sample ()
del del1
 #delインスタン名とすると、インスタンスが削除されます。
 #インスタンスを削除すると、 __ del__が呼び出され、 "del が呼び出されました。 "が表示されます。
もう少し詳しく見てみましょう。以下は、コンストラクタとデストラクタの例です。
class MyClass:
def __init__(self, name):
self.name = name
print(f"{self.name}が生成されました。")
def __del__(self):
print(f"{self.name}が削除されました。")
obj1 = MyClass("オブジェクト1")
obj2 = MyClass("オブジェクト2")
del obj1
del obj2
このコードでは、MyClassクラスのコンストラクタである__init__メソッドが、オブジェクトの生成時に呼び出されます。また、MyClassクラスのデストラクタである__del__メソッドが、オブジェクトの削除時に呼び出されます。obj1obj2は、それぞれ"オブジェクト1""オブジェクト2"という名前で生成されます。del obj1del obj2によって、それぞれのオブジェクトが削除されます。この結果、以下のような出力が得られます。
オブジェクト1が生成されました。
オブジェクト2が生成されました。
オブジェクト1が削除されました。
オブジェクト2が削除されました。
このように、オブジェクトが生成されたときと削除されたときに、それぞれコンストラクタとデストラクタが呼び出されることが確認できます。

27.インスタンスメソッド、クラスメソッド、スタティックメソッド

Pythonのクラスのメソッドには、インスタンスメソッド、クラスメソッド、スタティックメソッドの3種類があります。

インスタンスメソッドとは

クラスから作成したオブジェクト(インスタンス)を用いて呼び出すメソッド インスタンスメソッドの例
class MyClass
 def init __( name):
  self.name=name
 def print_hello (self)
   #インスタンスメソッド
  print('Hello'+ self.name)
AClass = MyClass ('World')
AClass.print_hello()
引数のself は必ずつけます。 self は自分自身(作成したインスタンス自身を表し、 例の場合だとコンストラクタで初期化した、インスタンス変数 name を呼び出しています (self.name)

クラスメソッドとは

クラスメソッドは、クラス自体に紐付くメソッドで、クラスを操作するために使われます。クラスメソッドは、通常のメソッドとは異なり、デコレータ@classmethodを付けて宣言します。
class MyClass
 class_name='myclass'
 def init __( name):
  self.name = name
 @classmethod
 def print_hello(cls):
  print('Hello' + cls.class_name)
MyClass.print_hello() ➀@classmethod で定義 ➁第一引数をcls を取ります(cls はクラス自身) cls.変数名とすることで、クラス変数に アクセスできます。 初期化(インスタンス化)がされていないため、インスタンス変数に アクセスすることはできません 以下は、クラスメソッドを使った例です。
class MyClass:
class_variable = 0
def __init__(self, instance_variable):
self.instance_variable = instance_variable
MyClass.class_variable += 1
@classmethod
def class_method(cls, x):
cls.class_variable += x
a = MyClass(1)
b = MyClass(2)
c = MyClass(3)
print(MyClass.class_variable) # 3

MyClass.class_method(10)
print(MyClass.class_variable) # 13
この例では、class_methodというクラスメソッドを定義しています。class_methodは、クラス変数class_variableを引数で渡された値だけ増加させます。そして、class_variableの値を表示しています。 class_methodに渡される第1引数clsは、クラス自身を表します。このため、クラスメソッド内ではクラス変数にアクセスすることができます。 また、@classmethodデコレータを使うことで、クラスメソッドを宣言することができます。このデコレータを使うことで、通常のメソッドと区別することができます。

スタティックメソッドとは

スタティックメソッドは、クラスに紐付かないメソッドで、クラス自体やインスタンスに依存しない処理を実装するために使われます。スタティックメソッドは、通常のメソッドとは異なり、デコレータ@staticmethodを付けて宣言します。
class MyClass:
 class_name = 'myclass'
 def __init__ (self,name):
  self.name=name
 @staticmethod
 def print_hello():
  print('Hello World")
MyClass.print_hello() ➀@staticmethod で定義 ➁クラス変数へもインスタンス変数へもアクセスできない ちなみに、インスタンスからクラスメソッド、スタティックメソッドを利用することはできます。 以下は、スタティックメソッドを使った例です。
class MyClass:
@staticmethod
def static_method(x, y):
return x + y
print(MyClass.static_method(1, 2)) # 3
この例では、static_methodというスタティックメソッドを定義しています。static_methodは、引数で渡された2つの値を足し算して返します。 スタティックメソッドは、クラスやインスタンスに依存しない処理を実装するのに適しています。例えば、日付や時間などの共通の処理をスタティックメソッドとして実装することができます。スタティックメソッドは、クラスの外部から直接呼び出すことができるため、使い勝手が良いです。 特殊メソッド https://docs.python.org/ja/3/reference/datamodel.html 詳細は上記ヘルプサイトから参照 特殊メソッドはインスタンスにアクセスする際に、特定の処理を実行すると呼び出されるメソッド。 例えばa + b として実行するとき、内部的には a.__add__ (b) として呼び出される。 以下に特殊なメソッドを記します。 __str__: ※str(object), print(object) の際に呼び出され、オブジェクトを文字列として返す __bool__: ※if 文で論理値を返すことができる __len __: ※len 実行時に呼び出される。 __eq__: ※== の際に呼び出される __hash__: ※文字列をハッシュ値として返す。この関数を定義することで、クラスを辞書として扱うときや set に要素を入れるさいに利用する __name__: ※クラスの名前を表す

28.オブジェクト指向:継承

継承とは、あるクラス(親クラス、スーパークラス)を基に、新しいクラス(子クラス、サブクラス)を定義することです。子クラスは、親クラスのすべての属性やメソッドを引き継ぎ、新たに独自の属性やメソッドを追加することができます。 継承の構文は、以下のようになります。
class 親クラス:
# 親クラスの属性やメソッドの定義

class 子クラス(親クラス):
# 子クラスの属性やメソッドの定義
例えば、次のような親クラスAnimalがあるとします。
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"私の名前は{self.name}です。{self.age}歳です。")
def cry(self):
print("鳴き声を出します。")
このクラスに、子クラスCatを定義することができます。Catクラスは、Animalクラスを継承して、新たにmeowメソッドを追加しています。
class Cat(Animal):
def meow(self):
print("ニャーニャーと鳴きます。")
Catクラスは、Animalクラスを継承しているため、Animalクラスの属性やメソッドを使用することができます。
cat = Cat("たま", 3)
cat.introduce() # "私の名前はたまです。3歳です。"と表示される
cat.cry() # "鳴き声を出します。"と表示される
cat.meow() # "ニャーニャーと鳴きます。"と表示される
このように、継承を利用することで、既存のクラスを再利用し、新しいクラスを簡単に定義することができます。

継承元のメソッドを上書きしよう / super関数

継承元のメソッドを上書きする場合は、子クラスで同じ名前のメソッドを定義し、上書きしたい処理を実装します。子クラスで同じ名前のメソッドを定義すると、そのメソッドが呼び出されるようになります。 例えば、以下のようなAnimalクラスがあるとします。
class Animal:
def speak(self):
print("動物が鳴きます。")
このクラスを継承して、Catクラスを定義することができます。CatクラスでAnimalクラスのspeakメソッドを上書きし、猫らしい鳴き声を出すようにします。
class Cat(Animal):
def speak(self):
print("にゃーにゃーと鳴きます。")
Catクラスでspeakメソッドを定義したため、Catクラスのインスタンスでspeakメソッドを呼び出すと、Catクラスで定義したspeakメソッドが実行されます。
cat = Cat()
cat.speak() # "にゃーにゃーと鳴きます。"と表示される
継承元のメソッドを呼び出したい場合は、super()関数を使用します。super()関数は、継承元のクラスを取得し、そのクラスのメソッドを呼び出すことができます。
class Cat(Animal):
def speak(self):
super().speak() # 継承元のspeakメソッドを呼び出す
print("にゃーにゃーと鳴きます。")
このように、super()関数を使用することで、継承元のメソッドを呼び出しつつ、子クラスで上書きした処理を実行することができます。

プロパティ

プロパティ (Property) は、オブジェクトの属性にアクセスするための仕組みです。通常、オブジェクトの属性には直接アクセスして取得・設定を行いますが、プロパティを使用すると、属性にアクセスする際に、あたかもメソッドを呼び出すかのように、特別な処理を挟むことができます。 プロパティは、@propertyデコレータを使用して定義します。以下は、プロパティを使用した例です。
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
person = Person('Alice')
print(person.name) # 'Alice'と表示される
person.name = 'Bob'
print(person.name) # 'Bob'と表示される
上記の例では、Personクラスにnameというプロパティを定義しています。@propertyデコレータを使用して、nameメソッドをプロパティに変換しています。nameプロパティを使用すると、内部で_name属性にアクセスし、その値を取得するようになります。 また、nameプロパティに対して、@name.setterデコレータを使用することで、プロパティに値を設定するためのメソッドを定義することができます。 プロパティを使用することで、オブジェクトの属性に対するアクセスを制御し、不正な値を防止したり、属性にアクセスするための処理を追加したりすることができます。

GetterとSetter

ゲッター(Getter)とセッター(Setter)は、プロパティの一種で、オブジェクトの属性にアクセスする際に、特別な処理を挟むことができるメソッドです。 ゲッターは、属性を取得する際に呼び出されるメソッドで、セッターは、属性を設定する際に呼び出されるメソッドです。 以下は、ゲッターとセッターを使用した例です。
class Person:
def __init__(self, name):
self._name = name
def get_name(self):
return self._name
def set_name(self, name):
self._name = name
name = property(get_name, set_name)
person = Person('Alice')
print(person.name) # 'Alice'と表示される
person.name = 'Bob'
print(person.name) # 'Bob'と表示される
上記の例では、Personクラスにname属性を定義しています。get_nameメソッドとset_nameメソッドを使用して、それぞれゲッターとセッターを定義し、property関数を使用して、name属性をプロパティに変換しています。 nameプロパティを使用すると、内部でget_nameメソッドが呼び出され、set_nameメソッドが呼び出されるようになります。 プロパティとゲッター・セッターは、オブジェクトの属性にアクセスする際に、特別な処理を追加するために使用されます。ただし、Pythonでは、プロパティの定義が簡単であるため、通常はプロパティを使用することが推奨されます。

変数にアンダースコアをつける

Pythonでは、変数名の前に1つまたは2つのアンダースコア(_または__)を付けることができます。 1つのアンダースコアを付けた場合は、外部からのアクセスを制限するための慣習的な方法として使用されます。つまり、外部からアクセスしないように、プライベートな変数として扱われます。ただし、このような変数へのアクセスは、制限がないわけではなく、アクセスすることはできます。
class MyClass:
def __init__(self):
self._private_variable = "Hello, world!"
my_object = MyClass()
print(my_object._private_variable) # "Hello, world!"と表示される
2つのアンダースコアを付けた場合は、外部からアクセスできないようにするための強力な機能として使用されます。これを「名前修飾」と呼ばれ、クラスの外部からのアクセスを禁止するために使用されます。
class MyClass:
def __init__(self):
self.__private_variable = "Hello, world!"
my_object = MyClass()
print(my_object.__private_variable) # エラーが発生する
ただし、実際には、2つのアンダースコアを付けた変数名は、名前修飾によって _クラス名__変数名 に変換されます。そのため、以下のようにアクセスすることができます。
class MyClass:
def __init__(self):
self.__private_variable = "Hello, world!"
my_object = MyClass()
print(my_object._MyClass__private_variable) # "Hello, world!"と表示される
したがって、アンダースコアを使用することで、変数をプライベートな変数として扱い、外部からのアクセスを制限することができます。ただし、完全にアクセスを制限するためには、アンダースコアを2つ付けた変数名を使用する必要があります。

例外処理とダックタイピング

例外処理は、プログラムが実行中にエラーが発生した場合に、プログラムを停止せずにエラーを処理する方法です。Pythonでは、tryexceptを使用して、例外処理を行うことができます。
try:
# 例外が発生する可能性のある処理
except SomeException:
# 例外が発生した場合に行う処理
else:
# 例外が発生しなかった場合に行う処理
finally:
# 例外が発生してもしなくても最終的に行う処理
ダックタイピングは、Pythonの動的な型付けの特徴を利用して、オブジェクトの型を意識することなく、オブジェクトのインターフェース(属性やメソッド)に基づいてオブジェクトを扱う方法です。 例えば、以下のようなコードを考えてみましょう。
def print_name(obj):
print(obj.name)

class Person:
def __init__(self, name):
self.name = name

class Animal:
def __init__(self, name):
self.name = name
def sound(self):
print("sound")
person = Person("Alice")
animal = Animal("Dog")

print_name(person) # "Alice"と表示される
print_name(animal) # "Dog"と表示される
print_name関数は、objという引数を受け取り、そのname属性を表示する関数です。PersonクラスとAnimalクラスは、それぞれname属性を持っていますが、Animalクラスにはsoundメソッドも追加されています。 print_name関数に渡されたオブジェクトの型を意識することなく、name属性を表示することができます。これがダックタイピングの特徴です。personオブジェクトとanimalオブジェクトは、異なるクラスのインスタンスですが、共通のインターフェースを持っているため、print_name関数で共通して扱うことができます。

抽象クラスの使い方

抽象クラスは、インスタンス化できないクラスで、継承先のクラスで共通のメソッドや属性を定義するためのクラスです。Pythonでは、abcモジュールを使って抽象クラスを定義することができます。 抽象クラスを定義する場合は、まずabcモジュールをインポートします。次に、ABCクラスを継承した抽象クラスを定義し、@abstractmethodデコレータをつけて抽象メソッドを定義します。
from abc import ABC, abstractmethod
class AbstractClass(ABC):
@abstractmethod
def some_method(self):
pass
このように抽象クラスを定義すると、some_methodメソッドを継承先のクラスでオーバーライドしなければならなくなります。
class SubClass(AbstractClass):
def some_method(self):
print("Implemented some_method")
このようにして、AbstractClassを継承したSubClassクラスを定義し、some_methodメソッドを実装します。AbstractClassを継承したクラスは、some_methodメソッドを必ず実装する必要があるため、プログラムの品質を向上させることができます。 また、抽象クラスには、抽象メソッド以外にも具象メソッドを定義することができます。抽象クラスの具象メソッドは、継承先のクラスでオーバーライドすることもできます。
class AbstractClass(ABC):
@abstractmethod
def some_method(self):
pass
def some_other_method(self):
print("Implemented some_other_method")
class SubClass(AbstractClass):
def some_method(self):
print("Implemented some_method")
このようにして、AbstractClassには、some_methodメソッドとsome_other_methodメソッドを定義し、some_methodメソッドだけをSubClassでオーバーライドします。some_other_methodメソッドはオーバーライドしなくてもよく、SubClassからそのまま呼び出すことができます。

29.クラスの多重継承

クラスを多重継承する場合には、classクラス名(継承先 1, 継承先 2): と記述します
class ClassA :
 def __init__ (self, name):
  self.a_name = name
 def print_a (self):
  print("a = {}".format(self.a_name ))
 def print_hi (self):
  print("A hi")
class ClassB
 def __init__ (self, name):
  self.b_name = name
 def print_b (self):
  print("b = {}".format(self.b_name ))
 def print_hi (self):
  print("B hi")
class NewClass (ClassA , ClassB ):
 def __init__ (self, a_name , b_name , name):
  ClassA init (self, a_name )
   #親クラス ClassA の初期化
  ClassB init (self, b_name )
   #親クラス ClassB の初期化
  self.name = name
 def print_name (self):
  print("name = {}".format(self.name))

クラス変数で値を共有する

クラス変数は、そのクラスのすべてのインスタンスで共有される変数です。クラス変数を使うことで、値を共有することができます。 以下は、クラス変数を使った例です。
class MyClass:
class_variable = 0

def __init__(self, instance_variable):
self.instance_variable = instance_variable
MyClass.class_variable += 1
このように、MyClassというクラスを定義し、クラス変数としてclass_variableを定義します。そして、__init__メソッドでclass_variableをインクリメントします。 ここで、class_variableはすべてのインスタンスで共有されるため、どのインスタンスからも同じ値が参照されます。
>>> a = MyClass(1)
>>> b = MyClass(2)
>>> c = MyClass(3)
>>> print(MyClass.class_variable)
3
このように、3つのインスタンスを作成してclass_variableをインクリメントした後、class_variableの値を参照すると、すべてのインスタンスで共有された値である3が出力されます。

メタクラス

ポリモーフィズムに先立ってメタクラスについて説明します。 メタクラスとは、クラスの再定義をするクラスという風に考えればよいです。 (デフォルトのメタクラスは type クラスだが、自身で定義することもできる) class定義時に、継承と同じ形で metaclass メタクラス名とすると自身のメタクラスを指定できます メタクラスは、主にその定義でよいのかクラスを検証する際に用いられます。 定義は以下のようにします
class Meta(type):
 def __new__(metacls , name, bases, class_dict):
   #クラスのチェックを行う
   #name:クラスの名前
   #bases:継承しているクラス
   #class_dict クラスの持っている値
  return super().__new__(metacls,name,bases,class_dict)
   #type クラスでクラスを生成する

ポリモーフィズム 多態性

サブクラスを複数作成し、同じメソッドを定義して呼び出す際にどのクラスか意識せずに呼び出すこと
from abc import abstractmethod ABCMeta
class Human( metaclass ABCMeta)
  #親クラス
 def __init __(self. name):
  self.name = name
@abstractmethod
  #親クラスでは処理を定義しないメソッド。
  #子クラスで必ずオーバーライドする(オーバーライドしないと ABCMeta にはじかれる)
 def say_something (self):
  pass
 def say_name (self):
  #共通メソッド
 print(self.name)
class HumanA (Human):
 def say_something (self)
  print("I'm A")
class HumanB (self):
 def say_something (self):
  #同じ名前のものを定義
 print("I'm B")

Private 変数

これまで学んだクラス変数、インスタンス変数は外部からアクセス して値を書き換えられます。 そのため、アクセスの出来ない変数(Private 変数を定義する必要があります) ただし、 Pythonは厳密なPrivate 変数は存在しないので、以下の方法でも外部からアクセスできます __variable ※Private 変数 アンダースコア を二つ付けて定義
class Human:
 __msg = "Hello"
 #クラス変数の Private 変数
def __init (self, name,
  self.__name = name
  self.__age = age
  #インスタンス変数の Private 変数です。
 def print_msg (self):
 print("{} name = {}, age = {}".format(self.__msg , self.__name , self.__age ))
  #クラス内でアクセス
tanaka = Human("Tanaka", 25, 'Man')
seiya = Human("Seiya", 27, 'Man')
print(tanaka.__name)
 #これはアクセスできずエラーになります。
print(tanaka._Human__name)
 #Private変数ですが、クラス外からも普通にアクセスできます。

カプセル化, setter,getter

Private変数を使う場合には、クラスの外部から変数が見えないようにする(カプセル化)必要があります。カプセル化をする場合には、 getter と setter を定義して利用しないと変数にアクセスができないようにします。 【カプセル化の方法 1 】 def get_変数名(): def set_変数名(): 変数名= property(get_変数名,set_変数名)
class Human:
 def init (self, name,age):
  self.__name = name
  self.__age = age
def get_name (self):
   #__nameのgetterの定義
  print("getterを呼び出します")
  return self.__name
   #private 変数の __name を返します。
 def get_age (self):
  return self.__age
 def set_name (self, value):
   #__name の setter の定義
  print("setterを呼び出します")
  self.__name = value
   #private 変数の __name を設定します。
 def set_age (self,value)
  self.__age = value
name = property(get_name , set_name )
  #property 関数を利用することで、get_name と set_name を呼び出す機能を持った
   name プロパティが作成されます。
 age = property(get_age , set_age)
カプセル化 setter, getter 【カプセル化の方法 2 】
@property,@var.setter
    class Human:
 def init (self, name,age):
  self.__name = name
  self.__age = age
@property
   #@propertyとすると、 name プロパティの getter として定義します
 def name(self):
  print("getterを呼び出します")
  return self.__name
   #private の変数、 __name を返します。
@property
 def age(self):
  return self.__age
@name.setter
   #name プロパティの setter として定義します。
 def name(self, value):
  print("setterを呼び出します")
  self.__name = value
   #private の変数、 __name を設定します
 @age.setter
 def age(self, value):
  self.__age = value

30.ファイル入力

ファイルからのテキストの読込みは以下のコマンドを利用する f = open(file_path , mode=”r”) ※読込みモード line = f.read () ※ファイルの中身全体を読込み f.close() ※ファイルを閉じる
f = open(file_path , mode="r", encoding ="utf-8")
 #utf 8 でファイルを開く
f = open(file_path , mode="r", encoding ="sjis")
 #shift jis でファイルを開く
f = open(file_path , mode="r", encoding = "\r\n")
 #改行コードを\r\nに指定(crlf)
lines = f.readlines ()
 #行ごとに分割したリストとして取得
line = f.readline ()
 #ファイルを一行毎に読込み
➀read, readlines はファイルを全て一気に読み込むため、処理は速いがメモリの消費は大きい(小さいファイル向け) ➁readline はファイルを 1 行ずつ読み込むため、処理は遅いがメモリの消費は小さい(大きいファイル向け) ファイルのopen と close を自動的に行う (with)
with open(file_path , mode="r") as f:
 for x in f.readlines():
・・・・ with 構文を抜けると自動的にファイルがクローズされる セイウチ演算子を行う場合
with open('file.csv', mode='r') as f:
 while msg f.readline():
  print(msg)

31.ファイル出力

ファイル書き込み

f = open(file_path , mode=”w”) ※書き込みモード(ファイルが存在しなければ作成、存在した場合は上書き) f.write(文字列) ※ファイルに文字列を書き込み(\nで改行) f.close() ※ファイルを閉じる f.writelines() ※リストをそのままつなげて書き込み f.write(‘\n’,join(list)) ※リストを改行させて書き込み with open(file_path , mode=’w’,’\r\n’, encoding = ‘sjis’) as f: ※ファイル追記 f = open(file_path , mode=”a”) ※追記モード ファイルが存在しなければ作成、存在した場合は追記 バイナリファイルの読み書き(詳細は割愛)
modeにbを付ける
open(file_path,mode ='rb')
 #バイナリファイルの読み込み
open(file_path,mode = 'wb')
 #バイナリファイルの書き込み

32.with文を使ってファイルを開く

with文を使用することで、ファイルを開く処理と閉じる処理を一括して行うことができます。
with open('file.txt', 'r') as f:
# ファイルを読み込む処理
上記のように、withキーワードを使用してファイルを開くと、ブロック内で処理が行われた後、自動的にファイルを閉じることができます。また、ファイルを開くときに指定するモード(’r’, ‘w’, ‘a’など)によって、読み込みモード、書き込みモード、追記モードなどが指定できます。
with open('file.txt', 'r') as f:
text = f.read()
ファイルを書き込む場合は、以下のように記述します。
with open('file.txt', 'w') as f:
f.write('hello')
ファイルを追記する場合は、以下のように記述します。
with open('file.txt', 'a') as f:
f.write('world')
withの中の処理を実行する前に、 with の後に指定したクラスの __init と __enter_ がそれぞれ呼ばれ、処理終了後に、クラスの __exit__ メソッドが呼ばれます。 withをどのように使うかというと、処理が連続していてすべての処理が必要な場合、例えば •ファイルの書き込み処理(ファイル開く→書き込む→ファイル閉じる) •DB へのデータの書き込み処理 (DB へコネクションを張る→書き込む→コネクションを閉じる)
class WithTest (object):
 def init (self):
  print("init が呼ばれました")
 def__enter__(self):
  print("enterが呼ばれました")
 def__exit__(self,exc_type,exc_val,exc_tb):
  print("exitが呼ばれました")
with WithTest() as t:
  print("withを実行しました")
   ※withでクラスを作成すると、まず__init__を実行、次に __enter__ を実行、処理終了後に、__exit__ を実行します。
   ※以下の順で実行されます。
   ※init が呼ばれました
   ※enter が呼ばれました
   ※with を実行しました
   ※exit が呼ばれました

ファイルの内容を読み込む readline

with open('file.txt', 'r') as f:
line = f.readline()
while line:
print(line)
line = f.readline()
上記のコードでは、readline()メソッドでファイルから1行読み込み、その行を出力しています。while文を使って、ファイルの最後まで行を読み込む処理を繰り返しています。 また、for文と組み合わせて、以下のように書くこともできます。
with open('file.txt', 'r') as f:
for line in f:
print(line)
for文の条件式にfを指定することで、ファイルから1行ずつ読み込み、その行をlineに代入して処理を行うことができます。

ファイル内の位置を移動する tell seek

ファイル内の位置を移動するには、tell()メソッドとseek()メソッドを使用します。 tell()メソッドは、現在のファイルポインタの位置を取得します。ファイルポインタとは、現在読み込んでいる位置を示すポインタのことです。 seek()メソッドは、ファイルポインタを指定した位置に移動します。seek()メソッドの第1引数には、移動したい位置を、第2引数には、移動する基準位置を指定します。 基準位置は以下の3つがあります。
  • 0 : ファイルの先頭を基準として移動します。
  • 1 : 現在のファイルポインタを基準として移動します。
  • 2 : ファイルの末尾を基準として移動します。
以下は、tell()メソッドとseek()メソッドを使用して、ファイル内の位置を移動する例です。
with open('file.txt', 'r') as f:
print(f.tell()) # 現在の位置を出力
f.seek(5) # 位置を移動
print(f.tell()) # 現在の位置を出力
上記のコードでは、ファイルを読み込みモードで開いた後、現在の位置を取得して出力しています。次に、seek()メソッドで位置を5文字目に移動し、再度現在の位置を取得して出力しています。

書き込みと読み込みを同時に行う

ファイルの読み書きを同時に行いたい場合、ファイルオブジェクトをr+モードやw+モードで開くことができます。
  • r+モード : 読み書きが可能で、ファイルポインタが先頭に設定されます。
  • w+モード : 読み書きが可能で、ファイルが存在する場合は上書きされ、存在しない場合は新規作成されます。ファイルポインタが先頭に設定されます。
以下は、r+モードでファイルを開いて、読み込みと書き込みを同時に行う例です。
with open('file.txt', 'r+') as f:
print(f.read()) # ファイルの内容を読み込む
f.write('Hello, World!') # ファイルに書き込む
上記のコードでは、r+モードでファイルを開き、read()メソッドでファイルの内容を読み込み、write()メソッドでファイルに書き込んでいます。with文を使用しているため、ブロックを抜ける際に自動的にファイルが閉じられます。

33.ファイルの便利な活用方法

テンプレートを使ってみよう Template関数 string

Pythonのstringモジュールには、テンプレート文字列を作成するためのTemplateクラスが用意されています。Templateクラスを使用すると、文字列中にある$記号で囲まれた変数を置換することができます。 以下は、Templateクラスを使用して、テンプレート文字列を作成し、変数を置換する例です。 from string import Template # テンプレート文字列の作成 template_str = “Hello, $name! Your balance is $balance.” # テンプレート文字列を使って、置換された文字列を作成する template = Template(template_str) message = template.substitute(name=”Alice”, balance=10000) print(message) # Hello, Alice! Your balance is 10000. 上記のコードでは、Templateクラスを使ってテンプレート文字列を作成し、substitute()メソッドで$name$balanceを置換しています。substitute()メソッドは、テンプレート文字列中の変数を置換した新しい文字列を返します。 なお、テンプレート文字列中の変数名には、アルファベット、数字、アンダースコアを使うことができますが、$記号で囲まれていることが必要です。また、Templateクラスを使用する場合は、変数の値が安全であることを確認する必要があります。安全性が確保されていない場合は、代わりにformat()メソッドを使用することを検討してください。

substitute

substitute()メソッドは、Templateクラスのメソッドの1つで、テンプレート文字列中の変数を置換して新しい文字列を返すために使用されます。substitute()メソッドは、以下のようなシンタックスを持っています。
substitute(*args, **kwargs)
substitute()メソッドには、2種類の引数を渡すことができます。
  • 位置引数(*args): テンプレート文字列中の変数を、引数の順序で置換することができます。変数名は$0$1$2…のように指定します。
  • キーワード引数(**kwargs): テンプレート文字列中の変数を、引数名で置換することができます。変数名は、$記号で始まり、アルファベット、数字、アンダースコアからなる文字列で指定します。
以下は、substitute()メソッドを使用して、テンプレート文字列中の変数を置換する例です。 from string import Template # テンプレート文字列の作成 template_str = “Hello, $name! Your balance is $balance.” # テンプレート文字列を使って、置換された文字列を作成する template = Template(template_str) message = template.substitute(name=”Alice”, balance=10000) print(message) # Hello, Alice! Your balance is 10000. 上記のコードでは、Templateクラスを使用してテンプレート文字列を作成し、substitute()メソッドを使用して$name$balanceを置換しています。変数名はキーワード引数として指定されています。

テンプレートの活用方法

テンプレートは、文字列に特定のパラメータを埋め込んで、簡単かつ効率的に生成することができます。主にHTMLファイルの自動生成などに用いられます。 例えば、以下のようなHTMLテンプレートを作成します。
<html>
<head>
<title>$title</title>
</head>
<body>
<h1>$heading</h1>
<p>$content</p>
</body>
</html>
このテンプレートをPythonのコードで使用する場合、Templateクラスを使用します。次のように、Templateオブジェクトを作成し、substituteメソッドを使用してパラメータを置き換えます。
from string import Template
template = Template('''
<html>
<head>
<title>$title</title>
</head>
<body>
<h1>$heading</h1>
<p>$content</p>
</body>
</html>
''')
params = {'title': 'My Blog', 'heading': 'Welcome to my blog', 'content': 'This is my first blog post.'}
result = template.substitute(params)
print(result)
このコードは、HTMLテンプレートの$title、$heading、および$contentを置き換えて、生成されたHTMLコードを出力します。

CSVファイルを操作しよう

CSV(Comma Separated Values)ファイルは、カンマやタブなどの区切り文字で区切られたデータを格納するためのファイル形式です。PythonにはCSVファイルを操作するための標準ライブラリ csv があります。 以下は、CSVファイルを読み込んで行ごとに出力する例です。
import csv
with open('example.csv', 'r') as file:
reader = csv.reader(file)
for row in reader:
print(row)
このコードは、’example.csv’ ファイルを読み込み、各行をリストとして出力します。 CSVファイルの各行は、コンマ(,)またはタブ(\t)で区切られています。このため、 csv モジュールの reader オブジェクトは、各行をリストとして返します。 また、CSVファイルを書き込むには、csv.writer() 関数を使用します。以下は、CSVファイルにデータを書き込む例です。
import csv
data = [
['Name', 'Age', 'Gender'],
['John', '25', 'Male'],
['Emily', '27', 'Female'],
['Tom', '30', 'Male']
]
with open('example.csv', 'w', newline='') as file:
writer = csv.writer(file)
for row in data:
writer.writerow(row)
このコードは、dataリストの各要素をCSVファイルに書き込みます。各要素は、 writerow メソッドを使用して、CSVファイルに新しい行として書き込まれます。 newline='' 引数を指定して、Windows環境での余分な改行を回避しています。 以上のように、Pythonの csv モジュールを使用することで、CSVファイルを簡単に読み込んだり、書き込んだりすることができます。

様々なファイル操作

exists isfile isdir

Pythonのosモジュールには、ファイルやディレクトリの存在をチェックするための関数がいくつか用意されています。以下は代表的なものです。
  • os.path.exists(path):指定されたパスが存在する場合にTrueを返します。
  • os.path.isfile(path):指定されたパスがファイルである場合にTrueを返します。
  • os.path.isdir(path):指定されたパスがディレクトリである場合にTrueを返します。
これらの関数は、引数に指定されたパスが相対パスの場合、カレントディレクトリからのパスとして扱われます。絶対パスを指定する場合には、os.path.abspath()関数を使って絶対パスに変換してから渡すことが推奨されます。 例えば、カレントディレクトリにexample.txtというファイルがある場合、以下のように存在チェックを行うことができます。
import os
path = "example.txt"
if os.path.exists(path):
print("指定されたパスは存在します")
else:
print("指定されたパスは存在しません")

if os.path.isfile(path):
print("指定されたパスはファイルです")
else:
print("指定されたパスはファイルではありません")
また、os.path.join()関数を使うことで、OSに依存しないファイルパスの生成が可能になります。以下は、カレントディレクトリにあるexampleというディレクトリの中にexample.txtを作成する例です。
import os

directory = "example"
filename = "example.txt"
# OSに依存しないファイルパスを生成する
path = os.path.join(directory, filename)

# ディレクトリが存在しない場合は作成する
if not os.path.exists(directory):
os.makedirs(directory)
# ファイルを作成する
with open(path, mode="w") as f:
f.write("hello world")
このように、osモジュールを使うことで、様々なファイル操作を行うことができます。

rename

rename関数は、指定したファイル名を変更します。ファイル名の変更は、同じディレクトリ内で実行されます。 例えば、sample.txtというファイル名をnew_sample.txtに変更する場合、以下のように書きます。
import os

os.rename('sample.txt', 'new_sample.txt')
もしsample.txtが存在しない場合、FileNotFoundErrorが発生します。また、new_sample.txtが既に存在する場合、上書きされてしまいます。この点には注意が必要です。

symlink mkdir redir pathlib remove

  • os.symlink(src, dst): srcで指定されたパスのファイルに対して、dstで指定されたパスにシンボリックリンクを作成します。
  • os.mkdir(path): pathで指定されたディレクトリを作成します。既に存在する場合は、FileExistsErrorが発生します。
  • os.makedirs(path, exist_ok=False): pathで指定されたディレクトリを再帰的に作成します。exist_okTrueの場合は、既に存在するディレクトリを上書きせずに処理を終了します。
  • sys.stdout = open(file_path, 'w'): 標準出力を指定したファイルにリダイレクトします。リダイレクトした後は、標準出力の内容はファイルに書き込まれます。
  • pathlib.Path(path).unlink(): pathで指定されたファイルを削除します。ファイルが存在しない場合は、FileNotFoundErrorが発生します。
これらの関数を使用することで、より高度なファイル操作を実現することができます。

listdir glob

listdir は、指定されたパスにあるすべてのファイルとディレクトリの名前のリストを返す関数です。引数にはパスを指定します。 例えば、以下のように使用します。
import os
# カレントディレクトリにあるファイルとディレクトリの一覧を表示する
print(os.listdir())
glob は、指定されたパターンに一致するファイルのリストを返す関数です。引数にはパターンを指定します。パターンは、ワイルドカードを使って指定することができます。 例えば、以下のように使用します。
import glob
# カレントディレクトリにある py ファイルの一覧を表示する
print(glob.glob('*.py'))
また、サブディレクトリ内のファイルも検索することができます。例えば、以下のように使用します。
import glob
# サブディレクトリ内にある py ファイルの一覧を表示する
print(glob.glob('**/*.py', recursive=True))
ここで、**は、0個以上のディレクトリにマッチするワイルドカードです。recursive=Trueは、サブディレクトリを再帰的に検索することを指定します。

shutil copy

shutil モジュールを使用すると、ファイルやディレクトリをコピーすることができます。 例えば、/path/to/source にあるファイルやディレクトリを /path/to/destination にコピーするには、以下のようにします。
import shutil
shutil.copy("/path/to/source", "/path/to/destination")
このコードでは、 shutil.copy 関数に2つの引数を渡しています。最初の引数はコピー元のパスであり、2番目の引数はコピー先のパスです。もしコピー先にファイルやディレクトリが既に存在している場合は、上書きされます。ただし、コピー元がディレクトリである場合は、ディレクトリの内容が再帰的にコピーされます。 また、ファイルのコピーだけでなく、ディレクトリのコピーにも対応しています。以下の例では、/path/to/source 内のすべてのファイルとディレクトリを /path/to/destination にコピーしています。
import shutil
shutil.copytree("/path/to/source", "/path/to/destination")
shutil.copytree 関数は、shutil.copy 関数と似ていますが、ディレクトリの場合は再帰的にコピーする点が異なります。ただし、コピー先のディレクトリがすでに存在する場合は、FileExistsError 例外が発生します。shutil.rmtree 関数を使用して、コピー先のディレクトリを削除してから、shutil.copytree 関数を実行することができます。

rmtree

rmtreeは、指定されたディレクトリとその中身を再帰的に削除する関数です。shutilモジュールに含まれる関数の一つで、以下のように使用します。
import shutil
shutil.rmtree(path, ignore_errors=False, onerror=None)
  • path: 削除するディレクトリのパス。
  • ignore_errors: 削除中に発生したエラーを無視する場合は True、例外を発生させる場合は Falseを指定します(デフォルトは False)。
  • onerror: 削除中にエラーが発生した場合に呼び出されるコールバック関数を指定します。デフォルトでは Noneが指定されています。
rmtreeを使うと、指定されたディレクトリ以下の全てのファイルやディレクトリを削除できます。ただし、削除するディレクトリを指定する前に、間違って他のディレクトリを削除しないように注意してください。また、削除されたファイルは回復できないので、慎重に操作してください。

34.圧縮ファイルの扱い

tarファイルの圧縮と展開

Pythonでは、tarファイルの圧縮や展開に使われる標準ライブラリ tarfile を提供しています。以下では、tarfile を使った圧縮と展開の方法について説明します。

tarファイルの圧縮

tarfile モジュールを使ってtarファイルを圧縮するには、tarfile.open() 関数を使って、圧縮したいファイル名とモードを指定します。モードには ‘w:gz’ を指定することでgzip形式の圧縮ができます。また、add() メソッドを使って、圧縮するファイルを追加します。
import tarfile
# 圧縮するファイル名
filename = 'sample.tar.gz'
# 圧縮するファイルリスト
file_list = ['file1.txt', 'file2.txt', 'file3.txt']
# ファイルを圧縮
with tarfile.open(filename, 'w:gz') as tar:
for file in file_list:
tar.add(file)
上記の例では、sample.tar.gz という名前のtarファイルを作成し、file1.txtfile2.txtfile3.txt の3つのファイルを圧縮して追加しています。

tarファイルの展開

tarfile モジュールを使ってtarファイルを展開するには、tarfile.open() 関数を使って、展開したいファイル名とモードを指定します。モードには ‘r:gz’ を指定することでgzip形式の圧縮ファイルを展開します。また、extractall() メソッドを使って、すべてのファイルを展開します。
import tarfile
# 展開するファイル名
filename = 'sample.tar.gz'
# tarファイルを展開
with tarfile.open(filename, 'r:gz') as tar:
tar.extractall()
上記の例では、sample.tar.gz という名前のtarファイルを展開し、すべてのファイルを展開しています。また、extract() メソッドを使って、特定のファイルのみを展開することもできます。

zipファイルの圧縮と展開

Pythonでは、zipfileモジュールを使用してZIPファイルを圧縮および展開できます。 まず、ZIPファイルを作成する方法を見てみましょう。
import zipfile
# ZIPファイルを作成する
with zipfile.ZipFile('sample.zip', 'w') as myzip:
myzip.write('file1.txt')
myzip.write('file2.txt')
ここで、ZipFileクラスのコンストラクタには、作成するZIPファイルのファイル名と、'w'引数が渡されています。これは、ファイルを書き込みモードで開くことを意味します。そして、writeメソッドを使用して、ZIPファイルに書き込むファイルを指定します。 次に、ZIPファイルを展開する方法を見てみましょう。
import zipfile
# ZIPファイルを展開する
with zipfile.ZipFile('sample.zip', 'r') as myzip:
myzip.extractall()
ここでも、ZipFileクラスのコンストラクタには、展開するZIPファイルのファイル名と、'r'引数が渡されています。そして、extractallメソッドを使用して、ZIPファイル内のすべてのファイルを展開しています。 また、ZipFileクラスには、ZIPファイル内のファイルを個別に取得する方法もあります。例えば、次のようにしてZIPファイル内のfile1.txtだけを取得することができます。
import zipfile
# ZIPファイル内のファイルを取得する
with zipfile.ZipFile('sample.zip', 'r') as myzip:
with myzip.open('file1.txt') as myfile:
print(myfile.read())
ここでは、ZipFileクラスのopenメソッドを使用して、ZIPファイル内のfile1.txtを開いています。そして、ファイルを読み込んでいます。

35.高度なファイルの操作

一時ファイルの活用

一時ファイルは、プログラムによって一時的に作成され、使用後に自動的に削除されるファイルです。一時ファイルは、一時的に必要なデータを保存するために使用され、プログラムの処理が終了したら自動的に削除されます。 Pythonには、一時ファイルを簡単に扱うための tempfile モジュールがあります。このモジュールには、一時ファイルを作成するための TemporaryFile()NamedTemporaryFile() などの関数が用意されています。 TemporaryFile() 関数は、一時ファイルをバイナリモードで作成します。ファイルを開くための引数はありません。ファイルを作成すると同時にファイルを開くので、ファイルオブジェクトを取得する必要はありません。
import tempfile

with tempfile.TemporaryFile() as fp:
fp.write(b"Hello, world!")
fp.seek(0)
print(fp.read())
NamedTemporaryFile() 関数は、一時ファイルを作成して、そのファイル名を返します。NamedTemporaryFile() 関数を呼び出すと、一時ファイルが作成されます。ファイル名はランダムな文字列で生成されます。ファイルオブジェクトを取得するために、NamedTemporaryFile() 関数に delete=False を指定します。
import tempfile
with tempfile.NamedTemporaryFile(delete=False) as fp:
fp.write(b"Hello, world!")
fp.seek(0)
print(fp.read())
filename = fp.name
print(filename)
この例では、一時ファイルを作成して、ファイルに “Hello, world!” を書き込み、読み取り、ファイル名を出力しています。delete=False を指定すると、一時ファイルが自動的に削除されず、ファイル名を取得することができます。ファイルを使用し終わったら、os.remove() 関数を使用してファイルを削除します。
import os

os.remove(filename)

mkdtemp

mkdtempは、一時的なディレクトリを作成するための関数です。この関数は、安全に一時ディレクトリを作成するために使用されます。例えば、ファイルの一時的なバックアップや、一時的なファイルを処理するために使用される場合があります。 以下は、mkdtemp関数を使用して一時的なディレクトリを作成する例です。
import tempfile

# 一時的なディレクトリを作成する
temp_dir = tempfile.mkdtemp()

# 作成されたディレクトリを表示する
print(temp_dir)
このコードでは、tempfileモジュールのmkdtemp関数を使用して、一時的なディレクトリを作成しています。作成されたディレクトリのパスは、temp_dir変数に格納され、print関数を使用して表示されます。

Pythonでターミナルのコマンドを実行する

Pythonでターミナルのコマンドを実行するには、subprocessモジュールを使用します。subprocessモジュールには、Pythonスクリプトからシステムコマンドを実行するための機能が含まれています。 以下は、Pythonスクリプトからlsコマンドを実行し、その結果を出力する例です。
import subprocess

result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
print(result.stdout.decode('utf-8'))
subprocess.run()関数は、実行するコマンドをリスト形式で渡します。stdout引数にsubprocess.PIPEを渡すことで、コマンドの標準出力をキャプチャできます。result.stdoutには、コマンドの出力がバイト文字列形式で格納されています。decode()メソッドを使用して文字列に変換することができます。

Shell=Trueを使ったコマンドの実行

Pythonのsubprocessモジュールを使用すると、Shell=Trueを使用してターミナルで実行されるコマンドを実行できます。subprocess.run()関数を使用することで、実行したいコマンドを文字列で指定し、必要に応じて引数を渡すことができます。以下は、Shell=Trueを使用して、lsコマンドを実行する例です。
import subprocess

result = subprocess.run('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
print(result.stdout.decode())
この例では、lsコマンドの結果が標準出力として取得され、result.stdout属性を使用してアクセスできます。また、result.stderr属性を使用して、標準エラー出力を取得することもできます。

|パイプ

パイプ(|)は、LinuxやMacOSなどのUnix系のコマンドライン環境で、一つのコマンドの出力を別のコマンドの入力に渡すために使われます。例えば、lsコマンドで表示されるファイル名の一覧をgrepコマンドでフィルタリングする場合、以下のようにパイプを使用します。
ls | grep .txt
Pythonで同じようなことを行う場合、subprocessモジュールのPopenクラスを使用します。Popenクラスは、新しいプロセスを作成し、標準入力や標準出力などのファイルディスクリプタを制御できます。 以下は、Pythonでls | grep .txtと同じことをする例です。
import subprocess
# ls コマンドの出力をパイプで grep コマンドに渡す
ls_process = subprocess.Popen(['ls'], stdout=subprocess.PIPE)
grep_process = subprocess.Popen(['grep', '.txt'], stdin=ls_process.stdout, stdout=subprocess.PIPE)
# grep コマンドの出力を取得する
output, error = grep_process.communicate()
# 結果を表示する
print(output.decode('utf-8'))
ここでは、subprocess.Popenlsコマンドを実行し、その標準出力をgrepコマンドの標準入力に渡しています。grepコマンドの出力は、grep_process.communicate()で取得できます。取得した出力はバイト文字列なので、decode()で文字列に変換しています。最後に、文字列を表示しています。

時間にまつわるライブラリとバックアップファイル

Pythonには時間に関する様々な機能を提供するライブラリがあります。代表的なものには、以下のようなものがあります。
  • time: 時間を扱う関数を提供する標準ライブラリ。
  • datetime: 日付や時間を扱うクラスを提供する標準ライブラリ。
  • calendar: カレンダーを生成するための関数を提供する標準ライブラリ。
  • arrow: 日時の操作に特化したライブラリ。
また、ファイルのバックアップについては、以下のような方法があります。
  • ファイルを別の場所にコピーする。
  • ファイル名に日付を含めた別のファイルを作成する。
  • バックアップ用のディレクトリを作成し、そこにファイルを保存する。
例えば、以下のようにして現在時刻を取得し、ファイル名に日付を含めたバックアップファイルを作成することができます。
import os
import shutil
import time
filename = "example.txt"
backup_dir = "backup"
if not os.path.exists(backup_dir):
os.mkdir(backup_dir)
backup_filename = os.path.join(backup_dir, f"{filename}.{time.strftime('%Y%m%d%H%M%S')}")
shutil.copyfile(filename, backup_filename)
この例では、osモジュールのexists関数を使ってバックアップ用のディレクトリが存在するかどうかをチェックし、存在しない場合はmkdir関数を使って作成しています。また、現在時刻をtimeモジュールのstrftime関数を使ってフォーマットし、ファイル名に追加しています。最後に、shutilモジュールのcopyfile関数を使ってファイルをコピーしています。

というわけで、今回は以上です。大変大変お疲れ様でした。 引き続きで、徐々に発信していきます。 コメントや感想を受け付けています。ちょっとした感想でもいいので嬉しいです。 それでは、以上です。
https://medical-science-labo.jp/python05/
最新情報をチェックしよう!