[Python] J'ai oublié la commande car il y avait trop de valeurs de retour. ..

Je lisais "Effective Python 2nd Edition" et j'ai résumé ce que j'ai recherché.

Est-ce l'ordre?

N'est-ce pas le cas lors de l'écriture de Python? j'ai

unpack.py


#C'est rassurant
x, y = point2d

#c'est...Est-ce en ordre?
weather, precipitation, temperature, humidity = \
    get_meteorological_info(place, time)
print(weather)
print(precipitation)
print(temperature)
print(humidity)

En Python, vous pouvez créer librement des décompressions et des taples n'importe où, de sorte que la signification du code a tendance à être ambiguë. Dans cet exemple, l'ordre n'a pas de signification particulière. Afin d'améliorer cela, il semble bon de donner des restrictions appropriées. En Python, il peut être amélioré en utilisant une classe qui représente des données.

Que faire

Il semble facile de comprendre si vous pouvez y accéder de cette manière.

no_unpack.py


info_meteo = get_meteorological_info(place, time)
print(info_meteo.weather)
print(info_meteo.precipitation)
print(info_meteo.temperature)
print(info_meteo.humidity)

En renvoyant une instance de la classe, vous n'avez plus besoin de connaître la commande. Vous pouvez faire quelque chose de similaire avec dict, mais je ne suis pas très satisfait des problèmes tels que la possibilité de fautes de frappe et la fonction de complétion de l'éditeur car la clé est str etc.

Il existe plusieurs façons d'y parvenir.

  1. Créez une classe docilement
  2. Utilisez un tuple nommé
  3. Utilisez la classe de données (depuis Python 3.7)

Cela semble différent en termes d'implémentation, mais ils ont tous en commun de créer des classes. Personnellement, je recommande de descendre.

Créez une classe docilement

Si vous connaissez la classe, vous pouvez facilement la créer, donc je pense que c'est un avantage que tout le monde puisse la comprendre. J'ai écrit un exemple, mais l'inconvénient est que la description comme self.weather = wheather devient redondante.

simple_class.py


class MeteologicalInfo:
    def __init__(
            self,
            weather: str,
            precipitation: float,
            temperature: float,
            humidity: float):
        self.weather = weather
        self.precipitation = precipitation
        self.temperature = temperature
        self.humidity = humidity

Utiliser un tuple nommé

https://qiita.com/Seny/items/add4d03876f505442136 Cet article est détaillé, mais un bref résumé. Je pense qu'il y a moins de redondance que lorsque j'ai dessiné la classe telle qu'elle est. Il est recommandé de la définir comme une classe en utilisant typing car la fonction de complétion de l'éditeur peut être utilisée. Si vous souhaitez l'utiliser comme mutable, vous avez peut-être des problèmes. Je pense que c'est pour les petites données.

use_namedtuple.py


from collections import namedtuple

#La méthode de définition la plus simple
MeteologicalInfo = namedtuple(
    "MeteologicalInfo",
    [
        "weather",
        "precipitation",
        "temperature",
        "humidity"
    ]
)

#Peut également être défini avec un séparateur d'espace
MeteologicalInfo = namedtuple(
    "MeteologicalInfo",
    "weather precipitation temperature humidity"
)

#Vous pouvez définir la valeur par défaut
MeteologicalInfo.__new__.__defaults__ = ("sunny", 0.0, 25.0, 0.5)

from typing import NamedTuple

#Comment se définir en tant que classe
class MeteologicalInfo(NamedTuple):
    weather      : str
    precipitation: float
    temperature  : float
    humidity     : float

#Vous pouvez également définir une valeur par défaut
class MeteologicalInfo(NamedTuple):
    weather      : str   = "sunny"
    precipitation: float = 0.0
    temperature  : float = 25.0
    humidity     : float = 0.5

Utiliser la classe de données (depuis Python 3.7)

https://qiita.com/tag1216/items/13b032348c893667862a Il était facile de comprendre comment l'utiliser. https://docs.python.org/ja/3.7/library/dataclasses.html Plus d'informations ici. Je vais le résumer facilement.

Je pense que c'est un avantage qu'il peut être utilisé à la fois comme mutable et immuable pour le tuple nommé. Un autre avantage est que vous pouvez utiliser des fonctions utiles telles que dataclasses.field. Cependant, comme il doit s'agir de Python 3.7 ou supérieur, il présente l'inconvénient de ne pas être utilisable en fonction du module ou de l'environnement que vous utilisez.

use_dataclass.py


from dataclasses import dataclass

#Vous pouvez utiliser la classe comme une classe de données à l'aide d'un décorateur
@dataclass
class MeteologicalInfo:
    weather      : str
    precipitation: float
    temperature  : float
    humidity     : float

#Vous pouvez également définir la valeur par défaut
@dataclass
class MeteologicalInfo:
    weather      : str   = "sunny"
    precipitation: float = 0.0
    temperature  : float = 25.0
    humidity     : float = 0.5

Résumé

Lorsque les données se compliquent ou que le nombre de variables augmente, vous pouvez rendre les données disjointes significatives en utilisant des classes, namedtuple, dataclass, etc. Si vous utilisez dict et list tels quels, il y aura de nombreuses incertitudes lorsque le programme deviendra volumineux et que la vitesse de développement ralentira, mais je pense que vous pouvez penser à la structure de données et à l'algorithme séparément dans une certaine mesure et réduire les erreurs. Je suis.

Recommended Posts

[Python] J'ai oublié la commande car il y avait trop de valeurs de retour. ..
[Python] Comment afficher les valeurs de liste dans l'ordre
J'ai téléchargé la source python
[python] Obtenez le rang des valeurs dans la liste par ordre croissant / décroissant