« ◆電気を船や車の動力に使うのはもったいない | トップページ | ◆ミンコフスキー図と空間の縮みと加速 »

◇pythonでのenumerate使用絶対禁止

 Pythonではenumrateは絶対使用してはならない

Pythonではindex値の欲しいfor文ではenumateを用います。
   from typing import List
   _str_list:List[str]=['a','b',c']
   for _index, _value in enumerate(_str_list,start=1):
      print(f"Index: {_index}, Value: {_value}")

これは絶対に避けなければならない最悪の方法です。

例えばPhthonでExcelを取り扱う次のようなプログラムがあったとします。

    from typing             import Tuple
    from openpyxl           import load_workbook, Workbook
    from openpyxl.cell.cell import Cell
    # ファイル名設定等の処理
    # Excelファイルを読み込む
    _wb:Workbook  = load_workbook(_input_file)
    _color:str=None
    for _ws in _wb.worksheets:
       # _ws:Worksheet
       _index:int=0
       for _row in _ws.iter_rows():
          # _row:Tuple[Cell, ...]
          _index += 1
          # _indexと_rowを使った処理
上記コードはenumerateを用いず、index値を自力でカウントアップしています。C++やJavaに於ける通常のやり方です。
このコードは問題なく動作することを確認してあります。

これをPython風のindex管理にします。

    from typing             import Tuple
    from openpyxl           import load_workbook, Workbook
    from openpyxl.cell.cell import Cell
    # ファイル名設定等の処理
    # Excelファイルを読み込む
    _wb:Workbook  = load_workbook(_input_file)
    for _ws in _wb.worksheets:
       # _ws:Worksheet
       for _index, _row in enumerate(_ws.iter_rows(),start=1):
          # _row:Tuple[Cell, ...]
          # _index:int
          # _indexと_rowを使った処理

このコードも動きます。ただし、データ量によっては、実用時間内に終了させることはできません。

同様のコードに見えますが、C++/Java風コードのfor文ではrowは一つずつ展開され処理されますが、enumerateを用いると、一旦全部展開し内部配列にしまった上で一つずつ処理する形になるためです。

問題は、このコードが「動くけど適切ではない」点です。
このようなコードがあった場合、遅延の原因を調べるのは難しくなります。

このようなコードが作られる可能性は排除されなければなりません。

通常のコードに於いてenumerateを使用する習慣がある場合、不適切な場面でも使用することは避けられません。

Pythonでのenumerateの使用は完全に禁止すべきなのです。

 補足

|

« ◆電気を船や車の動力に使うのはもったいない | トップページ | ◆ミンコフスキー図と空間の縮みと加速 »