logo

Typer konstant i Python | Viktigheten av konstant i Python

I denne opplæringen vil vi lære om konstanttypene og hvordan de bidrar til å forbedre kodelesbarheten. Hvis du ikke er kjent, er konstantene navnene som representerer verdier som ikke endres under programmets kjøring. De er det vanligste grunnleggende konseptet innen programmering. Python har imidlertid ikke en dedikert syntaks for å definere konstanter. Generelt er Python-konstanter variable som aldri endres. Vi vil ha en detaljert diskusjon om Python-konstanten i den kommende delen.

Hva er konstanter?

Generelt brukes en konstant term i matematikk, en verdi eller mengde som aldri endres. I programmering refererer en konstant til navnet assosiert med en verdi som aldri endres under programmeringsutførelsen. Programmeringskonstanten er forskjellig fra andre konstanter, og den består av to ting – et navn og en tilhørende verdi. Navnet vil beskrive hva konstanten handler om, og verdien er det konkrete uttrykket for selve konstanten.

Når vi har definert konstanten, kan vi bare få tilgang til verdien, men kan ikke endre den over tid. Vi kan imidlertid endre verdien av variabelen. Et eksempel fra virkeligheten er - Lysets hastighet, antall minutter i en time og navnet på et prosjekts rotmappe.

Hvorfor bruke konstant?

I programmeringsspråk lar konstanter oss beskytte mot å endre verdien ved et uhell, noe som kan forårsake vanskelige feilsøkingsfeil. Det er også nyttig å gjøre koden mer lesbar og vedlikeholdbar. La oss se noen fordeler med konstant.

    Forbedret lesbarhet -Det bidrar til å forbedre lesbarheten til koden. For eksempel er det lettere å lese og forstå en konstant kalt MAX_SPEED enn selve den betydelige hastighetsverdien.Klar kommunikasjon av intensjon -De fleste utviklere anser 3.14 som pi-konstanten. Imidlertid vil Pi-, pi- eller PI-navnet kommunisere intensjonen tydeligere. Denne praksisen vil tillate en annen utvikler å forstå koden vår.Bedre vedlikehold -Konstanter lar oss bruke samme verdi gjennom hele koden din. Anta at vi ønsker å oppdatere konstantens verdi; vi trenger ikke å endre alle forekomster.Lav risiko for feil -En konstant som representerer en gitt verdi gjennom et program er mindre utsatt for feil. Hvis vi ønsker å endre presisjonen i beregningene, kan det være risikabelt å erstatte verdien. I stedet for å erstatte den, kan vi lage forskjellige konstanter for forskjellige presisjonsnivåer og endre koden der vi trengte.Trådsikker datalagring -En konstanter er trådsikre objekter, noe som betyr at flere tråder kan bruke en konstant samtidig uten å risikere å miste data.

Brukerdefinerte konstanter

Vi må bruke navnekonvensjonen i Python for å definere konstanten i Python. Vi bør skrive navnet med store bokstaver med understreker som skiller ord.

Følgende er eksempelet på de brukerdefinerte Python-konstantene -

 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 brukt samme måte som vi lager variabler i Python. Så vi kan anta at Python-konstanter bare er variabler, og den eneste forskjellen er at konstanten bare bruker store bokstaver.

Ved å bruke store bokstaver skiller konstanten seg ut fra variablene våre og er en nyttig eller foretrukket praksis.

Ovenfor diskuterte vi de brukerdefinerte brukerne; Python gir også flere interne navn som kan vurderes og bør behandles som konstanter.

Viktige konstanter i Python

I denne delen vil vi lære om noen interne konstanter som brukes for å gjøre Python-koden mer lesbar. La oss forstå noen viktige konstanter.

Innebygde konstanter

I den offisielle dokumentasjonen ekte og Falsk er oppført som den første konstanten. Dette er Python boolske verdier og er forekomsten av int. EN ekte har en verdi på 1, og Falsk har en verdi 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 sanne og falske navn er strenge konstanter. Vi kan med andre ord ikke tilordne dem på nytt, og hvis vi prøver å tilordne dem på nytt, får vi en syntaksfeil. Disse to verdiene er singleton-objekter i Python, noe som betyr at bare én forekomst eksisterer.

