この記事では主に Python での for ループ の使用に関するいくつかの考えを紹介します。必要な友人はそれを参照してください
なぜコード内に for ループを書かないことに挑戦する必要があるのでしょうか?これにより、より高度で本格的な構文またはライブラリを使用する必要が生じるためです。この記事では、例として Python を使用して、誰もが他の人のコードで見たことはあっても、自分ではほとんど使用しない多くの構文について説明します。
これは挑戦です。いかなる状況でも for ループの記述は避けてください。同様に、for ループを使用する以外の方法で書くのが難しすぎるシナリオも見つけてほしいと思います。発見したことをぜひ共有してください。ぜひ聞きたいです
素晴らしい Python 言語機能を探索し始めてからしばらく時間が経ちました。最初は、他の プログラミング言語 から学んだものの代わりに、より多くの言語機能を使用して練習するという、私自身への単なる挑戦でした。しかし、物事は徐々に面白くなっていきます!コードが短くてきれいになるだけでなく、より構造化され、規則的に見えるようになります。これらの利点については、この記事で詳しく説明します。
まず、一歩下がって、for ループを作成する背後にある直感を見てみましょう:
1. シーケンスを走査して情報を抽出します
2. 現在のシーケンスから別のシーケンスを生成します
3.私はプログラマーなので、ループは自然なものです
幸いなことに、Python にはこれらの目標を達成するのに役立つ優れたツールがすでにあります。必要なのは、考え方を変えて、別の視点から物事を見ることだけです。
どこでも for ループを書かないことで何が得られますか
1. コードの行数が減ります
2. コードの読みやすさが向上します
以下のコードのスケルトンを見てみましょう:
以下のコードの構造:
# 1 with ...: for ...: if ...: try: except: else:
for ループを回避するには、次のツールを使用できます
1. リスト内包表記/
ジェネレーター式 簡単な例を参照してください。 、この例は主に既存のシーケンスに基づいて新しいシーケンスをコンパイルします:
result = [] for item in item_list: new_item = do_something_with(item) result.append(item)
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))
さて、賢い皆さん、試してみてください。」これです。
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))
2. コードが読みやすくなるために、for ループの使用は避けるべきです。
アクション
1. コードをもう一度見て、以前に直感的に for ループを記述した箇所を見つけて、for ループを使用せずに再度記述することが意味があるかどうかをもう一度考えます。
2. for ループを使用しないことが困難だった例を共有します。
以上がPythonのforループ例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。