Python でループを書く技術





ループ for



は、ほとんどのプログラミング言語で最も基本的な制御フロー ツールです。たとえば、単純なfor



Cループ は次のようになります。



int i;
for (i=0;i<N;i++)
{
  //do something
}
      
      





for



Cループを書くのにこれ以上良い方法はありません . 複雑なケースでは、通常、醜いネストされたループを書くか、多くの補助変数を設定する必要があります ( i



上のコードのように)。



幸いなことに、Python の方が便利です。この言語には、私たちの生活を楽にするより優雅なループを書くための多くのトリックがあります。Python では、ネストされたループと補助変数を避けることができ、ループを自分でカスタマイズすることもできます for







この記事では、最も有用な Python ループ トリックについて説明します。この言語の美しさを体験するのに役立つことを願っています。



値とインデックスを同時に取得



ループを使用する一般的な例は for



、リストからインデックスと値を取得することです。Python の学習を始めたとき、私は次のようにコードを書きました。



for i in range(len(my_list)):
    print(i, my_list[i])
      
      





もちろん、うまくいきました。しかし、これは Python スタイルのソリューションではありません。数か月後、私は標準の Python スタイルの実装を学びました。



for i, v in enumerate(my_list):
    print(i, v)
      
      





ご覧のとおり、組み込み関数 enumerate



は私たちの生活を楽にしてくれます。



Product 関数でネストされたループを回避する方法



ネストされたループは本当に頭痛の種です。それらはコードの可読性を低下させ、理解を難しくする可能性があります。たとえば、 ネストされたループを中断することは、通常、実装が容易はありません。最も内側のループが中断された場所、2 番目に高い内側のループなどを知る必要があります。



幸いなことに、Python には素晴らしいproduct



組み込み 関数があります itertools



。これを使用して、ネストされたループを多数書くことを避けることができます。



簡単な例でそれがどれほど役立つか見てみましょう:



list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]

for a in list_a:
    for b in list_b:
        for c in list_c:
            if a + b + c == 2077:
                print(a, b, c)
# 70 2000 7
      
      





ご覧のとおり、3 つのリストから 3 つの数値を取得するには 3 つのネストされたループが必要であり、その合計は 2077 です。コードはあまりきれいではありません。



では、関数を使ってみましょう product







from itertools import product

list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]

for a, b, c in product(list_a, list_b, list_c):
    if a + b + c == 2077:
        print(a, b, c)
# 70 2000 7
      
      





ご覧のとおり、関数を使用したおかげで、 product



1 サイクルだけで十分です。



この関数 product



は入力反復可能データの直接の積を生成するため、多くの場合、ネストされたループを回避できます。



Itertools モジュールを使用して適切なループを作成する



実際、関数 product



は氷山の一角に過ぎません。組み込みの Python モジュール を学ぶ itertools



と、まったく新しい世界があなたの前に開きます。このツールボックスには、ループのニーズに対応するための便利なメソッドが多数含まれています。それらの完全なリストは 公式ドキュメントにありますいくつかの例を見てみましょう。



無限ループの作り方



無限ループを作成するには、少なくとも 3 つの方法があります。



1. 関数を使用する count



:



natural_num = itertools.count(1)
for n in natural_num:
    print(n)
# 1,2,3,...
      
      





2. 機能 cycle



:



many_yang = itertools.cycle('Yang')
for y in many_yang:
    print(y)
# 'Y','a','n','g','Y','a','n','g',...
      
      





3. 関数を通して repeat



:



many_yang = itertools.repeat('Yang')
for y in many_yang:
    print(y)
# 'Yang','Yang',...
      
      





複数のイテレータを 1 つに結合する



この関数を chain()



使用すると、複数のイテレータを 1 つに結合できます



from itertools import chain

list_a = [1, 22]
list_b = [7, 20]
list_c = [3, 70]

for i in chain(list_a, list_b, list_c):
    print(i)
# 1,22,7,20,3,70
      
      





隣接する重複要素を選択



この関数は groupby



、イテレータ内の隣接する重複要素を選択して結合するために使用されます。



from itertools import groupby

for key, group in groupby('YAaANNGGG'):
    print(key, list(group))
# Y ['Y']
# A ['A']
# a ['a']
# A ['A']
# N ['N', 'N']
# G ['G', 'G', 'G']
      
      





上に示すように、隣接する類似のシンボルは互いに接続されます。さらに、groupby



2 つの要素の同一性を決定する方法を関数に伝えることができます



from itertools import groupby

for key, group in groupby('YAaANNGGG', lambda x: x.upper()):
    print(key, list(group))
# Y ['Y']
# A ['A', 'a', 'A']
# N ['N', 'N']
# G ['G', 'G', 'G']
      
      





サイクルのカスタマイズ



上記の例を確認した後、for



Pythonループが非常に柔軟で優雅である理由を考えてみましょう 。私が理解している限り、これはループ反復子でfor



関数を使用できるため です。上記のすべての例で、イテレータは特別な関数を使用しているだけです。すべてのトリックは同じパターンです。



for x in function(iterator)
      
      





組み込みモジュール自体 itertools



は、最も一般的な関数のみを実装しています。関数を忘れた場合、または必要な関数が見つからない場合は、自分で作成するだけです。より正確には、これらの関数は ジェネレーターです。そのため、それらを使用して無限ループを生成できます。



基本的に、for



カスタム ジェネレーターの場合と同様に、ループカスタマイズできます



簡単な例を見てみましょう:



def even_only(num):
    for i in num:
        if i % 2 == 0:
            yield i


my_list = [1, 9, 3, 4, 2, 5]
for n in even_only(my_list):
    print(n)
# 4
# 2
      
      





上記の例からわかるように、 というジェネレーターを定義しました even_only



このジェネレーターを for ループで使用すると、反復はリストの偶数に対してのみ発生します。



もちろん、この例は説明のためだけのものです。リスト ビューを使用するなど、同じことを行う他の方法があり ます



my_list = [1, 9, 3, 4, 2, 5]
for n in (i for i in my_list if not i % 2):
    print(n)
# 4
# 2
      
      





出力



Python でループを作成するタスクは、非常に柔軟かつ適切に解決できます。便利でシンプルなループを書くために、組み込みのツールを使用するか、ジェネレーターを自分で定義することもできます。






広告



信頼できるレンタル サーバー。数クリックで独自の構成を作成し、1 分で作業を開始できます。すべてがスムーズに動作し、非常に高い稼働率で動作します! テレグラム チャットに



参加して ください






All Articles