"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 !?")
Wikipedia-Aufnahme und -Erweiterung
extension_li = []
for x in range(10):
extension_li.append(x**2)
extension_li
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
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]
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}
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'}
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
extension = [i for i in range(1,10) if i%2==0]
extension
[2, 4, 6, 8]
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']
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).
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.
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.
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