Qu'est-ce que la «programmation fonctionnelle» et «orientée objet»? Édition Python

Cette note est le résultat de l'effort du major en génie civil, de l'ingénieur, du nez, de l'eau et de l'écriture. La cueillette des doigts n'est pas un Masakari, mais un Taoru blanc pur, qui est également excellent et peut être jeté.

Le début de ça

J'ai dit: "Non, mais j'écris Pyhton depuis longtemps, et je me demande si j'ai complètement compris Python!"

J'ai dit: "Voudriez-vous le voir dans docs.python.org après un long moment? Si vous le regardez maintenant, vous pouvez tout voir www"

I "HOWTO de programmation fonctionnelle ...? Qu'est-ce que c'est ..."

J'ai dit: «Eh bien ...? La plupart des langages de programmation sont ** procéduraux **?, Et une liste d'instructions qui enseigne à l'ordinateur quoi faire avec les entrées? ** Orienté objet **? Manipule une collection d'objets. A un état interne, et il existe une méthode pour vérifier et modifier cet état ...? ** Type de fonction **? Divise simplement le problème en plusieurs fonctions, attend l'entrée et crache la sortie. N'a-t-il pas un état interne qui crache différentes sorties pour la même entrée? "

JE "?????????"

Je "Euh ...?"

Python est un tel langage multi-paradigme. Vous pouvez utiliser n'importe lequel de ces éléments pour écrire des programmes et des bibliothèques qui sont essentiellement procéduraux, orientés objet ou fonctionnels. Dans les grands programmes, chaque partie peut être écrite en utilisant une approche différente, l'interface graphique est orientée objet, mais la logique de traitement est procédurale ou fonctionnelle, et ainsi de suite.

Je "Qu'est-ce que tu veux dire après tout ... je ne sais rien ..."

Différences dans les méthodes de programmation

J'ai dit: "Il existe en premier lieu diverses ** méthodes ** et ** fonctionnalités ** dans la programmation."

Méthode Fonctionnalité Langue typique
Type procédural Un style dans lequel les procédures (fonctions, etc.) qui combinent des instructions sont décrites et combinées. C
Type de fonction Un style de construction d'un programme à partir de la synthèse et de l'application de fonctions. Haskell
Orientation objet Un style qui considère les données à traiter et la procédure d'opération comme un groupe. Java

J'ai dit: "Hmm ... Je ne sais pas ... Quelle est la différence entre le type procédural et le type fonctionnel? Examinons un peu plus."

Caractéristiques de la programmation procédurale

―― Écrivez la méthode pour résoudre le problème en détail selon la procédure

J'ai dit: "Je vois. Le but est d'écrire le traitement dans l'ordre du haut comme ceci. C'est ce que je fais finalement avec Python."

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

Je "Hona, suivant"

Caractéristiques de la programmation fonctionnelle

J'ai dit: "Hmm ??? Un mot difficile est sorti ..."

Qu'est-ce que la transparence des références?

  1. Variables qui ne sont pas affectées par l'environnement et dont les valeurs sont les mêmes quel que soit le moment où elles sont référencées (immuables)
  2. Inclut les fonctions qui renvoient toujours la même valeur de retour si les arguments sont les mêmes
  3. Puisque la valeur est invariante, l'erreur humaine peut être supprimée.
  4. Fort contre le traitement parallèle car il ne provoque pas d'effets secondaires (moins susceptible de provoquer des conflits de données)

J'ai dit: "Une fois que vous avez défini x = 1, il est garanti que x vaut 1 dans le programme."

J'ai dit: "Je ne peux pas dire la même chose pour les fonctions. C'est comme les mathématiques qui renvoient toujours la même valeur. Quand j'ai commencé à programmer,"

x = x + 1

J'ai dit: "J'étais sur le point de le retourner. Le côté droit et le côté gauche ne sont pas égaux."

J'ai dit "... eh bien, je vois. Python est un concept qui semble difficile à appliquer car la plupart des variables sont variables, mais j'apprécierais que la valeur de retour soit constante. C'est facile à tester. Quels sont les effets secondaires?"

Quels sont les effets secondaires?

  1. Pour donner un changement observable de l'extérieur en exécutant le processus
  2. Un exemple typique est la réaffectation à une variable (variable) mutable.
  3. Une fonction qui n'a pas d'état et qui élimine complètement les effets secondaires est appelée une fonction pure, et une fonction qui n'a pas d'état est appelée une fonction impure.

J'ai dit: "Ah, oui, je vois. Je comprends parfaitement."

J'ai dit: "Mais comment créer un programme en éliminant complètement l'état de réaffectation ...? Pour les déclarations sont utilisées, mais Python pour les déclarations ne crée pas de portée locale et sont des exemples typiques d'effets secondaires ..."

J'ai dit "Oui !!!!!! Utilisez la fonction intégrée map !!!!!!"

#Type procédural
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))
#Type de fonction
squared_list = list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])) # [1, 4, 9, 16, 25]

J'ai dit: "J'ai pu écrire sur une seule ligne sans changer d'état. N'est-ce pas incroyable?"

J'ai dit: "Cependant, il ne fait aucun doute que le type procédural est plus intuitif et facile à comprendre ... Le fait est de savoir où l'utiliser."

I "Quelle est la prochaine étape?"

Autres mots-clés

--Fonction d'ordre supérieur: une fonction qui prend une fonction comme argument (également appelée fonction de rappel) --Closer: une fonction dont la fonction interne imbriquée se souvient des variables définies par la fonction parent.

J'ai dit: "La map que j'ai utilisée plus tôt reçoit une expression lambda (fonction anonyme), donc c'est un exemple typique d'une fonction d'ordre supérieur. "

J'ai dit: "En permettant de recevoir des fonctions, il n'est pas nécessaire d'écrire un traitement spécifique dans une fonction, il est donc facile de diviser le traitement, c'est-à-dire qu'il est plus extensible."

J'ai dit: "De plus, si vous recevez une fonction, il est facile de mettre un processus fixe avant et après la fonction reçue, et vous pouvez ajouter des fonctions sans affecter le processus principal! Il semble que cela s'appelle un décorateur en Python. ! "

#Mesurer le temps de traitement d'une fonction
from functools import wraps
import time

#Définir une fonction qui reçoit une fonction
#Renvoyer la fonction interne
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

# @Lorsqu'il est appelé avec (décorateur), il entre l'argument de la fonction appelée.
@time_measurement
def func(num):
    res = 0
    for n in range(num):
        res += n
    return res

func(10000000) # time_measurement: 0.48942112922668457

J'ai dit: "Il semble que la fonction imbriquée comme celle ci-dessous soit une fonction qui se souvient des variables définies à l'extérieur!"

#Enceinte
def outer():
    x = 1
    #fermeture
    def inner(y):
        return x + y
    return inner

f = outer() #La valeur de retour est interne()
i = f(10) #Puisque inner est exécuté, la valeur de retour sera 11.

J'ai dit: "Cependant, vous pouvez vous référer aux variables définies dans le parent, mais vous devez déclarer une déclaration spéciale appelée" non locale "pour mettre à jour, alors soyez prudent!"

J'ai dit: "Le type fonctionnel est le même que la programmation utilisant des fonctions, mais compte tenu de la maintenabilité et de l'extensibilité, c'est une bonne idée d'utiliser toute la puissance du langage pour créer un programme qui n'a pas d'effets secondaires (autant que possible). "

Programmation orientée objet

J'ai dit: "La finalité est-elle orientée objet? C'est un gars qui est souvent comparé aux pommes ou aux voitures!"

J'ai dit: "Je vois. Le fait est que c'est une" classe ". Je ne veux pas créer un programme en considérant la structure et le comportement des données comme une seule chose."

I "Bien qu'il permette aux états d'exister contrairement au type fonctionnel, le cacher à l'intérieur supprime l'apparition de bogues."

I "Je ne sais pas s'il y a trop de mots-clés ... Vérifiez-les un par un."

Mot-clé pour la programmation orientée objet

Dissimulation (encapsulation) / abstraction

Dissimulation (encapsulation)

J'ai dit: "Hmm. Vous ne pouvez pas jouer avec les variables de l'instance créée à partir de la classe directement."

J'ai dit: "Mais Python ne peut pas définir de variables immuables, donc si vous le faites, c'est comme ça?"

--Utilisez @ property et @ property.setter en python --Ajoutez un trait de soulignement au début de la variable pour les propriétés auxquelles vous ne souhaitez pas accéder de l'extérieur

J'ai dit: "Tout d'abord, pourquoi ne faites-vous pas une catégorie de viande dont le prix varie en fonction du poids?"

