Was ist "funktionale Programmierung" und "objektorientiert"? Python Edition

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.

Der Anfang davon

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 ..."

Unterschiede in den Programmiermethoden

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."

Merkmale der prozeduralen Programmierung

――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"

Merkmale der funktionalen Programmierung

--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 ..."

Was ist Referenztransparenz?

  1. Variablen, die nicht von der Umgebung betroffen sind und deren Werte unabhängig davon, wann sie referenziert werden, gleich sind (unveränderlich)
  2. Beinhaltet Funktionen, die immer den gleichen Rückgabewert zurückgeben, wenn die Argumente gleich sind
  3. Da der Wert unveränderlich ist, kann menschliches Versagen unterdrückt werden.
  4. Stark gegen Parallelverarbeitung, da es keine Nebenwirkungen verursacht (weniger wahrscheinlich Datenkonflikte verursachen)

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?"

Was sind Nebenwirkungen?

  1. Durch Ausführen des Prozesses eine extern beobachtbare Änderung vornehmen
  2. Ein typisches Beispiel ist die Neuzuweisung zu einer veränderlichen (variablen) Variablen.
  3. Eine Funktion, die keinen Zustand hat und Nebenwirkungen vollständig beseitigt, wird als reine Funktion bezeichnet, und eine Funktion, die keinen Zustand hat, wird als unreine Funktion bezeichnet.

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?"

Andere Schlüsselwörter

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. ""

Objekt orientierte Programmierung

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."

Schlüsselwort für objektorientierte Programmierung

Verschleierung (Kapselung) / Abstraktion

Verschleierung (Einkapselung)

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

Abstraktion

Ich 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

Erbe

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 !!!!"

Vielfalt (Polymorphismus)

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.

Zusammenfassung

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

Was ist "funktionale Programmierung" und "objektorientiert"? Python Edition
[Python] Python und Sicherheit - is Was ist Python?
Funktionsprogrammierung in Python Project Euler 1
Unterschied zwischen == und ist in Python
Funktionale Programmierung in Python Project Euler 3
Funktionsprogrammierung in Python Project Euler 2
Programmieren mit Python
Was ist Python?
Was ist Python?
[Python] Was ist Pandas Series und DataFrame?
Was für eine Programmiersprache ist Python?
Was ist "Mahjong" in der Python-Bibliothek? ??
Probieren Sie eine funktionale Programmierpipe in Python aus
Verwendung ist und == in Python
[Python] Was ist Pipeline ...
Was ist im Docker Python-Image pfeifend?
Über den Unterschied zwischen "==" und "is" in Python
Was vergleichst du mit Python und ==?
Python-Programmierung mit Excel
[Python] Was ist virtualenv?
Nehmen Sie Kontakt mit der funktionalen Programmierung in JavaScript oder Python 3 auf
Programmieren mit Python und Tkinter
Stapel und Warteschlange in Python
Wettbewerbsprogrammierung ist was (Bonus)
[Python] * args ** Was ist kwrgs?
Unittest und CI in Python
Was ich in Python gelernt habe
Identität und Äquivalenz: ist und == in Python
Python-Grundkurs (1 Was ist Python?)
Überlegen Sie, ob das Programmieren in Python und C ein Anime war
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
Objektorientiert in C-Sprache: "○ ✕ game" wurde überarbeitet und nach Python portiert
[Swift / Ruby / Python / Java] Objektorientierte Programmierung
[Python] Was ist eine Zip-Funktion?
[Python] Was ist eine with-Anweisung?
GUI-Programmierung in Python mit Appjar
Was ist Kennzeichnung in der Finanzprognose?
Unterschied zwischen list () und [] in Python
Was Anfänger über das Programmieren im Jahr 2016 denken
[Einführung in Python3 Tag 1] Programmierung und Python
Zeigen Sie Fotos in Python und HTML an
Verwenden Sie Stoff wie in Python (Stoff3)
Sortieralgorithmus und Implementierung in Python
[Python] Mit Pokemon erlernte objektorientierte Programmierung
Python ist UnicodeEncodeError im CodeBox-Docker
Bearbeiten Sie Dateien und Ordner in Python
Über Python und Cython dtype
[Python] Was ist @? (Über Dekorateure)
Zuweisungen und Änderungen in Python-Objekten
[Python] Was sind @classmethod und Dekorateure?
[Python] Was ist der sortierte Schlüssel?
Python für Anweisung ~ Was ist iterierbar ~
Überprüfen und verschieben Sie das Verzeichnis in Python
Verschlüsselung mit Python: IND-CCA2 und RSA-OAEP
Hashing von Daten in R und Python
In Python gibt es keinen Schalter
Funktionssynthese und Anwendung in Python
Exportieren und Ausgeben von Dateien in Python
Mit algebraischen Datentypen und objektorientierter Programmierung