Heim  >  Artikel  >  Backend-Entwicklung  >  Einige erweiterte Funktionen von Python

Einige erweiterte Funktionen von Python

高洛峰
高洛峰Original
2017-02-15 14:45:29936Durchsuche

Vorwort

Ich benutze Python seit fast einem halben Jahr. Ich habe letztes Jahr in den Sommerferien angefangen, damit in Kontakt zu kommen. Von der anfänglichen Verwirrung über das Schreiben einiger kleiner Crawler bis hin zum Einstieg. Viele Aufgaben können mit Python erledigt werden. Grundsätzlich wird Python verwendet. Aber ich bin immer noch etwas zu ungeduldig, aber ich kenne viele Funktionen von Python nicht oder habe sie vergessen. Ich werde zum Tutorial von Liao Da zurückkehren und die Dinge aufzeichnen, die ich denke sind wichtiger.

Start

In diesem Artikel wird hauptsächlich der Inhalt des Abschnitts „Erweiterte Funktionen“ von Liao Da’s Tutorial aufgezeichnet und einige meiner Erkenntnisse niedergeschrieben. Meiner Meinung nach sind diese Funktionen sehr pythonisch und sehr umfangreich, wenn sie im Code verwendet werden~

List Comprehensions (List Comprehensions)

Ich werde hier nicht über Slicing und Iteration sprechen Schauen wir uns zunächst die Listengenerierung an. Anhand des Namens können Sie ungefähr erraten, dass es sich hierbei um einige Methoden zum Generieren von Listen handelt, z. B.: Wie generiert man [1*1, 2*2, ... ,10*10]? Sie können eine Schleife verwenden, um fortlaufend Elemente am Ende der Liste hinzuzufügen. Wenn Sie die Python-Methode, also die Listengenerierungsformel, verwenden, lautet sie:

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

, auf die auch folgen kann ein if-Urteil, zum Beispiel:

>>> [x * x for x in range(1, 11) if x%2==0]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Auf diese Weise müssen Sie ursprünglich eine Schleife verwenden, um 4 oder 5 Zeilen Code zu schreiben, aber Sie können es mit einer Zeile lösen, was intuitiv und klar ist .

Sie können auch zwei for-Schleifen verwenden, um die vollständige Permutation zu generieren:

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

Wie fügt man auf diese Weise eine if-Beurteilung hinzu? Sie können es nach jeder for-Anweisung oder am Ende hinzufügen:

>>> [m + n for m in 'ABC' if m < &#39;C&#39; for n in &#39;XYZ&#39; if n < &#39;Z&#39;]
[&#39;AX&#39;, &#39;AY&#39;, &#39;BX&#39;, &#39;BY&#39;]
>>> [m + n for m in 'ABC' for n in 'XYZ' if n < &#39;Z&#39; and m < &#39;C&#39;]
[&#39;AX&#39;, &#39;AY&#39;, &#39;BX&#39;, &#39;BY&#39;]

Sie können auch mehrere Variablen in einer for-Anweisung gleichzeitig iterieren. Beispielsweise kann dict's items() den Schlüssel iterieren und Wert zugleich:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']

Das ist fast alles~

Aber ich habe in der Vergangenheit immer C++ geschrieben. Es ist schwierig, mich mit dieser Denkweise vertraut zu machen Ich verwende diese Syntax und sobald ich mich daran gewöhnt habe, kann ich sie unbewusst schreiben.

Generator

Warum einen Generator verwenden? Das Tutorial von Liao Da erklärt es ausführlich, hier ist eine kurze Zusammenfassung:

  1. Da der Inhalt der Liste im Speicher abgelegt wird und Speicherbeschränkungen unterliegt, ist die Kapazität der Liste begrenzt .

  2. Wenn wir nur auf sehr wenige Elemente zugreifen, entsteht eine enorme Platzverschwendung.

  3. Der Generator kann während der Iteration den nächsten Wert berechnen. Theoretisch kann der Prozess unbegrenzt fortgesetzt werden und belegt nicht viel Speicher.

Hier ist nur eine kurze Einführung, bitte googeln Sie für weitere Details~

Wie erstelle ich einen Generator? Die erste Methode ähnelt der zuvor erwähnten Listengenerierung. Sie müssen nur [] in () ändern:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

Wie Sie sehen können, ist die Methode ungefähr die gleiche Es wurde eine Liste aller Werte erhalten, und was () erhalten hat, ist ein Generator, der mithilfe einer for-Schleife iteriert werden kann. Auf den Generator kann jedoch nicht über Indizes zugegriffen werden, und er kann nur einmal iteriert werden Auch hier tritt eine StopIteration-Ausnahme auf:

>>> for i in g:
...     print(i)
...
0
1
4
9
16
25
36
49
64
81
>>> for i in g:
...     print(i)
...
>>> next(g)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Wenn wir jedoch einen Generator erstellen, rufen wir grundsätzlich nie next() auf, sondern iterieren ihn durch eine for-Schleife und müssen uns nicht um StopIteration kümmern Fehler.

Wenn der Berechnungsalgorithmus komplexer ist und nicht mit einer for-Schleife ähnlich der Listengenerierung implementiert werden kann, können Sie ihn auch mit einer Funktion implementieren, zum Beispiel der berühmten Fibonacci-Folge:

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return &#39;done&#39;

Was das Schlüsselwort yield angeht, hatte ich lange Zeit damit zu kämpfen, bis ich den Generator sah. Ich denke, es ist schwierig, darüber zu sprechen Deshalb möchte ich nur sagen, dass ich Angst habe, in ein oder zwei Sätzen etwas Falsches zu sagen. Im Tutorial von Liao Da heißt es:

Funktionen werden nacheinander ausgeführt und kehren zurück, wenn sie auf eine Return-Anweisung oder die letzte Zeile von Funktionsanweisungen stoßen. Die Funktion, die zum Generator wird, wird jedes Mal ausgeführt, wenn next() aufgerufen wird, kehrt zurück, wenn eine Yield-Anweisung auftritt, und setzt die Ausführung bei der zuletzt zurückgegebenen Yield-Anweisung fort, wenn sie erneut ausgeführt wird.

Es ist vielleicht etwas schwierig zu verstehen, aber wenn man es einmal verstanden hat, ist es leicht zu erklären.

Natürlich können Sie der Funktion auch eine Rückgabe hinzufügen. Wenn es keine Rückgabe gibt, wird sie standardmäßig ausgeführt, bis die Funktion abgeschlossen ist. Wenn sie während der Ausführung zurückkehrt, wird StopIteration ausgelöst direkt, um die Iteration zu beenden.

Im obigen Beispiel haben wir beispielsweise festgestellt, dass die Zeichenfolge „fertig“ während der Iteration nicht angezeigt wurde, da der Rückgabewert als Ausnahmewert behandelt wurde. Wenn Sie ihn anzeigen möchten, können Sie dies tun Tun Sie dies:

>>> g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print('g:', x)
...     except StopIteration as e:
...         print('Generator return value:', e.value)
...         break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done

Iterator (Iterator)

Objekte, die direkt in for-Schleifen verwendet werden können, werden als iterierbare Objekte bezeichnet. Sie können die Funktion isinstance() verwenden, um festzustellen, ob es sich um ein handelt iterierbares Objekt:

>>> from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False

Das Objekt, das von der Funktion next() aufgerufen werden kann und kontinuierlich den nächsten Wert zurückgibt, wird als Iterator bezeichnet: Iterator. Natürlich können Sie isinstance() weiterhin verwenden, um festzustellen, ob ein Objekt ein Iteratorobjekt ist:

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

Anhand der beiden obigen Beispiele können Sie es folgendermaßen verstehen: Generatoren und Liste, Tupel, Str, usw. sind alles iterierbare Objekte. Ein Iterator ist ebenfalls ein Iteratorobjekt, eine Liste usw. jedoch nicht. Kann es also direkt von iterierbaren Objekten in Iterator-Objekte konvertiert werden?

Sie können die Funktion iter() verwenden:

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

其实,Iterator 对象表示的是一个数据流,我们可以把这个数据流看做是一个有序序列,但却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,但 list,tuple 什么的是不可能这样的。

更多关于 python 的一些高级特性相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn