[PYTHON] Dies und das der Einschlussnotation.

"Mit Python kann man nicht einfach inklusive Notation schreiben."

Mir wurde von einer großartigen Person erzählt, also besuchte ich verschiedene Orte und studierte. (Vorausgesetztes Wissen ist "Nun, es ist nicht nur Listeneinschluss !?")

Inklusive Notation und Extensionsnotation

Wikipedia-Aufnahme und -Erweiterung

4 Muster der Einschlussnotation in Python

1. Listeneinschluss

Normale Listenerstellung

extension_li = []
for x in range(10):
    extension_li.append(x**2)
extension_li
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Listeneinschlussnotation

Definiert in []. Gibt eine Liste zurück.

comprehension_li = [x**2 for x in range(10)]
comprehension_li
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

2. Set enthalten

Definiert mit {}.

comprehension_set = {i/2 for i in range(1,11)}
comprehension_set
{0.5, 1.0, 2.0, 2.5, 1.5, 3.0, 3.5, 4.0, 4.5, 5.0}

3. Aufnahme des Wörterbuchs

abb = ("NY","TX","MA","WA","CT")
state = ("New York", "Texas", "Massachusetts", "Washington", "Connecticut")

comprehension_dict = {i:j for i,j in zip(abb,state)}
comprehension_dict
{'WA': 'Washington',
 'TX': 'Texas',
 'NY': 'New York',
 'MA': 'Massachusetts',
 'CT': 'Connecticut'}

4. Generatortyp

Definiert in (). Es ist niemals eine Tapple-Inclusion-Notation, und es wird ein Generator zurückgegeben, der Elemente generiert. Es spart Speicher, da nicht alle Elemente wie eine Liste im Speicher gespeichert sind.

comprehension_gen = (i%3 for i in range(1,10))
comprehension_gen
<generator object <genexpr> at 0x014CD900>
for i in comprehension_gen:print(i)
1
2
0
1
2
0
1
2
0

wenn Standort

Wenn Sie einfach eine if-Anweisung einfügen

extension = [i for i in range(1,10) if i%2==0]
extension
[2, 4, 6, 8]

If ~ else-Anweisung

comprehension = [i if i%2==0 else 0 for i in range(1,10)]
comprehension
[0, 2, 0, 4, 0, 6, 0, 8, 0]

Wenn else eingegeben wird, steht die bedingte Notation an erster Stelle. Der Grund ist klar: "Simply if-Anweisung" ist eine normale Grammatik für die Einschlussnotation, während "if ~ else-Anweisung" als ternärer Operator behandelt wird.

Der ternäre Python-Operator ist übrigens

** "(Wert, wenn Bedingung wahr ist) if (Bedingung) else (Wert, wenn Bedingung falsch ist)" **

Es wird die Beschreibung. (Seien Sie vorsichtig, da es sich von Java, C usw. unterscheidet.)

Es tut mir leid zu sagen, dass es viel verbraucht ist, aber FizzBuzz kann einfach mit der if ~ else-Anweisung in einen Liner geschrieben werden.

print(["FizzBuzz" if n % 15 == 0 else "Fizz" if n % 3 == 0 else "Buzz" if n % 5 == 0 else n for n in range(1,101)])

Oder du kannst so schreiben.

print([(i%3==0 and 1 or 0)*"Fizz"+(i%5==0 and 1 or 0)*"Buzz" or i for i in range(1, 101)])
print([(i%3==0)*"Fizz"+(i%5==0)*"Buzz" or i for i in range(1, 101)])
[1, 2, 'Fizz', 4, 'Buzz', 'Fizz', 7, 8, 'Fizz', 'Buzz', 11, 'Fizz', 13, 14, 'FizzBuzz', 16, 17, 'Fizz', 19, 'Buzz', 'Fizz', 22, 23, 'Fizz', 'Buzz', 26, 'Fizz', 28, 29, 'FizzBuzz', 31, 32, 'Fizz', 34, 'Buzz', 'Fizz', 37, 38, 'Fizz', 'Buzz', 41, 'Fizz', 43, 44, 'FizzBuzz', 46, 47, 'Fizz', 49, 'Buzz', 'Fizz', 52, 53, 'Fizz', 'Buzz', 56, 'Fizz', 58, 59, 'FizzBuzz', 61, 62, 'Fizz', 64, 'Buzz', 'Fizz', 67, 68, 'Fizz', 'Buzz', 71, 'Fizz', 73, 74, 'FizzBuzz', 76, 77, 'Fizz', 79, 'Buzz', 'Fizz', 82, 83, 'Fizz', 'Buzz', 86, 'Fizz', 88, 89, 'FizzBuzz', 91, 92, 'Fizz', 94, 'Buzz', 'Fizz', 97, 98, 'Fizz', 'Buzz']

