Pythonのforループ例を詳しく解説

零下一度
リリース: 2017-07-02 11:07:48
オリジナル
2211 人が閲覧しました

この記事では主に Python での for ループ の使用に関するいくつかの考えを紹介します。必要な友人はそれを参照してください

なぜコード内に for ループを書かないことに挑戦する必要があるのでしょうか?これにより、より高度で本格的な構文またはライブラリを使用する必要が生じるためです。この記事では、例として Python を使用して、誰もが他の人のコードで見たことはあっても、自分ではほとんど使用しない多くの構文について説明します。

これは挑戦です。いかなる状況でも for ループの記述は避けてください。同様に、for ループを使用する以外の方法で書くのが難しすぎるシナリオも見つけてほしいと思います。発見したことをぜひ共有してください。ぜひ聞きたいです

素晴らしい Python 言語機能を探索し始めてからしばらく時間が経ちました。最初は、他の プログラミング言語 から学んだものの代わりに、より多くの言語機能を使用して練習するという、私自身への単なる挑戦でした。しかし、物事は徐々に面白くなっていきます!コードが短くてきれいになるだけでなく、より構造化され、規則的に見えるようになります。これらの利点については、この記事で詳しく説明します。

まず、一歩下がって、for ループを作成する背後にある直感を見てみましょう:

1. シーケンスを走査して情報を抽出します

2. 現在のシーケンスから別のシーケンスを生成します

3.私はプログラマーなので、ループは自然なものです

幸いなことに、Python にはこれらの目標を達成するのに役立つ優れたツールがすでにあります。必要なのは、考え方を変えて、別の視点から物事を見ることだけです。

どこでも for ループを書かないことで何が得られますか

1. コードの行数が減ります

2. コードの読みやすさが向上します

以下のコードのスケルトンを見てみましょう:

以下のコードの構造:

# 1
with ...:
  for ...:
    if ...:
      try:
      except:
    else:
ログイン後にコピー

この例では、複数のレベルのネストされたコードが使用されており、非常に読みにくいです。このコードで私が発見したのは、管理ロジック (with、try-excel) とビジネス ロジック (for、if) を混合するためにインデントが無差別に使用されていることです。管理ロジックにのみインデントを使用するという規則に従う場合は、コアのビジネス ロジックをすぐに取り出す必要があります。

「ネストされた構造よりもフラット構造の方が優れています」 - 「Zen of Python」

for ループを回避するには、次のツールを使用できます

1. リスト内包表記/

ジェネレーター

簡単な例を参照してください。 、この例は主に既存のシーケンスに基づいて新しいシーケンスをコンパイルします:

result = []
for item in item_list:
  new_item = do_something_with(item)
  result.append(item)
ログイン後にコピー

MapReduce が好きなら、map または Python のリスト分析を使用できます:

result = [do_something_with(item) for item in item_list]

同様に、反復子を取得したいだけの場合は、ほぼ同じ構文のジェネレーター式を使用できます。 (Python の一貫性を気に入らないわけがありません。) result = [do_something_with(item) for item in item_list]

同样的,如果你只是想要获取一个迭代器,你可以使用语法几乎相通的生成器表达式。(你怎么能不爱上Python的一致性?)

result = (do_something_with(item) for item in item_list)

2. 函数

站在更高阶、更函数化的变成方式考虑一下,如果你想映射一个序列到另一个序列,直接调用map函数。(也可用列表解析来替代。)

doubled_list = map(lambda x: x * 2, old_list)

result = (do_something_with(item) for item_list)

2. 関数


は高位にあり、より機能的です。このように考えてください。あるシーケンスを別のシーケンスにマップする場合は、map 関数を直接呼び出します。 (代わりにリスト内包表記も使用できます。)

doubled_list = map(lambda x: x * 2, old_list)

シーケンスを 1 つの要素に削減したい場合は、reduce を使用します

from functools import reduce
summation = reduce(lambda x, y: x + y, numbers)
ログイン後にコピー

また、Python の多くの組み込み関数は消費することができます (これが良いことなのか悪いことなのかはわかりませんが、どれかを選択するのはあなたです。この文を追加しないと理解するのは少し難しいです) iterators:


>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> all(a)
False
>>> any(a)
True
>>> max(a)
9
>>> min(a)
0
>>> list(filter(bool, a))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> set(a)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> dict(zip(a,a))
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
>>> sorted(a, reverse=True)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> str(a)
'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> sum(a)
45
ログイン後にコピー

3. 抽出関数 Or 式

上記の 2 つのメソッドは、より単純なロジックを非常にうまく処理しますが、より複雑なロジックについてはどうなるでしょうか?私たちはプログラマーとして、難しいことを関数に抽象化しますが、このアプローチはここでも使用できます。このようなコードを書くと:

results = []
for item in item_list:
  # setups
  # condition
  # processing
  # calculation
  results.append(result)
ログイン後にコピー

明らかに、コードに過剰な責任を与えていることになります。改善するには、次のようにすることをお勧めします:

def process_item(item):
  # setups
  # condition
  # processing
  # calculation
  return result

results = [process_item(item) for item in item_list]
ログイン後にコピー

ネストされた for ループはどうですか?

results = []
for i in range(10):
  for j in range(i):
    results.append((i, j))
ログイン後にコピー

リスト内包表記は次のような場合に役立ちます:

results = [(i, j)
      for i in range(10)
      for j in range(i)]
ログイン後にコピー

多くの内部状態を保存したい場合はどうすればよいでしょうか?

# finding the max prior to the current item
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
results = []
current_max = 0
for i in a:
  current_max = max(i, current_max)
  results.append(current_max)

# results = [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
ログイン後にコピー

これらを実装するための式を抽出しましょう:

def max_generator(numbers):
  current_max = 0
  for i in numbers:
    current_max = max(i, current_max)
    yield current_max

a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
results = list(max_generator(a))
ログイン後にコピー

「待って、その関数の式で for ループを使用しただけです。それは不正行為です


さて、賢い皆さん、試してみてください。」これです。

4. for ループを自分で書かないでください。itertools が代わりにやってくれます

このモジュールは本当に素晴らしいです。 for ループを書きたい場合の 80% はこのモジュールでカバーできると思います。たとえば、前の例は次のように書き換えることができます:

from itertools import accumulate
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
resutls = list(accumulate(a, max))
ログイン後にコピー

さらに、一連の組み合わせを反復する場合は、product()、permutations()、およびcombinations()を使用できます。 🎜🎜🎜結論🎜🎜🎜1. ほとんどの場合、for ループを記述する必要はありません。 🎜

2. コードが読みやすくなるために、for ループの使用は避けるべきです。

アクション

1. コードをもう一度見て、以前に直感的に for ループを記述した箇所を見つけて、for ループを使用せずに再度記述することが意味があるかどうかをもう一度考えます。

2. for ループを使用しないことが困難だった例を共有します。

以上がPythonのforループ例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート