logo

Typer af konstant i Python | Betydningen af ​​konstant i Python

I denne øvelse lærer vi om de konstante typer, og hvordan de hjælper med at forbedre kodelæsbarheden. Hvis du ikke er bekendt, er konstanterne de navne, der repræsenterer værdier, der ikke ændres under programmets afvikling. De er det mest almindelige grundlæggende koncept inden for programmering. Python har dog ikke en dedikeret syntaks til at definere konstanter. Generelt er Python-konstanter variable, der aldrig ændres. Vi vil have en detaljeret diskussion om Python-konstanten i det kommende afsnit.

Hvad er konstanter?

Generelt bruges et konstant udtryk i matematik, en værdi eller mængde, der aldrig ændres. I programmering refererer en konstant til det navn, der er forbundet med en værdi, der aldrig ændres under programmeringsudførelsen. Programmeringskonstanten er anderledes end andre konstanter, og den består af to ting – et navn og en tilhørende værdi. Navnet vil beskrive, hvad konstanten handler om, og værdien er det konkrete udtryk for selve konstanten.

Når vi først har defineret konstanten, kan vi kun få adgang til dens værdi, men kan ikke ændre den over tid. Vi kan dog ændre værdien af ​​variablen. Et eksempel fra det virkelige liv er - Lysets hastighed, antallet af minutter i en time og navnet på et projekts rodmappe.

Hvorfor bruge konstant?

I programmeringssprog giver konstanter os mulighed for at beskytte mod utilsigtet ændring af deres værdi, hvilket kan forårsage svære at debugge fejl. Det er også nyttigt at gøre koden mere læsbar og vedligeholdelig. Lad os se nogle fordele ved konstant.

    Forbedret læsbarhed -Det er med til at forbedre kodens læsbarhed. For eksempel er det lettere at læse og forstå en konstant med navnet MAX_SPEED end selve den væsentlige hastighedsværdi.Klar hensigtskommunikation -De fleste udviklere betragter 3.14 som pi-konstanten. Pi-, pi- eller PI-navnet vil dog kommunikere hensigten mere tydeligt. Denne praksis vil give en anden udvikler mulighed for at forstå vores kode.Bedre vedligeholdelse -Konstanter giver os mulighed for at bruge den samme værdi i hele din kode. Antag, at vi ønsker at opdatere konstantens værdi; vi behøver ikke at ændre alle tilfælde.Lav risiko for fejl -En konstant, der repræsenterer en given værdi gennem et program, er mindre udsat for fejl. Hvis vi ønsker at ændre præcisionen i beregningerne, kan det være risikabelt at erstatte værdien. I stedet for at erstatte det, kan vi skabe forskellige konstanter for forskellige præcisionsniveauer og ændre koden, hvor vi havde brug for det.Trådsikker datalagring -En konstanter er trådsikre objekter, hvilket betyder, at flere tråde kan bruge en konstant samtidigt uden at risikere at miste data.

Brugerdefinerede konstanter

Vi skal bruge navnekonventionen i Python til at definere konstanten i Python. Vi skal skrive navnet med store bogstaver med understregninger, der adskiller ord.

Følgende er eksemplet på de brugerdefinerede Python-konstanter -

 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', ... ] 

Vi har brugt samme måde, som vi laver variabler i Python. Så vi kan antage, at Python-konstanter kun er variable, og den eneste forskel er, at konstanten kun bruger store bogstaver.

Brug af store bogstaver får konstanten til at skille sig ud fra vores variabler og er en nyttig eller foretrukken praksis.

Ovenfor diskuterede vi de brugerdefinerede brugere; Python giver også flere interne navne, der kan overvejes og bør behandles som konstanter.

Vigtige konstanter i Python

I dette afsnit vil vi lære om nogle interne konstanter, som bruges til at gøre Python-koden mere læsbar. Lad os forstå nogle vigtige konstanter.

Indbyggede konstanter

I den officielle dokumentation Rigtigt og Falsk er angivet som den første konstant. Disse er Python Boolean-værdier og er forekomsten af ​​int. EN Rigtigt har en værdi på 1, og Falsk har en værdi 0.

Eksempel -

 >>> 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 

Husk, at Sande og Falske navne er strenge konstanter. Vi kan med andre ord ikke gentildele dem, og hvis vi forsøger at gentildele dem, får vi en syntaksfejl. Disse to værdier er singleton-objekter i Python, hvilket betyder, at der kun eksisterer én instans.

Interne Dunder-navne

