Heim  >  Artikel  >  Backend-Entwicklung  >  Herausforderung: Alternativen zur Implementierung von Schleifen in Python

Herausforderung: Alternativen zur Implementierung von Schleifen in Python

WBOY
WBOYnach vorne
2023-05-07 09:28:071109Durchsuche

挑战不再写Python for 循环

Es ist schon eine Weile her, seit ich angefangen habe, die erstaunlichen Sprachfunktionen in Python zu erkunden. Am Anfang stellte ich mich einer Herausforderung mit dem Ziel, mehr Funktionen der Python-Sprache zu üben, als ich mit anderen Programmiersprachen Programmiererfahrung gehabt hätte. Das macht die Sache immer interessanter! Der Code wird immer prägnanter und der Code sieht strukturierter und standardisierter aus. Ich werde diese Vorteile im Folgenden beschreiben.

Die for-Schleife wird normalerweise in den folgenden Verwendungsszenarien verwendet:

  • Um einige Informationen in einer Sequenz zu extrahieren.
  • Generieren Sie eine Sequenz aus einer anderen.
  • Für mich zu schreiben ist zur Gewohnheit geworden.

Glücklicherweise verfügt Python bereits über viele Tools, die Ihnen dabei helfen. Sie müssen nur Ihre Meinung ändern und aus einer anderen Perspektive darüber nachdenken.

Welche Vorteile haben Sie, wenn Sie das Schreiben von for-Schleifen vermeiden:

  • Weniger Code
  • Bessere Lesbarkeit des Codes
  • Weniger Einrückungen (macht für Python immer noch Sinn)

Werfen wir einen Blick auf die Codestruktur unten:

# 1
with ...:
 for ...:
 if ...:
 try:
 except:
 else:

In diesem Beispiel haben wir es mit mehreren Ebenen verschachtelten Codes zu tun, der schwer zu lesen ist. In diesem Beispiel werden mehrere Ebenen verschachtelten Codes verwendet. Was ich in diesem Code gefunden habe, war die wahllose Verwendung von Einrückungen, um Verwaltungslogik (mit, Try-Except) und Geschäftslogik (für, wenn) zu vermischen. Wenn Sie sich an die Konvention halten, Einrückungen nur für Verwaltungslogik zu verwenden, sollte die Kerngeschäftslogik sofort entfernt werden.

  • „Flache Strukturen sind besser als verschachtelte Strukturen“ – The Zen of Python

Sie können vorhandene Tools verwenden, um die for-Schleife zu ersetzen

1. Listenverständnis / Generatorausdruck

Schauen wir uns ein einfaches Beispiel an. Wenn Sie ein Array in ein anderes konvertieren möchten:

result = []
for item in item_list:
 new_item = do_something_with(item)
 result.append(item)

Wenn Sie MapReduce mögen, können Sie auch Map oder List Comprehension in Python verwenden:

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

Ähnlich, wenn Sie Wenn Sie nur die Elemente von

im Array durchlaufen möchten, können Sie auch denselben Code-Generatorausdruck verwenden.

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

2. Funktion

Wenn Sie ein Array einem anderen Array zuordnen möchten, rufen Sie einfach die Map-Funktion auf, um dieses Problem auf eine fortgeschrittenere und praktischere Programmiermethode zu lösen.

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

Wenn Sie eine Sequenz auf eine einzelne reduzieren möchten, verwenden Sie Reduce

from functools import reduce
summation = reduce(lambda x, y: x + y, numbers)

Außerdem verwenden viele in Python integrierte Funktionen iterables:

>>> 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. Funktionen oder Generatoren extrahieren

Die beiden oben genannten Methoden sind einfacher zu handhaben Logik. Wie wäre es mit komplexerer Logik? Als Programmierer schreiben wir Funktionen, um komplexe Geschäfte zu abstrahieren. Die gleiche Idee gilt hier. Wenn Sie so geschrieben haben:

results = []
for item in item_list:
 # setups
 # condition
 # processing
 # calculation
 results.append(result)

Offensichtlich fügen Sie einem Codeblock zu viel Verantwortung hinzu. Stattdessen schlage ich vor, dass Sie Folgendes tun:

def process_item(item):
 # setups
 # condition
 # processing
 # calculation
 return result
results = [process_item(item) for item in item_list]

Was passiert, wenn Sie zu einer verschachtelten Funktion wechseln

results = []
for i in range(10):
 for j in range(i):
 results.append((i, j))

Wechseln Sie zu List Comprehension und die Implementierung sieht folgendermaßen aus:

results = [(i, j)
for i in range(10)
for j in range(i)]

Wenn Ihr Codeblock einen internen Status aufzeichnen muss

# 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]

Wir verwenden Generator Um dies zu erreichen:

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))
  • Leser fragen sich vielleicht: „Warten Sie! Sie haben eine for-Schleife im Generator verwendet, Betrug! Keine Sorge, schauen Sie sich den folgenden Code noch einmal an.

Schreiben Sie ihn nicht selbst. itertools wird es tun.“ Ich glaube, dass die Implementierung dieses Moduls in den meisten Szenarien Ihre ursprüngliche for-Schleife ersetzen kann. Das letzte Beispiel kann beispielsweise wie folgt umgeschrieben werden:

from itertools import accumulate
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
resutls = list(accumulate(a, max))

Wenn Sie außerdem die kombinierte Sequenz wiederholen möchten Sie müssen Produkt(), Permutationen() und Kombinationen() verwenden.

Fazit

In den meisten Fällen müssen Sie keine For-Schleifen schreiben
  • Sie sollten das Schreiben von For-Schleifen vermeiden, da dies den Code besser lesbar macht . Sex

Das obige ist der detaillierte Inhalt vonHerausforderung: Alternativen zur Implementierung von Schleifen in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen