Pythonについての最低限の基礎知識のメモ
Pythonについての最低限の基礎知識のメモ
ざっと基礎について学んでみました。必要最低限のみ書いたメモです。
変数
変数宣言
-
変数名 = 値
で変数を宣言できる - 変数は再定義可能
変数の命名規則
以下の4つがよく使用される
- THIS_IS_VARIABLE(大文字・大文字スネークケース)
- this_is_variable(小文字・小文字スネークケース)
- PascalCase(パスカルケース)
- camelCase(キャメルケース)
year: int = 2025
message: str = "Hello World"
print(year)
# 2025
year: int = 2026
print(year)
# 2026
データ型
型の分類
分類 | 型 | 内容 |
---|---|---|
数値型 | int | 整数 |
^ | float | 小数 |
^ | complex | 複素数 |
シーケンス型 | list | リスト(配列?) |
^ | turple | タプル |
^ | range | 範囲 |
論理型 | bool | 真偽値 |
テキストシーケンス型 | str | 文字列 |
バイトシーケンス型 | byte | ASCII文字列 |
集合型 | set | 集合 |
辞書型 | dict | 辞書(連想配列) |
クラス | class | クラス |
型ヒント
- 型宣言ぽいことができる
- Pythonは動的型付けと聞いたことがあるので、TypeScriptよりは緩めなのかも?
name: str = "Mitate Gengaku"
age: int = 42
bodyHeight: float = 165.2
availableLanguages: list[str] = ["jp"]
myTechSkills: dict[str, list[str]] = {
"language": ["js", "php"],
"library": ["React", "React Flow"],
"framework": ["Next.js","Laravel"]
}
amIHuman: bool = False
文字列
# 変数定義
name: str = "Mitate Gengaku"
変換
- 数値型から文字列への変換は組み込み関数
str
を使用する - 大文字への変換は
upper
メソッド - 小文字への変換は
lower
メソッド
strAge = str(age)
print(strAge)
# '42'
print(name.lower())
# mitate gengaku
print(name.upper())
# MITATE GENGAKU
文字列の長さ
組み込み関数len
を使用する
print(len(str))
# 14
複数行の文字列
どちらのトリプルクオートを使用する
- '''
- """
print("""
Good Monring
""")
#
# Good Monring
#
インデックス・スライス
- インデックスを指定すると1文字取得できる
- 文字列の部分文字列を取得するときは、スライスを使用する
print(name[0])
# M
print(name[0:5])
# Mitat
結合
- +は順番に連結していく
- joinメソッドはリスト・タプルの連結
print(name + ", " + "Good Morning")
print(",".join([name, "Good Morning"]))
比較
-
==
演算子で文字列が等しいか比較できる -
!=
演算子は等しくない場合 -
>
・<
演算子でUnicodeの順番を判定できる
print(name == "Mitate Gengaku")
# True
埋め込み
- print(%演算子を使用)
- format
print('%s, %s' % (name, name))
print('{0}, {1}'.format(name, name))
# Mitate Gengaku, Mitate Gengaku
検索・存在チェック
- 検索には
find
。 - 含まれるかどうかは
in
その他にnot in
などもある
find
は見つかった場合はその見つかったインデックスを、見つからなかった場合は-1
を返す
print(name.find("Mitate"))
# 0
print(te in name)
# True
文字列の置き換え
-
replace
メソッドで対象文字列を新しい文字列に変換することができる - このとき、新しい文字列が返ってくるだけで、もとの文字列(name)は変化しない
print(name.replace("Mitate ", ""))
# Gengaku
条件分岐
- 基本的な
if else
if (True):
print ("Hello World")
elif (True):
print ("Hello World")
else:
print("Hello World2")
3項演算子
TypeScriptの3項演算子の方がスマートで理解しやすい
print("Hello" if age == 1 else "Good")
# Hello
ループ処理
- for
blocks = ["h1", "h2", "h3", "a", "header", "footer"]
for block in blocks:
print(block)
print("-----")
for i in range(len(blocks)):
print(blocks[i])
- while
import time
while True:
print("Hello World")
time.sleep(1)
関数
関数
処理をまとめた再利用可能なコード
def echo_helloworld() -> None:
"""
Hello Worldをprintする
:return: None
"""
print("Hello World")
echo_helloworld()
# Hello World
引数
関数に渡される値
def echo(message: str) -> None:
"""
引数に渡された文字列をprintする関数
:param message: str 出力される文字列
:return: None
"""
print(message)
echo("Good Morning")
# Good Morning
複数の引数
- ,(カンマ)で区切る
def calculate(int1: int, int2: int) -> int:
"""
引数に渡された2つの整数を計算する関数
:param int1: int
:param int2: int
:return: int 計算結果
"""
return int1 + int2
print(calculate(1, 7))
# 8
デフォルト値
- 引数にはデフォルト値を設定できる。
- 設定されている場合、引数が渡されていない場合は、デフォルト値が使われることになる。
def initial_value(name = "Mitate Gengaku", message = "Good Morning.") -> str:
"""
引数に渡された2つの文字列を結合する関数
:param name: str 名前
:param message: str メッセージ
:return: str 結合された文字列
"""
return message + " " + name
print(initial_value())
# Good Morning. Mitate Gengaku
可変長引数
- 任意の個数の引数を受け取ることができる
def calculate_int_list(*args: tuple[int]) -> int:
"""
整数型の可変長引数計算する関数
:param args: tuple[int] 可変長引数
:return: int 計算結果
"""
return sum(args)
print(calculate_int_list(1, 4, 5))
# 10
print(calculate_int_list(1, 4, 5, 5))
# 15
複数の返り値がある
-
x, y
みたいに2次元計算とかに利用できると便利そう。
def calculate_square_side(area: int | float) -> tuple[float, float]:
"""
正方形の面積から一辺の長さを計算する関数
:param area: int | float 正方形の面積
:return: tuple[float, float] 正方形の一辺の長さ
"""
side_length = math.sqrt(area)
return side_length, side_length
base, height = calculate_square_side(36)
print(base, height)
# 6.0 6.0
lambda
- 無名関数
-
def
を使うまでもないような場面?で使用
※Callable
Callable[[引数の型1, 引数の型2, ...], 戻り値の型]
で型ヒントをつけることができる
lambda_variable: Callable[[int], int] = lambda i: i * 2
print(lambda_variable(2))
# 4
例外処理
- try - 例外が発生する可能性があるコードをブロック内に記述
- except - 例外が発生した場合の処理を記述
- else - 例外が発生しなかった場合の処理を記述
- finally - 例外の発生有無に関わらず必ず実行する処理を記述
as e
とすることで変数に例外オブジェクトを格納することができる。
また基底クラスを指定しても例外をキャッチすることができる
try:
result = 10 / 0
except ZeroDivisionError as e:
print("0で割ることはできません")
print(e)
except AnyError as e:
print("異なる例外処理を記述することができます")
except (FirstError, SecondError) as e:
print("複数の例外をしょりすることができます")
else:
print("計算が正常に完了しました")
finally:
print("処理が完了しました")
クラス
定義
class クラス名
と宣言する
コンストラクタ
インスタンスの初期化処理を行う。init
の名前のメソッドで定義されている
class UserClass:
"""
ユーザーのプロフィール情報についてのクラス
"""
def __init__(self, name: str) -> None:
self.name = name
def print_user_name(self) -> str:
return self.name
user = UserClass("Mitate Gengaku")
print(user.print_user_name())
# Mitate Gengaku
クラス変数
インスタンス化した際に参照することができる共通変数
- 共通初期値
- 静的な値
出身国や性別などの変更することがない値に使用するのが良いのかもしれない。
class UserClass:
"""
ユーザーのプロフィール情報についてのクラス
"""
country = "Japan"
メソッド
クラスに属する関数
インスタンスメソッド
def
で定義。
第一引数にself
をとる。
インスタンスの状態にアクセス。
クラスメソッド
@classmethod
デコレータで定義。
第一引数にcls
をとる。
クラス変数にアクセス。
スタティックメソッド
@staticmethod
デコレータで定義。
第一引数に特別なものは必要ない。
ある関数をルール上、クラスに属させるときとかに使用する。
class UserClass:
"""
ユーザーのプロフィール情報についてのクラス
"""
country = "Japan"
def __init__(self, name: str) -> None:
self.name = name
def print_user_name(self) -> str:
return self.name
@classmethod
def user_class_method(cls) -> str:
return cls.country
@staticmethod
def user_static_method() -> None:
pass
user = UserClass("Mitate Gengaku")
print(user.print_user_name())
print(UserClass.user_class_method())
継承
基底クラスの属性やメソッドを派生クラスに引き継ぐこと。
オーバーライド
派生クラスで基底クラスと同じ名前を再定義すると、基底クラスのメソッドをオーバーライドできる。
多重継承する場合は
class UserClass(BaseUserClass, クラス名1, ...):
とカンマで区切る
super
親クラスのメソッドを呼び出す
class BaseUserClass:
country = "Japan"
def __init__(self, name: str) -> None:
self.name = name
class UserClass(BaseUserClass):
"""
ユーザーのプロフィール情報についてのクラス
"""
def __init__(self, name) -> None:
super().__init__(name)
def get_user_name(self):
"""
ユーザーネームを取得するクラスメソッド
:return str ユーザーネーム
"""
return self.name
user = UserClass("Mitate Gengaku")
print(user.get_user_name())
ポリモーフィズム
ポリモーフィズム(多態性)とは、同じインターフェースや名前を持つメソッドが、異なるクラスや型で異なる動作をすることを可能にする性質
class BaseUserClass:
country = "Japan"
def __init__(self, name: str) -> None:
self.name = name
def get_user_name(self) -> str:
"""
ユーザーネームを取得するクラスメソッド
:return str ユーザーネーム
"""
return self.name
class UserClass(BaseUserClass):
"""
ユーザーのプロフィール情報についてのクラス
"""
def __init__(self, name) -> None:
super().__init__(name)
def get_user_name(self) -> str:
"""
ユーザーネームを取得するクラスメソッド
:return str ユーザーネーム
"""
return f"こんにちは。 {self.name}さん"
class AdminUserClass(BaseUserClass):
"""
管理者ユーザーのプロフィール情報についてのクラス
"""
def __init__(self, name) -> None:
super().__init__(name)
def get_user_name(self) -> str:
"""
管理者ユーザーネームを取得するクラスメソッド
:return str 管理者ユーザーネーム
"""
return self.name
user = UserClass("Mitate Gengaku")
admin = AdminUserClass("Admin")
print(user.get_user_name())
# こんにちは。 Mitate Gengakuさん
print(admin.get_user_name())
# Admin
カプセル化
クラスの内部データを隠蔽し、外部からの直接アクセスを制限すること
@property
デコレーターで属性へのアクセスを制御。
@property名.setter
デコレータでセッターメソッドを定義。
class UserClass:
country = "Japan"
def __init__(self, name: str, role: str) -> None:
self.name = name
self.__role = role
def get_profile(self) -> str:
return f"{self.name}のロールは{self.__role}です。"
@property
def role(self) -> str:
return self.__role
@role.setter
def set_role(self, role: str) -> None:
self.__role = role
user = UserClass("Mitate Gengaku", "hobby")
print(user.get_profile())
# Mitate Gengakuのロールはhobbyです。
print(user.__role)
# AttributeError: 'UserClass' object has no attribute '__role'. Did you mean: 'role'?
print(user.role)
# hobby
user.set_role = "admin"
print(user.get_profile())
# Mitate Gengakuのロールはadminです。
抽象クラスとインターフェース
継承されることを前提としたクラス。空メソッドが定義されているのが特徴。必ずオーバーライドしなければいけない。
メソッドにはpass
またはraise NotImplementedError()
と記述。
抽象メソッドをオーバーライドしないとこういうエラーが出る。
TypeError: Can't instantiate abstract class UserClass without an implementation for abstract method 'メソッド名'
class BaseUserClass(ABC):
country = "Japan"
def __init__(self, name: str) -> None:
self.name = name
@abstractmethod
def print_user_name(self) -> str:
pass
class UserClass(BaseUserClass):
def __init__(self, name: str) -> None:
super().__init__(name)
def print_user_name(self) -> str:
return self.name
user = UserClass("Mitate Gengaku")
print(user.print_user_name())
# Mitate Gengaku
参考
最後に
間違っていることがあればコメントに書いていただけると幸いです。
よろしくお願いいたします。
Discussion