仮想環境の作成
Windows
python -m venv venv
venv\Scripts\activate
Mac
python3 -m venv venv
source venv/bin/activate
変数とデータ型
変数とは
- Pythonでは宣言の必要がなく、代入と同時に変数が作られる
x = 10 # 整数を代入
name = "Bob" # 文字列を代入
- 型は動的に決まり、あとから別の型を代入することも可能
x = 10
x = "Hello" # 同じ変数に文字列を代入
主なデータ型
- int:整数
- float:少数(浮動小数点数)
- str:文字列
- bool:TrueまたはFalse
- list:ミュータブル(=変更可能)な配列
- tuple:イミュータブル(=変更不可能)な配列
- set:重複なしの集合
- dict:キーと値のペアを持つ辞書型(いわゆる連想配列)
データ型を確認する方法
x = 100
print(type(x)) # <class 'int'>
型変換(キャスト)する方法
x = "123"
num = int(x) # 文字列 → 整数
pi = float("3.14") # 文字列 → 小数
s = str(456) # 整数 → 文字列
演算子の種類
算術演算子
a = 10
b = 3
print(a + b) # 足し算 → 13
print(a - b) # 引き算 → 7
print(a * b) # 掛け算 → 30
print(a / b) # 割り算(小数) → 3.333...
print(a // b) # 割り算(整数) → 3
print(a % b) # 剰余(あまり) → 1
print(a ** b) # 累乗 → 1000
比較演算子
値を比べて、結果を True または False で返す
x = 5
y = 10
print(x == y) # 等しいか → False
print(x != y) # 等しくないか → True
print(x > y) # より大きいか → False
print(x < y) # より小さいか → True
print(x >= y) # 以上か → False
print(x <= y) # 以下か → True
論理演算子
条件を組み合わせるときに使う
a = True
b = False
print(a and b) # 両方とも True → False
print(a or b) # どちらかが True → True
print(not a) # 否定 → False
文字列のフォーマット
f文字列(f-strings)
- Python 3.6以降で使える新しい書き方
- 文字列の中に直接変数や式を埋め込めるので、読みやすく書きやすい
name = "Alice"
age = 25
print(f"My name is {name}, and I am {age} years old.")
# 出力: My name is Alice, and I am 25 years old.
# 式も書ける
print(f"Next year I will be {age + 1}.")
# 出力: Next year I will be 26.
デバッグにも便利(= オプション)
x = 10
print(f"{x=}") # 出力: x=10
str.format() メソッド
- Python 2.7以降、3.x全般で使える
- プレースホルダー
{}を使って埋め込み
name = "Bob"
age = 30
print("My name is {}, and I am {} years old.".format(name, age))
# 出力: My name is Bob, and I am 30 years old.
インデックスや名前でも指定可能
# インデックス指定
print("My name is {0}, and I am {1} years old. {0} likes Python.".format(name, age))
# 名前付き引数
print("My name is {n}, and I am {a} years old.".format(n=name, a=age))
旧式(%演算子)
今のPythonでは f文字列 や .format() を使うのが主流だが、古いコードで見かける可能性あり
name = "Charlie"
age = 22
print("My name is %s, and I am %d years old." % (name, age))
%s→ 任意のオブジェクトを文字列化して表示(もっとも柔軟)%d→ 整数として表示(小数を渡すと切り捨てではなく型エラー)%f→ 浮動小数点数(小数)として表示%x/%o→ 16進数 / 8進数として表示
%d に文字列を渡すなど、指定子と型が合わない場合はエラーになる
条件分岐
基本: if / elif / else
x = 10
if x > 0:
print("positive")
elif x == 0:
print("zero")
else:
print("negative")
三項演算子(1行で条件分岐)
文法:[Trueの場合] if [条件式] else [Falseの場合]
x = 5
result = "even" if x % 2 == 0 else "odd"
print(result) # odd
Python 3.10以降: match文(パターンマッチ)
基本例
case _:は「デフォルト(switchのdefault)」に相当
status = 404
match status:
case 200:
print("OK")
case 404:
print("Not Found")
case 500:
print("Server Error")
case _:
print("Unknown")
複数条件をまとめる
match status:
case 400 | 401 | 403:
print("Client Error")
case 500 | 502 | 503:
print("Server Error")
構造の分解(Pythonらしい使い方)
リストや辞書の形に応じて分岐できる
point = (3, 4)
match point:
case (0, 0):
print("Origin")
case (x, 0):
print(f"On X axis at {x}")
case (0, y):
print(f"On Y axis at {y}")
case (x, y):
print(f"Point at ({x}, {y})")
繰り返し処理
for文
リストや文字列など「イテラブルなオブジェクト」を順番に取り出す
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# apple
# banana
# cherry
数値の繰り返しには range() が便利
for i in range(5): # 0から4まで
print(i)
while文
条件式が True の間、処理を繰り返す
count = 0
while count < 5:
print(count)
count += 1
無限ループを作る例
while True:
cmd = input(">>> ")
if cmd == "exit":
break
ループを制御: break / continue / else
break : ループを途中で抜ける(終了する)
for i in range(10):
if i == 5:
break
print(i)
# 0 1 2 3 4
continue : その回の処理をスキップする
for i in range(5):
if i == 2:
continue
print(i)
# 0 1 3 4
else(Python特有)ループが breakせずに正常終了 したときだけ実行
利用例1)値の探索。else があることで「最後まで探したけど見つからなかった」と書きやすくなる
numbers = [1, 3, 5, 7]
target = 4
for n in numbers:
if n == target:
print("見つかった")
break
else:
print("見つからなかった")
利用例2)ループ処理の成功/失敗判定。全試行失敗した場合だけ else が動く
for attempt in range(3):
print(f"試行 {attempt+1}")
if some_condition(): # 成功条件
print("成功")
break
else:
print("3回試しても失敗")
例外処理
基本構文
try:
# エラーが起きるかもしれない処理
x = int("abc")
except ValueError:
# 特定のエラーをキャッチ
print("数値に変換できませんでした")
複数の例外を捕捉
try:
x = 10 / 0
except ValueError:
print("数値エラー")
except ZeroDivisionError:
print("0で割ることはできません")
例外をまとめて捕捉
as eで例外オブジェクトを変数に受け取れる
try:
x = 10 / 0
except (ValueError, ZeroDivisionError) as e:
print("エラーが発生:", e)
else句
- 例外が発生しなかったとき に実行される
try:
x = int("100")
except ValueError:
print("変換エラー")
else:
print("成功:", x)
finally句
- 例外の有無にかかわらず必ず実行される
try:
f = open("data.txt", "r")
data = f.read()
except FileNotFoundError:
print("ファイルが見つかりません")
finally:
print("終了処理")
if 'f' in locals():
f.close()
関数の定義
普通の関数定義
def 関数名(引数): で定義
def greet(name):
return f"Hello, {name}!"
print(greet("Alice")) # Hello, Alice!
- 戻り値がなければ
returnを省略できる(暗黙にNoneが返る) - デフォルト引数や可変長引数も使える
def greet(name="Guest"):
print(f"Hello, {name}")
greet() # Hello, Guest
greet("Bob") # Hello, Bob
def add(*args): # 可変長引数
return sum(args)
print(add(1, 2, 3)) # 6
無名関数(lambda式)
JavaScriptの「アロー関数」に相当するのは、Pythonの lambda です
文法:lambda 引数: 戻り値
# 普通の関数定義
def square(x):
return x * x
# lambda式で書くと
square = lambda x: x * x
print(square(5)) # 25
lambda は関数を「その場でちょっとだけ」作りたいときに便利。代表例は map, filter, sorted などに渡す場合
nums = [1, 2, 3, 4, 5]
# 各要素を2倍にする
doubled = list(map(lambda x: x * 2, nums))
print(doubled) # [2, 4, 6, 8, 10]
# 偶数だけ抽出
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4]
# カスタムソート
words = ["apple", "banana", "cherry"]
sorted_words = sorted(words, key=lambda w: len(w))
print(sorted_words) # ['apple', 'cherry', 'banana']
クラスの定義
クラスの基本定義
selfは そのインスタンス自身 を表すキーワード(Javaのthisに相当)- インスタンス変数は
self.変数名として定義・参照する
class Person:
# コンストラクタ(インスタンス生成時に呼ばれる)
def __init__(self, name, age):
self.name = name
self.age = age
# メソッド(インスタンスに属する関数)
def greet(self):
return f"My name is {self.name}, and I am {self.age} years old."
インスタンス化して使う例
p1 = Person("Alice", 25)
print(p1.greet())
# My name is Alice, and I am 25 years old.
クラス変数とインスタンス変数
class Dog:
species = "Canine" # クラス変数(全インスタンスで共通)
def __init__(self, name):
self.name = name # インスタンス変数(個別に持つ)
d1 = Dog("Pochi")
d2 = Dog("Koro")
print(d1.species, d1.name) # Canine Pochi
print(d2.species, d2.name) # Canine Koro
継承
既存のクラスをもとに新しいクラスを作る方法
class Animal:
def speak(self):
print("Some sound")
class Cat(Animal):
def speak(self):
print("Meow!")
c = Cat()
c.speak() # Meow!
- オーバーライド: 親クラスのメソッドを子クラスで上書きできる
super()を使えば親クラスのメソッドを呼び出せる
class Dog(Animal):
def speak(self):
super().speak()
print("Woof!")
特殊メソッド(ダンダーメソッド)
__xxx__ という名前のメソッドを定義すると、クラスの挙動をカスタマイズできます。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self): # printしたときの文字列
return f"({self.x}, {self.y})"
def __add__(self, other): # + 演算子のオーバーロード
return Point(self.x + other.x, self.y + other.y)
p1 = Point(2, 3)
p2 = Point(4, 5)
print(p1) # (2, 3)
print(p1 + p2) # (6, 8)
__name__=="__main__": みたいなやつの意味
仕組み
Pythonファイルを実行すると、そのモジュールには自動的に変数 __name__ が設定される
- 直接スクリプトとして実行した場合 →
__name__ == "__main__" - モジュールとして他のファイルにインポートされた場合 →
__name__ == "ファイル名"
典型的な使い方
def main():
print("Hello from main!")
if __name__ == "__main__":
main()
- この場合、スクリプトを直接
python myscript.pyとして実行するとmain()が呼ばれる - 逆に、他のファイルから
import myscriptするとmain()は実行されない
なぜ書くのか
- 再利用性を高めるため
- ライブラリや関数だけを提供したいときに、テストコードや実行処理を勝手に走らせないようにできる
- テストやデバッグを仕込める
- モジュールを作りながら、その下に
if __name__ == "__main__":ブロックを書いておけば、単体テストとして動かせる
- モジュールを作りながら、その下に
書いた方がいい場面
- スクリプトを「直接実行する場合」と「モジュールとしてインポートする場合」の両方を想定するとき
- 小規模スクリプトだけなら必須ではないが、学習段階から癖づけておくと良い
まとめ
__name__ == "__main__"は「このファイルが直接実行されたときだけ動く部分」を書くための仕組み- 再利用性・テスト性を考えると書いた方がベター
- 実務や共有コードではほぼ標準的に書かれている
つまり「学習用スクリプトだけならなくてもよいが、実践的なコードでは書くのが推奨」という位置づけ