Python har også mange interne torden navne, som vi kan betragte som konstanter. Der er flere af disse unikke navne, vi vil lære om __navn__ og __fil__ i dette afsnit.

__name__-attributten er relateret til, hvordan man kører et givet stykke kode. Når du importerer et modul, sætter Python internt __navn__ til en streng, der indeholder modulets navn.

ny_fil.py

 print(f'The type of __name__ is: {type(__name__)}') print(f'The value of __name__ is: {__name__}') 

I kommandolinjen og skriv følgende kommando -

 python -c 'import new_file' 

-c bruges til at udføre et lille stykke kode af Python på kommandolinjen. I ovenstående eksempel importerede vi ny_fil modul, som viser nogle meddelelser på skærmen.

Output -

 The type of __name__ is: The value of __name__ is: timezone 

Da vi kan se, at __name__ gemmer __main__-strengen, indikerer det, at vi kan køre de eksekverbare filer direkte som Python-program.

På den anden side har __file__-attributten den fil, som Python i øjeblikket importerer eller udfører. Hvis vi bruger __file__ attributten inde i filen, får vi stien til selve modulet.

Lad os se følgende eksempel -

Eksempel -

 print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}') 

Produktion:

 The type of __file__ is: The value of __file__ is: D:Python Project
ew_file.py 

Vi kan også køre direkte og vil få samme resultat.

Eksempel -

 print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}') 

Produktion:

 python new_file.py The type of __file__ is: The value of __file__ is: timezone.py 

Nyttige streng- og matematikkonstanter

Der er mange værdifulde konstanter i standardbiblioteket. Nogle er strengt forbundet med specifikke moduler, funktioner og klasser; mange er generiske, og vi kan bruge dem i flere scenarier. I nedenstående eksempel vil vi bruge matematik og streng-relaterede moduler henholdsvis matematik og streng.

Lad os forstå følgende eksempel -

Eksempel -

 >>> 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 

Disse konstanter vil spille en afgørende rolle, når vi skriver matematikrelateret kode eller udfører nogle specifikke beregninger.

Lad os forstå følgende eksempel -

Eksempel -

 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})' 

I ovenstående kode har vi brugt math.pi i stedet for skik PI konstanter. Den matematik-relaterede konstant giver jo flere sammenhænge til programmet. Fordelen ved at bruge math.pi konstant er, at hvis vi bruger en ældre version af Python, får vi en 32-bit version af Pi. Hvis vi bruger ovenstående program i moderne version af Python, får vi en 64-bit version af pi. Så vores program tilpasser sig dets konkrete eksekveringsmiljø.

Strengemodulet giver også nogle nyttige indbyggede strengkonstanter. Nedenfor er tabellen med navn og værdi af hver konstant.

Navn Værdi
ascii_små bogstaver Abcdefghijklmnopqrstuvwxyz
ascii_store bogstaver ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_bogstaver ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
cifre 0123456789
sekscifre 0123456789abcdefABCDEF
oktcifre 01234567

Vi kan bruge disse strengrelaterede konstanter i regulære udtryk, behandling af naturligt sprog, med en masse strengbehandling og mere.

Type-annoterende konstanter

Siden Python 3.8 har indtastningsmodulet en Final-klasse, der giver os mulighed for at skrive-annotere konstanter. Hvis vi bruger Final-klassen til at definere konstanterne i programmet, får vi den statiske typefejl, som mypy-kontrollen tjekker, og den vil vise, at vi ikke kan tildele det endelige navn igen. Lad os forstå følgende eksempel.

Eksempel -

 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) 

Vi specificerede konstantvariablen med den endelige klasse, der indikerede typefejlen, for at rapportere en fejl, hvis et erklæret navn omtildeles. Den får dog en rapport om en typekontrolfejl; Python ændrer værdien af ​​MAX_SPEED. Så Final forhindrer ikke konstant utilsigtet omfordeling under kørsel.

Strengkonstanter

Som diskuteret i det tidligere afsnit, understøtter Python ikke strenge konstanter; den har bare variabler, der aldrig ændrer sig. Derfor følger Python-fællesskabet navnekonventionen med at bruge det store bogstav til at identificere de konstante variable.

Det kan være et problem, hvis vi arbejder på et stort Python-projekt med mange programmører på forskellige niveauer. Så det ville være god praksis at have en mekanisme, der giver os mulighed for at bruge strenge konstanter. Som vi ved, er Python et dynamisk sprog, og der er flere måder at gøre konstanter uforanderlige på. I dette afsnit vil vi lære om nogle af disse måder.

.__slots__-attributterne