Kann stattdessen eine Karte oder ein Filter verwendet werden?

Ich kann antworten.

Hier werden wir als Beispiel die Operationen vergleichen, um eine Liste von Quadratwerten von [1,2,3,4,5,6,7,8,9,10] zu erstellen.

%%timeit
list(map(lambda i : i**2, range(1,11)))
10000 loops, best of 3: 23.8 µs per loop
%%timeit
[i**2 for i in range(1,11)]
100000 loops, best of 3: 15.8 µs per loop

Vergleichen Sie für Filter die Operationen zum Entfernen gerader Zahlen aus [1,2,3,4,5,6,7,8,9,10].

%%timeit
list(filter(lambda i : i%2==0, range(1,11)))
10000 loops, best of 3: 19.3 µs per loop
%%timeit
[i for i in range(1,11) if i%2==0]
100000 loops, best of 3: 10.2 µs per loop

Wie Sie sehen können, ist die Geschwindigkeit unterschiedlich. Die Lesbarkeit reicht auch bis zur Einschlussnotation (in dem Sinne, dass Sie leicht verstehen können, was Sie tun) (individueller Unterschied).

Sprechen Sie über Geschwindigkeit

Da haben wir übrigens über Verarbeitungsgeschwindigkeit gesprochen. Was passiert, wenn Sie die Geschwindigkeiten der zuerst angezeigten Listeneinschlussnotation mit der normalen Listengenerierung vergleichen?

def for_loop(n):
    extension = []
    for x in range(n):
        extension.append(x**2)
    return extension
def comprehension(n):
    return [x**2 for x in range(n)]
%timeit  for_loop(1000)
1000 loops, best of 3: 1.58 ms per loop
%timeit  comprehension(1000)
1000 loops, best of 3: 1.16 ms per loop

Es ist schwer, den Unterschied zu meinem langsamen PC zu bemerken, aber der Unterschied ist immer noch klar. Der Grund ist einfach, dass Ersteres jedes Mal Zeit benötigt, um das Append-Attribut abzurufen, wenn die for-Anweisung gedreht wird. Die Sache ist ein Versuch, und nur die Referenz des Append-Attributs wird aus der for-Anweisung gelöscht und die Zeit wird gemessen.

def for_loop2(n):
    extension = []
    app = extension.append
    for x in range(n):
        app(x**2)
    return extension
%timeit for_loop2(1000)
>>>1000 loops, best of 3: 1.27 ms per loop

Wie erwartet lag die Verarbeitungszeit in der Reihenfolge for_loop> for_loop2> verstehen. Der Unterschied zwischen for_loop2 und Verständnis bedeutet wahrscheinlich die Geschwindigkeit des Anhängens selbst.

schließlich

Irgendwie verstand ich, wie man mit der Einschlussnotation umgeht.

Damit kann ich ab heute nicht mehr zu Python Master gehen ...

Oder besser gesagt, ich dachte, es wäre ein Schreibstil, der dieser inklusiven Notationspython eigen ist, aber er scheint normalerweise in vielen anderen funktionalen Sprachen verwendet zu werden.

Ich werde die Websites, die ich als Referenz verwendet habe, einschließlich dieser veröffentlichen.

~ Referenz ~

DSAS Developer's Room - Warum ist Pythons Einschlussnotation so schnell? Qiita - Ein wenig mehr Details zur Einschlussnotation von Python stackoverflow - if else in a list comprehension
Krankheit, die zur Klassifizierung von Wissen führt, wenn if ~ else in der Einschlussnotation von Python verwendet wird Leben mit Python - Zusammenfassung der Verwendung der Einschlussnotation von Python

