Diese Notiz ist das Ergebnis der Bemühungen des Bauingenieurs, des Ingenieurs, der Nase, des Wassers und des Schreibens. Das Fingerpicken ist kein Masakari, sondern ein reinweißer Taoru, der auch hervorragend und geworfen ist.
Ich sagte: "Nein, aber ich habe Pyhton schon lange geschrieben und ich frage mich, ob ich Python vollständig verstanden habe!"
Ich sagte: "Möchten Sie es nach langer Zeit in docs.python.org sehen? Wenn Sie es sich jetzt ansehen, können Sie alles sehen, www."
I "HOWTO zur funktionalen Programmierung ...? Was ist das ..."
Ich sagte: "Nun ...? Die meisten Programmiersprachen sind ** prozedural **? Und eine Anweisungsliste, die dem Computer beibringt, was mit Eingaben zu tun ist? ** Objektorientiert **? Manipuliert eine Sammlung von Objekten. Hat einen internen Status und es gibt eine Methode, um diesen Status zu überprüfen und zu ändern ...? ** Funktionstyp **? Teilt das Problem einfach in mehrere Funktionen auf, wartet auf Eingabe und spuckt Ausgabe aus. Hat es keinen internen Status, der unterschiedliche Ausgänge für denselben Eingang spuckt? "
ICH "?????????"
Ich "Ähm ...?"
Python ist eine solche Multi-Paradigmen-Sprache. Sie können jedes dieser Programme verwenden, um Programme und Bibliotheken zu schreiben, die grundsätzlich prozedural, grundsätzlich objektorientiert oder grundsätzlich funktional sind. In großen Programmen kann jeder Teil mit einem anderen Ansatz geschrieben werden, die GUI ist objektorientiert, die Verarbeitungslogik ist jedoch prozedural oder funktional und so weiter.
Ich "Was willst du denn sagen ... ich weiß nichts ..."
Ich sagte: "Es gibt in erster Linie verschiedene ** Methoden ** und ** Funktionen ** in der Programmierung."
Methode | Charakteristisch | Typische Sprache |
---|---|---|
Verfahrensart | Ein Stil, in dem Prozeduren (Funktionen usw.), die Anweisungen kombinieren, beschrieben und kombiniert werden. | C |
Funktionsart | Ein Stil zum Erstellen eines Programms aus dem Synthetisieren und Anwenden von Funktionen. | Haskell |
Objektorientierung | Ein Stil, der die zu verarbeitenden Daten und die Operationsprozedur als Gruppe betrachtet. | Java |
Ich sagte: "Hmm ... ich weiß nicht ... Was ist der Unterschied zwischen dem prozeduralen Typ und dem funktionalen Typ? Lassen Sie uns etwas mehr untersuchen."
――Schreiben Sie die Methode auf, um das Problem gemäß dem Verfahren detailliert zu lösen ――Die Prozedur kann einzeln von oben beschrieben werden. Im Allgemeinen werden jedoch mehrere Funktionen definiert und kombiniert, um die Daten zu ändern.
Ich sagte: "Ich verstehe. Der Punkt ist, die Verarbeitung in der Reihenfolge von oben wie folgt zu schreiben. Dies ist, was ich schließlich mit Python mache."
def add(x, y):
return x + y
def squared(x):
return x ** 2
squared_x = squared(2) # 4
squared_y = squared(4) # 16
add_xy = add(squared_x, squared_y) # 20
Ich "Hona, als nächstes"
--Variationen und Funktionen sind referenztransparent und Nebenwirkungen werden unterdrückt oder vollständig beseitigt. ―― Mit anderen Worten, das Innere der Funktion ist nicht auf externe Daten angewiesen und ändert diese nicht.
Ich sagte: "Hmm ??? Ein schwieriges Wort kam heraus ..."
Ich sagte: "Sobald Sie" x = 1 "definiert haben, ist garantiert, dass x im Programm 1 ist."
Ich sagte: "Ich kann nicht dasselbe für Funktionen sagen. Es ist wie in der Mathematik, die immer den gleichen Wert zurückgibt. Als ich mit dem Programmieren anfing."
x = x + 1
Ich sagte: "Ich wollte es gerade umdrehen. Die rechte und die linke Seite sind nicht gleich."
Ich sagte: "... nun, ich verstehe. Python ist ein Konzept, das schwierig anzuwenden scheint, da die meisten Variablen variabel sind, aber ich würde es begrüßen, wenn der Rückgabewert konstant ist. Es ist einfach zu testen. Was sind die Nebenwirkungen?"
Ich sagte: "Ah, ja, ich verstehe. Ich verstehe voll und ganz."
Ich sagte: "Aber wie erstellen Sie ein Programm, indem Sie den Status der Neuzuweisung vollständig beseitigen ...? Für Anweisungen wird verwendet, aber Python für Anweisungen erstellt keinen lokalen Bereich und ist ein typisches Beispiel für Nebenwirkungen ..."
Ich sagte "Ja !!!!!! Verwenden Sie die eingebaute Funktion map
!!!!!!"
#Verfahrensart
def squared(x):
return x ** 2
number_list = [1, 2, 3, 4, 5]
squared_list = [] # [1, 4, 9, 16, 25]
for n in number_list:
squared_list.append(squared(n))
#Funktionsart
squared_list = list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])) # [1, 4, 9, 16, 25]
Ich sagte: "Ich konnte in einer Zeile schreiben, ohne den Zustand zu ändern. Ist es nicht erstaunlich?"
Ich sagte: "Es besteht jedoch kein Zweifel daran, dass der Prozedurtyp intuitiver und leichter zu verstehen ist. Der Punkt ist, überlegen Sie, wo Sie ihn verwenden sollen."
Ich "Was kommt als nächstes?"
Ich sagte: "Die" Karte ", die ich zuvor verwendet habe, empfängt einen" Lambda-Ausdruck (anonyme Funktion) ", daher ist dies ein typisches Beispiel für eine Funktion höherer Ordnung."
Ich sagte: "Indem es möglich ist, Funktionen zu empfangen, ist es nicht notwendig, eine bestimmte Verarbeitung in eine Funktion zu schreiben, so dass es einfach ist, die Verarbeitung zu teilen, das heißt, sie ist erweiterbarer."
Ich sagte: "Wenn Sie eine Funktion erhalten, ist es einfach, einen festen Prozess vor und nach der empfangenen Funktion zu platzieren, und Sie können Funktionen hinzufügen, ohne den Hauptprozess zu beeinflussen! Es scheint, dass dies in Python als Dekorator bezeichnet wird. ! "
#Messen Sie die Bearbeitungszeit einer Funktion
from functools import wraps
import time
#Definieren Sie eine Funktion, die eine Funktion empfängt
#Geben Sie die interne Funktion zurück
def time_measurement(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
exe = func(*args, **kwargs)
end = time.time()
print(f"time_measurement: {end - start}")
return exe
return wrapper
# @Beim Aufruf mit (decorator) wird das Argument der aufgerufenen Funktion eingegeben.
@time_measurement
def func(num):
res = 0
for n in range(num):
res += n
return res
func(10000000) # time_measurement: 0.48942112922668457
Ich sagte: "Es scheint, dass die verschachtelte Funktion wie die folgende eine Funktion ist, die sich an die außerhalb definierten Variablen erinnert!"
#Gehege
def outer():
x = 1
#Schließung
def inner(y):
return x + y
return inner
f = outer() #Der Rückgabewert ist inner()
i = f(10) #Da inner ausgeführt wird, beträgt der Rückgabewert 11.
Ich sagte: "Sie können sich jedoch auf die im übergeordneten Element definierten Variablen beziehen, müssen jedoch eine spezielle Anweisung mit dem Namen" nonlocal "deklarieren, um sie zu aktualisieren. Seien Sie also vorsichtig!"
Ich sagte: "Der Funktionstyp ist der gleiche wie das Programmieren mit Funktionen, aber angesichts der Wartbarkeit und Erweiterbarkeit ist es eine gute Idee, die volle Leistungsfähigkeit der Sprache zu nutzen, um ein Programm zu erstellen, das (so weit wie möglich) keine Nebenwirkungen hat. ""
Ich sagte: "Ist das Ende objektorientiert? Es ist ein Typ, der oft mit Äpfeln oder Autos verglichen wird!"
Ich sagte: "Ich verstehe. Der Punkt ist, dass es eine 'Klasse' ist. Ich möchte kein Programm erstellen, indem ich die Struktur und das Verhalten von Daten als eine Sache betrachte."
Ich sagte: "Im Gegensatz zum Funktionstyp erlaubt es einen Zustand, aber indem es darin versteckt wird, unterdrückt es das Auftreten von Fehlern."
Ich sagte: "Ich weiß nicht, ob es zu viele Keywords gibt ... Überprüfen Sie sie einzeln."
Ich sagte: "Hmm. Sie können nicht mit den Variablen der Instanz herumspielen, die direkt aus der Klasse erstellt wurden."
Ich sagte: "Aber Python kann keine unveränderlichen Variablen definieren. Wenn Sie das tun, ist es so?"
--Verwenden Sie @ property und @ property.setter in Python
Ich sagte: "Zunächst einmal, warum machst du nicht eine Fleischklasse, deren Preis sich je nach Gewicht ändert?"
class Meat:
#Instanzinitialisierung
#Jede Instanz hat die hier definierten Attribute
def __init__(self, name, weight):
if weight < 0:
raise ValueError("Das Gewicht sollte nicht unter 0 g liegen")
self.name = name
self.weight = weight
#Nicht direkt von außen verwenden_Anziehen
#Der Rabatt wird auf den Anfangswert von 5 gesetzt
self._unit_price = 5
self._price = 0
#Legen Sie die Zeichenfolge fest, die beim Aufrufen der Instanz angezeigt werden soll
def __repr__(self):
return f"{self.name}: {self.price}Kreis"
#Durch Anhängen eines Eigenschaftsdekorators können Sie eine Methode wie eine Instanzvariable von außen aufrufen.
@property
def unit_price(self):
#Legen Sie den Wert fest, den Sie als Rückgabewert bezeichnen möchten
return self._unit_price
@property
def price(self):
return self.weight * self._unit_price
#Verwenden Sie den Setter, um Variablen zu ändern
#Wenn Sie eine Variable ändern möchten, überschreiben Sie sie nicht direkt, sondern über eine Methode
#Auf diese Weise werden durch diese Methode externe Referenzen erstellt, um zu verhindern, dass falsche Werte eingemischt werden.
@unit_price.setter
def unit_price(self, value):
if not (1 <= value <= 10):
raise ValueError("Bitte stellen Sie den Stückpreis zwischen 1 Yen und 10 Yen ein")
self._unit_price = int(value)
Ich sagte: "OK, versuchen Sie es sofort."
>>> meat = Meat("Matsuzaka-Rindfleisch", 200)
>>> meat
Matsuzaka-Rindfleisch:1000 Yen
>>> meat.unit_price = 100
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 30, in unit_price
ValueError:Bitte stellen Sie den Stückpreis zwischen 1 Yen und 10 Yen ein
>>> meat.unit_price = 10
>>> meat
Matsuzaka-Rindfleisch:2000 Yen
>>> meat.price = 3000
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: can't set attribute
Ich sagte: "Matsuzaka-Rindfleisch ist teuer. Ich möchte satt essen."
Ich sagte: "Aber es funktioniert wie erwartet. Jetzt kann ich es wie folgt implementieren."
--name
und weight
können als Anfangswerte eingestellt werden
Preis
wird automatisch berechnet
--unit_price
schlägt fehl, wenn versucht wird, einen Wert außerhalb des Bereichs festzulegenIch sagte: "Wenn Sie darüber nachdenken, ist die Berechnung der Menge aus dem Gewicht ein Vorgang, der Fleisch eigen ist."
Ich sagte: "Warum ändern Sie den Klassennamen nicht in Artikel? Der Preis ändert sich nicht immer je nach Gewicht, und der Stückpreis kann festgelegt werden, und nur die Anzahl kann sich ändern." . "
Ich sagte: "Ich glaube nicht, dass dies eine Abstraktion ist."
class Item:
def __init__(self, name):
self.name = name
self._price = 0
def __repr__(self):
return f"{self.name}: {self.price}Kreis"
@property
def price(self):
return self._price
Ich sagte: "Wenn ich wieder eine Fleischklasse machen möchte, mache ich eine konkrete Klasse, indem ich die obige abstrakte Klasse (Gegenstandsklasse) erbe."
--Erstellen einer konkreteren Klasse durch Erben des übergeordneten abstrahierten Objekts
class Meat(Item):
def __init__(self, name, weight):
# super()Explizite Verwendung der übergeordneten Klasse__init__()Anruf
super().__init__(name)
self.weight = weight
self._unit_price = 5
@property
def unit_price(self):
return self._unit_price
#Methode überschreiben
@property
def price(self):
return self.weight * self._unit_price
@unit_price.setter
def unit_price(self, value):
if not (1 <= value <= 10):
raise ValueError("Bitte stellen Sie den Stückpreis zwischen 1 Yen und 10 Yen ein")
self._unit_price = int(value)
>>> meat = Meat("Matsuzaka-Rindfleisch", 500)
>>> meat
Matsuzaka-Rindfleisch:2500 Yen
>>> meat.unit_price = 100
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 21, in unit_price
ValueError:Bitte stellen Sie den Stückpreis zwischen 1 Yen und 10 Yen ein
>>> meat.unit_price = 10
>>> meat
Matsuzaka-Rindfleisch:5000 Yen
>>> meat.price = 3000
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: can't set attribute
Ich sagte: "Ich möchte damit eine Apfelklasse und eine Mikan-Klasse machen !!!!"
Ich sagte: "Übrigens habe ich dieses Mal eine abstrakte Klasse als Klasse erstellt, aber normalerweise scheint es, dass nur das" Verhalten (Methodenname) "in der Schnittstelle definiert ist."
I "Schreiben Sie den Inhalt der Methode nicht in die Schnittstelle und überlassen Sie die spezifische Implementierung der geerbten Klasse (erzwungene Implementierung der Methode)."
Ich sagte: "Auf diese Weise wird bestätigt, dass alle geerbten Klassen Methoden mit demselben Namen haben, sodass die Aussichten besser sind! Es scheint, dass dies als" Polymorphismus "bezeichnet wird !!"
――Programmieren für abstrahierte Klassen, damit sie auf verschiedene Arten verwendet werden können ―― Mit anderen Worten, obwohl die Funktionen und Methoden denselben Namen haben, verhalten sie sich je nach Typ unterschiedlich.
Ich sagte: "Huh. Ich habe endlich die Eigenschaften meines Schreibstils verstanden. Alle sind wunderbar."
Ich sagte: "Mit dem Prozedurtyp können Sie Code schreiben, der einfach, schnell und klar ist, wenn Sie ein einfaches Programm erstellen. Wenn Sie jedoch mittelgroß oder größer sind, ist dies ein direkter Kurs für Spaghetti ..."
Ich sagte: "Es scheint schwierig zu sein, einen Funktionstyp zu schreiben, aber in der groß angelegten Entwicklung scheint er erweiterbar zu sein, da er in wiederverwendbare Teile unterteilt ist und es weniger Fehler geben wird."
Ich sagte: "Die Objektorientierung scheint im großen Maßstab stark zu sein. Es scheint schwierig zu sein, aber wenn es gut abstrahiert werden kann, wird die Menge an Code dadurch verringert!"
Ich sagte: "Python hat übrigens Nebenwirkungen, aber es ist eine vielseitige Sprache, die auch mit einem Funktionstyp programmiert und objektorientiert sein kann! Es scheint eine Multi-Paradigmen-Sprache zu sein!"
Ich sagte: "Deshalb sollten Sie die Methode gut lernen und richtig anwenden! Geben Sie Ihr Bestes, um Python vollständig zu verstehen!"
Oshimai
Recommended Posts