1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

float('inf')を使うと型ヒントで怒られる問題

Last updated at Posted at 2021-04-04

例:最大値を求める関数

Pythonで整数のリストの最大値を求める関数を自作する場合を考えてみる。

これまでの最大値とリストの各整数を比較し、最大値より大きい場合は最大値を更新する関数を作成すればよいわけだが、型ヒントを使う場合、最大値の初期値が問題になってくる。

最大値を0と置く方法

my_max.py
def my_max(nums: List[int]) -> int:
    mx: int = 0
    for num in nums:
        if num > mx:
            mx = num
    return mx

リストがすべて負の数からなっていた場合、0が返ってきてしまうという問題がある。

sys.maxsizeを使う方法

my_max2.py
def my_max2(nums: List[int]) -> Optional[int]:
    mx: int = -sys.maxsize - 1
    for num in nums:
        if num > mx:
            mx = num
    return mx

sys.maxsizeはPy_ssize_t型の変数が取りうる最大値を示す整数1であって無限大ではないため、メモリの許す限りより大きな数が存在してしまうという問題がある。

最大値をfloat('inf')math.infと置く方法

my_max3.py
def my_max3(nums: List[int]) -> int:
    mx: int = float('-inf')  # mx: int = -math.inf でも同じ
    for num in nums:
        if num > mx:
            mx = num
    return mx

整数int型に浮動小数点float型を代入することができないため、Pylanceやmypyの型チェックでエラーになる。

Union型を使う方法

my_max4.py
def my_max4(nums: List[int]) -> Union[int, float]:
    mx: Union[int, float] = float('-inf')
    for num in nums:
        if num > mx:
            mx = num
    return mx

浮動小数点float型を許容してしまうという問題がある。

Optional型を使う方法

my_max5.py
def my_max5(nums: List[int]) -> Optional[int]:
    mx: Optional[int] = None
    for num in nums:
        if not mx or num > mx:
            mx = num
    return mx

None型を許容してしまうという問題と条件式がやや長くなるという問題がある。

  1. https://docs.python.org/ja/3/library/sys.html#sys.maxsize

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?