Recommended Posts

Dies und das der Einschlussnotation.
Dies und das von Python-Eigenschaften
Beherrsche die Einschlussnotation
matplotlib dies und das
Dies und das über pd.DataFrame
Dies und das mit reflektieren
Zabbix API dies und das
Die Geschichte von Python und die Geschichte von NaN
Dies und das haben wir von boost.python gelernt
Dies und das mit NLTK (Memo)
Über Boxplot und Violinplot, die die Variation unabhängiger Daten visualisieren
Überprüfung der Theorie, dass "Python und Swift ziemlich ähnlich sind"
Memorandum von Python-Anfängern
Überprüfen Sie das Konzept und die Terminologie der Regression
Die Geschichte, deep3d auszuprobieren und zu verlieren
Vor- und Nachteile von Django, die Menschen mit einjähriger Erfahrung denken
Über das Verhalten von copy, deepcopy und numpy.copy
Informationen zur X-Achsen-Notation des Balkendiagramms von Matplotlib
Die Geschichte der Schaffung einer (wahrscheinlich) minimalen Fertigkeit, die Personalisierung und Abrechnung von Fertigkeiten implementiert
Zusammenfassung der Unterschiede zwischen PHP und Python
Vollständiges Verständnis der Konzepte von Bellmanford und Dyxtra
Sprechen Sie über die Funktionen, für die Pandas und ich im Projekt verantwortlich waren
Die Antwort von "1/2" unterscheidet sich zwischen Python2 und 3
zsh-Einstellungen, die die Verwendung von virtualenv erleichtern
Die Geschichte einer Box, die Peppers AL Memory und MQTT miteinander verbindet
Organisieren Sie die Bedeutung von Methoden, Klassen und Objekten
Angeben des Bereichs von Ruby- und Python-Arrays
Ein Liner, der die Farben von Matplotlib auflistet
Ändern Sie die Farbe von Fabric-Fehlern und Warnungen
Vergleichen Sie die Geschwindigkeit von Python Append und Map
Dies ist die einzige grundlegende Überprüfung von Python ~ 1 ~
Dies ist die einzige grundlegende Überprüfung von Python ~ 2 ~
[Python] Ein Programm, das die Anzahl der Aktualisierungen der höchsten und niedrigsten Datensätze berechnet
Dies ist die einzige grundlegende Überprüfung von Python ~ 3 ~
Allgemeine Beschreibung des CPUFreq-Kerns und der CPUFreq-Benachrichtigungen
Dies und das ist nützlich, wenn es mit nohup verwendet wird
Organisieren Sie die grundlegende Verwendung von Autotools und pkg-config
Ich habe die Varianten von UKR gelesen und implementiert
Berücksichtigung der Stärken und Schwächen von Python
Die schönen und bedauerlichen Teile von Cloud Datalab
Es scheint, dass sich das Modul von train_test_split von 0,20 ändert und die Verfallswarnung bei 0,18 angezeigt wird.
Berücksichtigung des Unterschieds zwischen ROC-Kurve und PR-Kurve
Eine Geschichte, die den Aufwand für Betrieb / Wartung reduziert
Die Geschichte von Python ohne Inkrement- und Dekrementoperatoren.
Ermitteln und verarbeiten Sie die Codierung der Textdatei automatisch
Beziehung der Fibonacci-Zahlenreihe und des Goldenen Schnitts
Der Prozess der Installation von Atom und der Ausführung von Python
Python - Erläuterung und Zusammenfassung der Verwendung der 24 wichtigsten Pakete
Erstellen Sie einen BOT, der die Discord-URL verkürzt
Visualisieren Sie den Bereich der internen und externen Einfügungen mit Python
[FSL] Segment- und Volumenmessung des basalen Hirnkerns (Basalganglien)
Denken Sie an das Rack und WSGI der nächsten Generation
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Referenz und Änderung der rekursiven Python-Obergrenze
Ich habe mir die Versionen von Blender und Python angesehen
PHP- und Python-Beispiele, die die ChatWork-API treffen
Bitte beachten Sie, dass sich der neueste Link von ius geändert hat
Ich habe das Standardbetriebssystem und die Shell der Docker-Maschine überprüft