😄

Pythonについての最低限の基礎知識のメモ

2025/01/17に公開

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

参考

最後に

間違っていることがあればコメントに書いていただけると幸いです。
よろしくお願いいたします。

GitHubで編集を提案

Discussion