Interne Dunder-navn

Python har også mange interne torden navn som vi kan betrakte som konstanter. Det er flere av disse unike navnene, vi vil lære om __navn__ og __fil__ i denne delen.

__name__-attributtet er relatert til hvordan du kjører et gitt kodestykke. Når du importerer en modul, setter Python intern __navn__ til en streng som inneholder navnet på modulen.

ny_fil.py

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

På kommandolinjen og skriv inn følgende kommando -

 python -c 'import new_file' 

-c brukes til å utføre et lite stykke kode av Python på kommandolinjen. I eksemplet ovenfor importerte vi ny_fil modul, som viser noen meldinger på skjermen.

Utgang -

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

Ettersom vi kan se at __name__ lagrer __main__-strengen, indikerer det at vi kan kjøre de kjørbare filene direkte som Python-program.

På den annen side har __file__-attributtet filen som Python importerer eller kjører. Hvis vi bruker __file__-attributtet inne i filen, får vi banen til selve modulen.

La oss se følgende eksempel -

Eksempel -

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

Produksjon:

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

Vi kan også kjø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__}') 

Produksjon:

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

Nyttige streng- og matematikkkonstanter

Det er mange verdifulle konstanter i standardbiblioteket. Noen er strengt knyttet til spesifikke moduler, funksjoner og klasser; mange er generiske, og vi kan bruke dem i flere scenarier. I eksemplet nedenfor vil vi bruke matematiske og strengrelaterte moduler matte og streng, henholdsvis.

La oss 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 konstantene vil spille en viktig rolle når vi skriver matematikkrelatert kode eller utfører noen spesifikke beregninger.

La oss 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 koden ovenfor har vi brukt math.pi i stedet for tilpasset PI konstanter. Den matematiske konstanten gir jo flere kontekster til programmet. Fordelen med å bruke math.pi konstant er at hvis vi bruker en eldre versjon av Python, vil vi få en 32-bit versjon av Pi. Hvis vi bruker programmet ovenfor i moderne versjon av Python, vil vi få en 64-bit versjon av pi. Så vårt program vil tilpasse seg dets konkrete utførelsesmiljø.

Strengemodulen gir også noen nyttige innebygde strengkonstanter. Nedenfor er tabellen med navn og verdi for hver konstant.

Navn Verdi
ascii_små bokstaver Abcdefghijklmnopqrstuvwxyz
ascii_store bokstaver ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_bokstaver ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
sifre 0123456789
heksadesifre 0123456789abcdefABCDEF
oktsifret 01234567

Vi kan bruke disse strengrelaterte konstantene i regulære uttrykk, behandling av naturlig språk, med mye strengbehandling og mer.

Type-annoterende konstanter

Siden Python 3.8 inkluderer skrivemodulen en Final-klasse som lar oss skrive-kommentarer konstanter. Hvis vi bruker Final-klassen til å definere konstantene i programmet, vil vi få den statiske typefeilen som mypy-kontrollen sjekker og den vil vise at vi ikke kan tilordne det endelige navnet på nytt. La oss 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 spesifiserte konstantvariabelen med den endelige klassen som indikerte typefeilen for å rapportere en feil hvis et deklarert navn blir tildelt på nytt. Den får imidlertid en rapport om en typekontrollørfeil; Python endrer verdien på MAX_SPEED. Så, Final forhindrer ikke konstant utilsiktet omfordeling under kjøretid.

Strengkonstanter

Som diskutert i den tidligere delen, støtter ikke Python strenge konstanter; den har bare variabler som aldri endres. Derfor følger Python-fellesskapet navnekonvensjonen med å bruke stor bokstav for å identifisere konstantvariablene.

Det kan være et problem hvis vi jobber med et stort Python-prosjekt med mange programmerere på forskjellige nivåer. Så det ville være god praksis å ha en mekanisme som lar oss bruke strenge konstanter. Som vi vet er Python et dynamisk språk, og det er flere måter å gjøre konstanter uforanderlige på. I denne delen vil vi lære om noen av disse måtene.

