In diesem Tutorial lernen wir die Konstantentypen kennen und erfahren, wie sie zur Verbesserung der Codelesbarkeit beitragen. Falls Sie es nicht kennen: Bei den Konstanten handelt es sich um Namen, die Werte darstellen, die sich während der Programmausführung nicht ändern. Sie sind das häufigste Grundkonzept in der Programmierung. Python verfügt jedoch nicht über eine spezielle Syntax zum Definieren von Konstanten. Im Allgemeinen sind Python-Konstanten Variablen, die sich nie ändern. Wir werden im nächsten Abschnitt eine ausführliche Diskussion über die Python-Konstante führen.
Was sind Konstanten?
Im Allgemeinen wird in der Mathematik ein konstanter Term verwendet, ein Wert oder eine Größe, die sich nie ändert. In der Programmierung bezieht sich eine Konstante auf den Namen, der einem Wert zugeordnet ist, der sich während der Programmierausführung nie ändert. Programmierkonstanten unterscheiden sich von anderen Konstanten und bestehen aus zwei Dingen: einem Namen und einem zugehörigen Wert. Der Name beschreibt, worum es bei der Konstante geht, und der Wert ist der konkrete Ausdruck der Konstante selbst.
Sobald wir die Konstante definiert haben, können wir nur auf ihren Wert zugreifen, ihn aber im Laufe der Zeit nicht ändern. Wir können jedoch den Wert der Variablen ändern. Ein Beispiel aus der Praxis ist: Die Lichtgeschwindigkeit, die Anzahl der Minuten in einer Stunde und der Name des Stammordners eines Projekts.
Warum Konstante verwenden?
In Programmiersprachen können wir mit Konstanten verhindern, dass sich ihr Wert versehentlich ändert, was zu schwer zu debuggenden Fehlern führen kann. Es ist auch hilfreich, den Code lesbarer und wartbarer zu machen. Sehen wir uns einige Vorteile der Konstante an.
Benutzerdefinierte Konstanten
Wir müssen die Namenskonvention in Python verwenden, um die Konstante in Python zu definieren. Wir sollten den Namen in Großbuchstaben schreiben und die Wörter durch Unterstriche trennen.
Im Folgenden finden Sie ein Beispiel für die benutzerdefinierten Python-Konstanten:
PI = 3.14 MAX_SPEED = 300 DEFAULT_COLOR = ' 33[1;34m' WIDTH = 20 API_TOKEN = '567496396372' BASE_URL = 'https://api.example.com' DEFAULT_TIMEOUT = 5 BUILTINS_METHODS = ('sum', 'max', 'min', 'abs') INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', ... ]
Wir haben die gleiche Methode verwendet, mit der wir Variablen in Python erstellen. Wir können also davon ausgehen, dass Python-Konstanten nur Variablen sind und der einzige Unterschied darin besteht, dass die Konstante nur Großbuchstaben verwendet.
Die Verwendung von Großbuchstaben hebt die Konstante von unseren Variablen ab und ist eine nützliche oder bevorzugte Vorgehensweise.
Oben haben wir die benutzerdefinierten Benutzer besprochen; Python bietet außerdem mehrere interne Namen, die als Konstanten betrachtet werden können und behandelt werden sollten.
Wichtige Konstanten in Python
In diesem Abschnitt lernen wir einige interne Konstanten kennen, die verwendet werden, um Python-Code lesbarer zu machen. Lassen Sie uns einige wichtige Konstanten verstehen.
Integrierte Konstanten
In der offiziellen Dokumentation heißt es: WAHR Und FALSCH werden als erste Konstante aufgeführt. Dies sind boolesche Python-Werte und die Instanz des int. A WAHR hat einen Wert von 1 und FALSCH hat den Wert 0.
Beispiel -
>>> True True >>> False False >>> isinstance(True, int) True >>> isinstance(False, int) True >>> int(True) 1 >>> int(False) 0 >>> True = 42 ... SyntaxError: cannot assign to True >>> True is True True >>> False is False True
Denken Sie daran, dass wahre und falsche Namen strikte Konstanten sind. Mit anderen Worten: Wir können sie nicht neu zuweisen, und wenn wir versuchen, sie neu zuzuweisen, erhalten wir einen Syntaxfehler. Diese beiden Werte sind Singleton-Objekte in Python, was bedeutet, dass nur eine Instanz vorhanden ist.
Interne Dunder-Namen
Python hat auch viele interne Donner Namen, die wir als Konstanten betrachten können. Es gibt mehrere dieser eindeutigen Namen. In diesem Abschnitt erfahren Sie mehr über __name__ und __file__.
Das Attribut __name__ hängt davon ab, wie ein bestimmter Code ausgeführt wird. Beim Importieren eines Moduls setzt Python intern den __name__ auf eine Zeichenfolge, die den Namen des Moduls enthält.
neue_datei.py
print(f'The type of __name__ is: {type(__name__)}') print(f'The value of __name__ is: {__name__}')
Geben Sie in der Befehlszeile den folgenden Befehl ein:
python -c 'import new_file'
Das -c wird verwendet, um einen kleinen Codeabschnitt von Python in der Befehlszeile auszuführen. Im obigen Beispiel haben wir die importiert neue Datei Modul, das einige Meldungen auf dem Bildschirm anzeigt.
Ausgabe -
The type of __name__ is: The value of __name__ is: timezone
Wie wir sehen können, speichert __name__ die Zeichenfolge __main__, was darauf hinweist, dass wir die ausführbaren Dateien direkt als Python-Programm ausführen können.
Andererseits enthält das Attribut __file__ die Datei, die Python gerade importiert oder ausführt. Wenn wir das Attribut __file__ innerhalb der Datei verwenden, erhalten wir den Pfad zum Modul selbst.
Sehen wir uns das folgende Beispiel an:
Beispiel -
print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}')
Ausgabe:
The type of __file__ is: The value of __file__ is: D:Python Project ew_file.py
Wir können auch direkt ausführen und erhalten das gleiche Ergebnis.
Konvertierung von Datum in Zeichenfolge
Beispiel -
print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}')
Ausgabe:
python new_file.py The type of __file__ is: The value of __file__ is: timezone.py
Nützliche String- und Mathematikkonstanten
Die Standardbibliothek enthält viele wertvolle Konstanten. Einige sind strikt an bestimmte Module, Funktionen und Klassen gebunden; Viele sind generisch und wir können sie in verschiedenen Szenarien verwenden. Im folgenden Beispiel verwenden wir die math- und stringbezogenen Module math bzw. string.
Lassen Sie uns das folgende Beispiel verstehen:
Beispiel -
>>> import math >>> math.pi 3.141592653589793 >>> math.tau 6.283185307179586 >>> math.nan nan >>> math.inf inf >>> math.sin(30) -0.9880316240928618 >>> math.cos(60) -0.9524129804151563 >>> math.pi 3.141592653589793
Diese Konstanten spielen eine entscheidende Rolle, wenn wir mathematischen Code schreiben oder bestimmte Berechnungen durchführen.
Lassen Sie uns das folgende Beispiel verstehen:
Beispiel -
import math class Sphere: def __init__(self, radius): self.radius = radius def area(self): return math.pi * self.radius**2 def perimeter(self): return 2 * math.pi * self.radius def projected_volume(self): return 4/3 * math.pi * self.radius**3 def __repr__(self): return f'{self.__class__.__name__}(radius={self.radius})'
Im obigen Code haben wir verwendet math.pi statt Brauch PI Konstanten. Die mathematikbezogene Konstante stellt dem Programm mehr Kontexte zur Verfügung. Der Vorteil der Verwendung der Konstante math.pi besteht darin, dass wir eine 32-Bit-Version von Pi erhalten, wenn wir eine ältere Version von Python verwenden. Wenn wir das obige Programm in einer modernen Version von Python verwenden, erhalten wir eine 64-Bit-Version von Pi. Unser Programm passt sich also selbst an seine konkrete Ausführungsumgebung an.
Das String-Modul bietet außerdem einige nützliche integrierte String-Konstanten. Unten finden Sie eine Tabelle mit Namen und Werten jeder Konstante.
Name | Wert |
---|---|
ascii_lowercase | Abcdefghijklmnopqrstuvwxyz |
ascii_uppercase | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
ascii_letters | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz |
Ziffern | 0123456789 |
Hexadezimalzahlen | 0123456789abcdefABCDEF |
achtstellige Ziffern | 01234567 |
Wir können diese stringbezogenen Konstanten in regulären Ausdrücken verwenden, natürliche Sprache verarbeiten, viele Strings verarbeiten und vieles mehr.
Typkommentierende Konstanten
Seit Python 3.8 enthält das Typisierungsmodul eine Final-Klasse, die es uns ermöglicht, Konstanten mit Typannotationen zu versehen. Wenn wir die Final-Klasse verwenden, um die Konstanten im Programm zu definieren, erhalten wir den statischen Typfehler, den der Mypy-Checker überprüft, und es wird angezeigt, dass wir den Final-Namen nicht neu zuweisen können. Lassen Sie uns das folgende Beispiel verstehen.
Beispiel -
from typing import Final MAX_Marks: Final[int] = 300 MAX_Students: Final[int] = 500 MAX_Marks = 450 # Cannot assign to final name 'MAX_SPEED' mypy(error)
Wir haben die konstante Variable mit der Final Class angegeben, die den Typfehler angab, um einen Fehler zu melden, wenn ein deklarierter Name neu zugewiesen wird. Es wird jedoch ein Fehlerbericht einer Typprüfung angezeigt. Python ändert den Wert von MAX_SPEED. Final verhindert also nicht eine ständige versehentliche Neuzuweisung zur Laufzeit.
String-Konstanten
Wie im vorherigen Abschnitt erläutert, unterstützt Python keine strengen Konstanten; Es gibt nur Variablen, die sich nie ändern. Daher folgt die Python-Community der Namenskonvention, bei der die konstanten Variablen mit Großbuchstaben gekennzeichnet werden.
Es kann ein Problem sein, wenn wir an einem großen Python-Projekt mit vielen Programmierern auf unterschiedlichen Ebenen arbeiten. Daher wäre es eine gute Praxis, über einen Mechanismus zu verfügen, der es uns ermöglicht, strenge Konstanten zu verwenden. Wie wir wissen, ist Python eine dynamische Sprache und es gibt mehrere Möglichkeiten, Konstanten unveränderlich zu machen. In diesem Abschnitt erfahren Sie mehr über einige dieser Möglichkeiten.
Die .__slots__-Attribute
Python-Klassen bieten die Möglichkeit, die __slots__-Attribute zu verwenden. Der Schlitz verfügt über einen speziellen Mechanismus, um die Größe der Objekte zu reduzieren. Es handelt sich um ein Konzept zur Speicheroptimierung für Objekte. Wenn wir das __slots__-Attribut in der Klasse verwenden, können wir die neue Instanz nicht hinzufügen, da sie keine __dict__-Attribute verwendet. Darüber hinaus fehlt ein .__dict__ Das Attribut impliziert eine Optimierung hinsichtlich des Speicherverbrauchs. Lassen Sie uns das folgende Beispiel verstehen.
Beispiel – Ohne Verwendung von __slots__-Attributen
class NewClass(object): def __init__(self, *args, **kwargs): self.a = 1 self.b = 2 if __name__ == '__main__': instance = NewClass() print(instance.__dict__)
Ausgabe -
{'a': 1, 'b': 2}
Jedes Objekt in Python enthält ein dynamisches Wörterbuch, das das Hinzufügen von Attributen ermöglicht. Wörterbücher verbrauchen viel Speicher und die Verwendung von __slots__ reduziert die Verschwendung von Speicherplatz und Speicher. Sehen wir uns ein weiteres Beispiel an.
Beispiel -
class ConstantsName: __slots__ = () PI = 3.141592653589793 EULER_NUMBER = 2.718281828459045 constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI)
Ausgabe -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 10, in AttributeError: 'ConstantsName' object attribute 'PI' is read-only
Im obigen Code haben wir die Klassenattribute mit den Slots-Attributen initialisiert. Die Variable hat einen konstanten Wert. Wenn wir versuchen, die Variable neu zuzuweisen, erhalten wir eine Fehlermeldung.
Der @property Dekorateur
Wir können auch verwenden @Eigentum decorator, um eine Klasse zu erstellen, die als Namespace für Konstanten fungiert. Wir müssen lediglich die Konstanteneigenschaft definieren, ohne ihnen eine Setter-Methode zur Verfügung zu stellen. Lassen Sie uns das folgende Beispiel verstehen.
Beispiel -
class ConstantsName: @property def PI(self): return 3.141592653589793 @property def EULER_NUMBER(self): return 2.718281828459045 constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI)
Ausgabe -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 13, in AttributeError: can't set attribute
Es handelt sich lediglich um schreibgeschützte Eigenschaften. Wenn wir versuchen, sie neu zuzuweisen, erhalten wir eine AttributeError.
Die Fabrikfunktion „namedtuple()“.
Das Sammlungsmodul von Python enthält die Factory-Funktion namens „namedtuple()“. Verwendung der benannttuple() Mit der Funktion können wir die benannten Felder und die Punktnotation verwenden, um auf ihre Elemente zuzugreifen. Wir wissen, dass Tupel unveränderlich sind, was bedeutet, dass wir ein vorhandenes benanntes Tupelobjekt nicht an Ort und Stelle ändern können.
Maschinelles Lernen und Typen
Lassen Sie uns das folgende Beispiel verstehen.
Beispiel -
from collections import namedtuple ConstantsName = namedtuple( 'ConstantsName', ['PI', 'EULER_NUMBER'] ) constant = ConstantsName(3.141592653589793, 2.718281828459045) print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI)
Ausgabe -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 17, in AttributeError: can't set attribute
Der @dataclass-Dekorator
Wie der Name schon sagt, enthält die Datenklasse Daten, sie können aus Methoden bestehen, aber das ist nicht ihr primäres Ziel. Wir müssen den @dataclass-Dekorator verwenden, um die Datenklassen zu erstellen. Wir können auch die strengen Konstanten erstellen. Der @dataclass-Dekorator akzeptiert ein eingefrorenes Argument, das es uns ermöglicht, unsere Datenklasse als unveränderlich zu markieren. Der Vorteil der Verwendung des @dataclass-Dekorators besteht darin, dass wir seine Instanzattribute nicht ändern können.
Lassen Sie uns das folgende Beispiel verstehen.
Beispiel -
from dataclasses import dataclass @dataclass(frozen=True) class ConstantsName: PI = 3.141592653589793 EULER_NUMBER = 2.718281828459045 constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI)
Ausgabe -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 19, in File '', line 4, in __setattr__ dataclasses.FrozenInstanceError: cannot assign to field 'PI'
Erläuterung -
Im obigen Code haben wir den @dataclass-Dekorator importiert. Wir haben diesen Dekorator für ConstantsName verwendet, um daraus eine Datenklasse zu machen. Wir setzen das Frozen-Argument auf True, um die Datenklasse unveränderlich zu machen. Wir haben die Instanz der Datenklasse erstellt und können auf alle Konstanten zugreifen, sie jedoch nicht ändern.
Die spezielle Methode .__setattr__()
Mit Python können wir eine spezielle Methode namens .__setattr__() verwenden. Mit dieser Methode können wir den Attributzuweisungsprozess anpassen, da Python die Methode bei jeder Attributzuweisung automatisch aufruft. Lassen Sie uns das folgende Beispiel verstehen:
Beispiel -
class ConstantsName: PI = 3.141592653589793 EULER_NUMBER = 2.718281828459045 def __setattr__(self, name, value): raise AttributeError(f'can't reassign constant '{name}'') constant = ConstantsName() print(constant.PI) print(constant.EULER_NUMBER) constant.PI = 3.14 print(constant.PI)
Ausgabe -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 22, in File '', line 17, in __setattr__ AttributeError: can't reassign constant 'PI'
Die Methode __setattr__() erlaubt keine Zuweisungsoperation für die Attribute der Klasse. Wenn wir versuchen, eine Neuzuweisung vorzunehmen, wird nur ein Fehler ausgelöst AttributeError.
Abschluss
Konstanten werden konzeptionell am häufigsten in der Programmierung verwendet, insbesondere in mathematischer Hinsicht. In diesem Tutorial haben wir die wichtigen Konzepte der Konstanten und ihrer Varianten kennengelernt. Die Python-Community verwendet Großbuchstaben als Namenskonvention, um die Konstanten zu identifizieren. Wir haben jedoch einige fortgeschrittene Möglichkeiten zur Verwendung der Konstanten in Python besprochen. Wir haben besprochen, wie man mit Konstanten die Lesbarkeit, Wiederverwendbarkeit und Wartbarkeit von Code verbessern kann. Wir haben erwähnt, wie man verschiedene Techniken anwendet, um unsere Python-Konstanten streng konstant zu machen.