class Meat:
    #Initialisation de l'instance
    #Chaque instance a les attributs définis ici
    def __init__(self, name, weight):
        if weight < 0:
            raise ValueError("Le poids ne doit pas être inférieur à 0g")
        self.name = name
        self.weight = weight
        #Ne pas utiliser directement de l'extérieur_Mettez
        #La remise est définie sur la valeur initiale de 5
        self._unit_price = 5
        self._price = 0
    #Définir la chaîne de caractères à afficher lors de l'appel de l'instance
    def __repr__(self):
        return f"{self.name}: {self.price}Cercle"
    #En attachant un décorateur de propriété, vous pouvez appeler une méthode comme une variable d'instance de l'extérieur.
    @property
    def unit_price(self):
        #Définissez la valeur à laquelle vous souhaitez faire référence en tant que valeur de retour
        return self._unit_price
    @property
    def price(self):
        return self.weight * self._unit_price
    #Utilisez setter pour changer les variables
    #Lorsque vous souhaitez modifier une variable, ne l'écrasez pas directement, mais écrasez-la via une méthode
    #En faisant cela, des références externes seront effectuées via cette méthode, empêchant le mélange de valeurs incorrectes.
    @unit_price.setter
    def unit_price(self, value):
        if not (1 <= value <= 10):
            raise ValueError("Veuillez définir le prix unitaire entre 1 yen et 10 yens")
        self._unit_price = int(value)

J'ai dit: "OK, essayez de l'utiliser tout de suite."

>>> meat = Meat("Bœuf Matsuzaka", 200)
>>> meat
Bœuf Matsuzaka:1000 yens

>>> meat.unit_price = 100
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 30, in unit_price
ValueError:Veuillez définir le prix unitaire entre 1 yen et 10 yens

>>> meat.unit_price = 10
>>> meat
Bœuf Matsuzaka:2000 yens

>>> meat.price = 3000
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: can't set attribute

J'ai dit: "Le bœuf de Matsuzaka est cher. Je veux manger plein."

J'ai dit: "Mais cela fonctionne comme prévu. Maintenant, je peux l'implémenter comme suit."

--name et weight peuvent être définis comme valeurs initiales --Lorsque vous appelez l'objet, nom: cercle de prix s'affiche.

Abstraction

J'ai dit: "Si vous y réfléchissez bien, calculer la quantité à partir du poids est un processus propre à la viande."

J'ai dit: "Pourquoi ne changez-vous pas le nom de la classe en Article? Le prix ne change pas toujours en fonction du poids, et je ne sais pas si le prix unitaire est fixe et seul le nombre peut changer. D'accord, une fois le paramètre de prix unitaire supprimé . "

J'ai dit: "Je ne pense pas que ce soit une abstraction."

--Recueillir les parties qui changeront fréquemment et extraire uniquement les fonctionnalités essentielles dans la classe. ――Lorsque vous pouvez exprimer «A est B», ils doivent être résumés de manière plus abstraite. «Le concept d'abstraction est de résumer les points communs en tant que norme afin de fabriquer des pièces remplaçables. ――Il sera fort contre les changements, mais attention à ne pas en faire trop

class Item:
    def __init__(self, name):
        self.name = name
        self._price = 0
    def __repr__(self):
        return f"{self.name}: {self.price}Cercle"
    @property
    def price(self):
        return self._price

Héritage

J'ai dit: "Quand je veux créer à nouveau une classe de viande, je vais créer une classe concrète enhéritant dela classe abstraite ci-dessus (classe Item)."

--Création d'une classe plus concrète en héritant de l'objet abstrait parent --S'il s'agit de python, il peut être hérité en prenant la classe parente comme argument lors de la définition de la classe.

class Meat(Item):
    def __init__(self, name, weight):
        # super()Utilisation explicite de la classe parent__init__()Appel
        super().__init__(name)
        self.weight = weight
        self._unit_price = 5
    @property
    def unit_price(self):
        return self._unit_price
    #Méthode de remplacement (remplacement)
    @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("Veuillez définir le prix unitaire entre 1 yen et 10 yens")
        self._unit_price = int(value)
>>> meat = Meat("Bœuf Matsuzaka", 500)
>>> meat
Bœuf Matsuzaka:2500 yens

>>> meat.unit_price = 100
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 21, in unit_price
ValueError:Veuillez définir le prix unitaire entre 1 yen et 10 yens

>>> meat.unit_price = 10
>>> meat
Bœuf Matsuzaka:5000 yens

>>> meat.price = 3000
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: can't set attribute

Je "Tout ce que vous voulez faire un cours de pomme et un cours de mikan avec ça !!!"

Diversité (polymorphisme)

J'ai dit: "Au fait, j'ai créé une classe abstraite en tant que classe cette fois, mais il semble généralement que seul le comportement (nom de la méthode) soit défini dans l'interface."

I "N'écrivez pas le contenu de la méthode dans l'interface, et laissez l'implémentation spécifique à la classe héritée (implémentation forcée de la méthode)."

