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é.
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 ..."
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."
―― É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"
J'ai dit: "Hmm ??? Un mot difficile est sorti ..."
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?"
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?"
--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). "
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."
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.
prix
est calculé automatiquement
--ʻUnit_pricedonne une erreur lors de la tentative de définition d'une valeur en dehors de la plage --Erreur en essayant de définir une valeur directement sur
price`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
J'ai dit: "Quand je veux créer à nouveau une classe de viande, je vais créer une classe concrète enhéritant de
la 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 !!!"
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.
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