[Python] Ich habe die Reihenfolge vergessen, weil es zu viele Rückgabewerte gab. ..

Ich las "Effective Python 2nd Edition" und fasste zusammen, wonach ich suchte.

Ist das die Reihenfolge?

Ist das nicht der Fall, wenn Sie Python schreiben? ich habe

unpack.py


#Das ist beruhigend
x, y = point2d

#das ist...Ist es in Ordnung?
weather, precipitation, temperature, humidity = \
    get_meteorological_info(place, time)
print(weather)
print(precipitation)
print(temperature)
print(humidity)

In Python können Sie überall frei Entpackungen und Taples erstellen, sodass die Bedeutung des Codes in der Regel nicht eindeutig ist. In diesem Beispiel hat die Reihenfolge keine besondere Bedeutung. Um dies zu verbessern, erscheint es sinnvoll, entsprechende Einschränkungen festzulegen. In Python kann es durch Verwendung einer Klasse verbessert werden, die Daten darstellt.

was ist zu tun

Es scheint leicht zu verstehen, ob Sie so darauf zugreifen können.

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)

Wenn Sie eine Instanz der Klasse zurückgeben, müssen Sie die Reihenfolge nicht mehr kennen. Sie können etwas Ähnliches mit dict machen, aber ich bin nicht sehr zufrieden mit Problemen wie der Möglichkeit von Tippfehlern und der Vervollständigungsfunktion des Editors, da der Schlüssel str usw. ist.

Es gibt verschiedene Möglichkeiten, dies zu erreichen.

  1. Erstellen Sie gehorsam eine Klasse
  2. Verwenden Sie das benannte Tupel
  3. Verwenden Sie eine Datenklasse (seit Python 3.7).

In Bezug auf die Implementierung sieht es anders aus, aber alle haben gemeinsam, dass sie Klassen erstellen. Persönlich empfehle ich runter zu gehen.

Erstellen Sie gehorsam eine Klasse

Es ist einfach zu erstellen, wenn Sie die Klasse kennen. Ich denke, es ist ein Vorteil, dass jeder sie verstehen kann. Ich habe ein Beispiel geschrieben, aber der Nachteil ist, dass die Beschreibung wie "self.weather = wheather" überflüssig wird.

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

Verwenden Sie benanntes Tupel

https://qiita.com/Seny/items/add4d03876f505442136 Dieser Artikel ist detailliert, aber eine kurze Zusammenfassung. Ich denke, es gibt weniger Redundanz als beim Zeichnen der Klasse. Es wird empfohlen, es als Klasse mit "Typing" zu definieren, da die Vervollständigungsfunktion des Editors verwendet werden kann. Wenn Sie es als veränderbar verwenden möchten, sind Sie möglicherweise in Schwierigkeiten. Ich denke, es ist für kleine Daten.

use_namedtuple.py


from collections import namedtuple

#Die einfachste Definitionsmethode
MeteologicalInfo = namedtuple(
    "MeteologicalInfo",
    [
        "weather",
        "precipitation",
        "temperature",
        "humidity"
    ]
)

#Kann auch mit einem Leerzeichen definiert werden
MeteologicalInfo = namedtuple(
    "MeteologicalInfo",
    "weather precipitation temperature humidity"
)

#Sie können den Standardwert festlegen
MeteologicalInfo.__new__.__defaults__ = ("sunny", 0.0, 25.0, 0.5)

from typing import NamedTuple

#Wie man als Klasse definiert
class MeteologicalInfo(NamedTuple):
    weather      : str
    precipitation: float
    temperature  : float
    humidity     : float

#Sie können auch einen Standardwert festlegen
class MeteologicalInfo(NamedTuple):
    weather      : str   = "sunny"
    precipitation: float = 0.0
    temperature  : float = 25.0
    humidity     : float = 0.5

Datenklasse verwenden (seit Python 3.7)

https://qiita.com/tag1216/items/13b032348c893667862a Es war leicht zu verstehen, wie man das benutzt. https://docs.python.org/ja/3.7/library/dataclasses.html Weitere Informationen finden Sie hier. Ich werde es leicht zusammenfassen.

Ich denke, es ist ein Vorteil, dass es sowohl als veränderlich als auch als unveränderlich für benannte Tupel verwendet werden kann. Ein weiterer Vorteil ist, dass Sie nützliche Funktionen wie dataclasses.field verwenden können. Da es sich jedoch um Python 3.7 oder höher handeln muss, hat es den Nachteil, dass es je nach verwendetem Modul oder verwendeter Umgebung möglicherweise nicht verwendet werden kann.

use_dataclass.py


from dataclasses import dataclass

#Sie können die Klasse als Datenklasse verwenden, indem Sie einen Dekorator verwenden
@dataclass
class MeteologicalInfo:
    weather      : str
    precipitation: float
    temperature  : float
    humidity     : float

#Sie können auch den Standardwert festlegen
@dataclass
class MeteologicalInfo:
    weather      : str   = "sunny"
    precipitation: float = 0.0
    temperature  : float = 25.0
    humidity     : float = 0.5

Zusammenfassung

Wenn die Daten kompliziert werden oder die Anzahl der Variablen zunimmt, können Sie die nicht zusammenhängenden Daten mithilfe von Klassen, Namenstupeln, Datenklassen usw. aussagekräftig machen. Wenn Sie dict und list so verwenden, wie sie sind, gibt es viele Unsicherheiten, wenn das Programm groß wird und sich die Entwicklungsgeschwindigkeit verlangsamt. Ich denke jedoch, dass Sie die Datenstruktur und den Algorithmus in gewissem Maße separat betrachten und Fehler reduzieren können. Ich bin.

Recommended Posts

[Python] Ich habe die Reihenfolge vergessen, weil es zu viele Rückgabewerte gab. ..
[Python] So geben Sie Listenwerte der Reihe nach aus
Ich habe die Python-Quelle heruntergeladen
[Python] Ermittelt den Rang der Werte in der Liste in aufsteigender / absteigender Reihenfolge