.__slots__-attributtene

Python-klasser gir mulighet for å bruke __slots__-attributtene. Sporet har den spesielle mekanismen for å redusere størrelsen på gjenstandene. Det er et konsept for minneoptimalisering på objekter. Hvis vi bruker __slots__-attributtet i klassen, vil vi ikke kunne legge til den nye forekomsten, fordi den ikke bruker __dict__-attributter. I tillegg har ikke en .__dict__ attributt innebærer en optimalisering når det gjelder minneforbruk. La oss forstå følgende eksempel.

Eksempel - Uten å bruke __slots__-attributter

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

Utgang -

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

Hvert objekt i Python inneholder en dynamisk ordbok som lar deg legge til attributter. Ordbøker bruker mye minne, og bruk av __spor__ reduserer sløsing med plass og minne. La oss se et annet 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) 

Utgang -

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

I koden ovenfor initialiserte vi klasseattributtene med sporattributtene. Variabelen har en konstant verdi, hvis vi prøver å tilordne variabelen på nytt, får vi en feil.

@property-dekoratøren

Vi kan også bruke @eiendom dekorator for å lage en klasse som fungerer som et navneområde for konstanter. Vi trenger bare å definere egenskapen konstanter uten å gi dem en settermetode. La oss 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) 

Utgang -

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

De er bare skrivebeskyttede egenskaper, hvis vi prøver å tilordne på nytt, får vi en AttributeError.

Den namedtuple() fabrikkfunksjonen

Pythons samlingsmodul kommer med fabrikkfunksjonen kalt namedtuple(). Bruker namedtuple() funksjon, kan vi bruke de navngitte feltene og punktnotasjonen for å få tilgang til elementene deres. Vi vet at tupler er uforanderlige, noe som betyr at vi ikke kan endre et eksisterende navngitt tuppelobjekt på plass.

La oss forstå følgende eksempel.

diana mary blacker

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) 

Utgang -

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

@dataclass-dekoratøren

Som navnet antyder, inneholder dataklassen data, de kan bestå av metoder, men det er ikke deres primære mål. Vi må bruke @dataclass-dekoratoren for å lage dataklassene. Vi kan også lage de strenge konstantene. @dataclass-dekoratoren tar et fryst argument som lar oss merke dataklassen vår som uforanderlig. Fordelene ved å bruke @dataclass decorator, vi kan ikke endre instansattributtet.

La oss 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) 

Utgang -

 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 koden ovenfor har vi importert @dataclass-dekoratoren. Vi brukte denne dekoratoren til ConstantsName for å gjøre den til en dataklasse. Vi satte det frosne argumentet til True for å gjøre dataklassen uforanderlig. Vi opprettet forekomsten av dataklassen, og vi kan få tilgang til alle konstantene, men kan ikke endre dem.

.__setattr__() spesialmetoden

Python lar oss bruke en spesiell metode kalt .__setattr__(). Ved å bruke denne metoden kan vi tilpasse attributttilordningsprosessen fordi Python automatisk kaller metoden på hver attributttilordning. La oss 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) 

Utgang -

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

__setattr__()-metoden tillater ikke å utføre noen tildelingsoperasjon på klassens attributter. Hvis vi prøver å omdisponere, øker det bare en AttributeError.

Konklusjon

Konstanter er mest brukt i konsept i programmering, spesielt i matematisk term. I denne opplæringen har vi lært om de viktige konseptene for konstantene og dens smaker. Python-samfunnet bruker store bokstaver som en navnekonvensjon for å identifisere konstantene. Vi har imidlertid diskutert noen forhåndsmåter for å bruke konstantene i Python. Vi har diskutert hvordan man kan forbedre kodens lesbarhet, gjenbrukbarhet og vedlikeholdbarhet med konstanter. Vi nevnte hvordan man bruker forskjellige teknikker for å gjøre Python-konstantene våre strengt konstante.