Python-klasser giver mulighed for at bruge __slots__-attributterne. Slottet har den specielle mekanisme til at reducere størrelsen af ​​genstandene. Det er et koncept for hukommelsesoptimering på objekter. Hvis vi bruger attributten __slots__ i klassen, vil vi ikke være i stand til at tilføje den nye instans, fordi den ikke bruger __dict__ attributter. Derudover ikke at have en .__dikt__ attribut indebærer en optimering med hensyn til hukommelsesforbrug. Lad os forstå følgende eksempel.

Eksempel - Uden at bruge __slots__ attributter

 class NewClass(object): def __init__(self, *args, **kwargs): self.a = 1 self.b = 2 if __name__ == '__main__': instance = NewClass() print(instance.__dict__) 

Output -

 {'a': 1, 'b': 2} 

Hvert objekt i Python indeholder en dynamisk ordbog, der tillader tilføjelse af attributter. Ordbøger bruger masser af hukommelse, og brug af __slots__ reducerer spild af plads og hukommelse. Lad os se et andet eksempel.

Eksempel -

 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) 

Output -

 3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 10, in AttributeError: 'ConstantsName' object attribute 'PI' is read-only 

I ovenstående kode initialiserede vi klasseattributterne med slots-attributterne. Variablen har en konstant værdi, hvis vi forsøger at gentildele variablen, får vi en fejl.

@ejendomsdekoratøren

Vi kan også bruge @ejendom dekorator for at skabe en klasse, der fungerer som et navneområde for konstanter. Vi skal blot definere egenskaben konstanter uden at give dem en sættermetode. Lad os forstå følgende eksempel.

Eksempel -

 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) 

Output -

 3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 13, in AttributeError: can't set attribute 

De er kun skrivebeskyttede egenskaber, hvis vi forsøger at omtildele, får vi en AttributError.

Den namedtuple() fabriksfunktion

Pythons samlingsmodul kommer med fabriksfunktionen kaldet namedtuple(). Bruger namedtuple() funktion, kan vi bruge de navngivne felter og priknotationen til at få adgang til deres elementer. Vi ved, at tuples er uforanderlige, hvilket betyder, at vi ikke kan ændre et eksisterende navngivet tuple-objekt på plads.

Lad os forstå følgende eksempel.

lang til streng java

Eksempel -

 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) 

Output -

 3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 17, in AttributeError: can't set attribute 

@dataclass-dekoratøren

Som navnet antyder, indeholder dataklassen data, de kan bestå af metoder, men det er ikke deres primære mål. Vi skal bruge @dataclass dekoratoren til at oprette dataklasserne. Vi kan også skabe de strenge konstanter. @dataclass dekoratoren tager et fastfrosset argument, der giver os mulighed for at markere vores dataklasse som uforanderlig. Fordelene ved at bruge @dataclass decorator, vi kan ikke ændre dens instansattribut.

Lad os forstå følgende eksempel.

Eksempel -

 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) 

Output -

 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' 

Forklaring -

I ovenstående kode har vi importeret @dataclass dekoratoren. Vi brugte denne dekorator til ConstantsName for at gøre det til en dataklasse. Vi sætter det frosne argument til True for at gøre dataklassen uforanderlig. Vi oprettede forekomsten af ​​dataklassen, og vi kan få adgang til alle konstanterne, men kan ikke ændre dem.

Den .__setattr__() særlige metode

Python giver os mulighed for at bruge en speciel metode kaldet .__setattr__(). Ved at bruge denne metode kan vi tilpasse attributtildelingsprocessen, fordi Python automatisk kalder metoden på hver attributtildeling. Lad os forstå følgende eksempel -

Eksempel -

 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) 

Output -

 3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 22, in File '', line 17, in __setattr__ AttributeError: can't reassign constant 'PI' 

Metoden __setattr__() tillader ikke at udføre nogen tildelingshandling på klassens attributter. Hvis vi forsøger at omfordele, hæver det bare en AttributError.

Konklusion

Konstanter er mest brugt i koncept i programmering, især i matematisk sigt. I denne tutorial har vi lært om de vigtige begreber om konstanterne og dens smag. Python-fællesskabet bruger store bogstaver som en navnekonvention til at identificere konstanterne. Vi har dog diskuteret nogle avancerede måder at bruge konstanterne i Python på. Vi har diskuteret, hvordan man kan forbedre kodens læsbarhed, genbrugelighed og vedligeholdelse med konstanter. Vi nævnte, hvordan man anvender forskellige teknikker for at gøre vores Python-konstanter strengt konstante.