J'ai dit: "Ce faisant, il sera confirmé que toutes les classes héritées ont des méthodes avec le même nom, donc les perspectives seront meilleures! Il semble que cela s'appelle" polymorphisme "!!"

――Programmation des classes abstraites afin qu'elles puissent être utilisées de différentes manières ―― En d'autres termes, même si les fonctions et méthodes ont le même nom, elles se comportent différemment selon le type.

Résumé

J'ai dit: "Huh. J'ai enfin compris les caractéristiques du style d'écriture. Elles sont toutes merveilleuses."

J'ai dit: "Le type procédural vous permet d'écrire du code qui est facile, rapide et clair si vous créez un programme simple. Cependant, si vous êtes de taille moyenne ou plus grande, c'est un cours direct pour les spaghettis ..."

J'ai dit: "Il semble difficile d'écrire un type fonctionnel, mais dans un développement à grande échelle, il semble être extensible car il est séparé en parties réutilisables, et il semble qu'il y aura moins de bogues."

J'ai dit: "L'orientation des objets semble être forte à grande échelle. Cela semble difficile, mais si elle peut être bien abstraite, la quantité de code diminuera en conséquence!"

J'ai dit: "Au fait, Python a des effets secondaires, mais c'est un langage polyvalent qui peut être programmé même avec un type de fonction et peut être orienté objet! Il semble être un langage multi-paradigme!"

J'ai dit: "C'est pourquoi vous devriez bien apprendre la méthode et l'utiliser correctement! Faites de votre mieux pour bien comprendre Python!"

Oshimai

Recommended Posts

Qu'est-ce que la «programmation fonctionnelle» et «orientée objet»? Édition Python
[Python] Python et sécurité-① Qu'est-ce que Python?
Programmation fonctionnelle dans Python Project Euler 1
Différence entre == et est en python
Programmation fonctionnelle dans Python Project Euler 3
Programmation fonctionnelle dans Python Project Euler 2
Programmation avec Python
Qu'est-ce que python
Qu'est-ce que Python
[Python] Qu'est-ce que la série pandas et DataFrame?
Quel type de langage de programmation est Python?
Qu'est-ce que "mahjong" dans la bibliothèque Python? ??
Essayez un tube de programmation fonctionnel en Python
Comment utiliser is et == en Python
[Python] Qu'est-ce que Pipeline ...
Qu'est-ce que wheezy dans l'image Docker Python?
À propos de la différence entre "==" et "is" en python
Que comparez-vous avec Python et ==?
Programmation Python avec Excel
[Python] Qu'est-ce que virtualenv
Entrez en contact avec la programmation fonctionnelle en JavaScript ou Python 3
Programmation avec Python et Tkinter
Pile et file d'attente en Python
La programmation du concours, c'est quoi (bonus)
[Python] * args ** Qu'est-ce que kwrgs?
Unittest et CI en Python
Ce que j'ai appris en Python
Identité et équivalence: is et == en Python
Cours de base Python (1 Qu'est-ce que Python)
Considérez si la programmation était un anime en Python et C
J'ai essayé de programmer le test du chi carré en Python et Java.
Orienté objet en langage C: "○ ✕ game" a été refacturé et porté en Python
[Swift / Ruby / Python / Java] Programmation orientée objet
[Python] Qu'est-ce qu'une fonction zip?
[Python] Qu'est-ce qu'une instruction with?
Programmation GUI en Python avec Appjar
Qu'est-ce que l'étiquetage dans les prévisions financières?
Différence entre list () et [] en Python
Ce que les débutants pensent de la programmation en 2016
[Introduction à Python3 Jour 1] Programmation et Python
Afficher les photos en Python et html
Utilisez le tissu tel quel en python (fabric3)
Algorithme de tri et implémentation en Python
[Python] Programmation orientée objet apprise avec Pokemon
Python est UnicodeEncodeError dans le menu fixe CodeBox
Manipuler des fichiers et des dossiers en Python
À propos de Python et Cython dtype
[Python] Qu'est-ce que @? (À propos des décorateurs)
Affectations et modifications des objets Python
[Python] Que sont @classmethod et les décorateurs?
[python] Quelle est la clé triée?
Python pour la déclaration ~ Qu'est-ce qui est itérable ~
Vérifiez et déplacez le répertoire en Python
Chiffrement avec Python: IND-CCA2 et RSA-OAEP
Hashing de données en R et Python
Il n'y a pas de commutateur en python
Synthèse de fonctions et application en Python
Exporter et exporter des fichiers en Python
Avec les types de données algébriques et la programmation orientée objet