logo

Vrste konstant v Pythonu | Pomen konstante v Pythonu

V tej vadnici bomo spoznali vrste konstant in kako pomagajo izboljšati berljivost kode. Če niste seznanjeni, so konstante imena, ki predstavljajo vrednosti, ki se med izvajanjem programa ne spreminjajo. So najpogostejši temeljni koncept v programiranju. Vendar pa Python nima namenske sintakse za definiranje konstant. Na splošno so konstante Python spremenljivke, ki se nikoli ne spremenijo. O konstanti Python bomo podrobno razpravljali v naslednjem razdelku.

Kaj so konstante?

Na splošno se v matematiki uporablja stalni izraz, vrednost ali količina, ki se nikoli ne spremeni. V programiranju se konstanta nanaša na ime, povezano z vrednostjo, ki se med izvajanjem programiranja nikoli ne spremeni. Programska konstanta se razlikuje od drugih konstant in je sestavljena iz dveh stvari - imena in povezane vrednosti. Ime bo opisalo, za kaj konstanta sploh gre, vrednost pa je konkreten izraz same konstante.

Ko definiramo konstanto, lahko samo dostopamo do njene vrednosti, ne moremo pa je spreminjati skozi čas. Lahko pa spremenimo vrednost spremenljivke. Primer iz resničnega življenja je - svetlobna hitrost, število minut v eni uri in ime korenske mape projekta.

Zakaj uporabljati Constant?

V programskih jezikih nam konstante omogočajo zaščito pred nenamerno spremembo njihove vrednosti, ki lahko povzroči napake, ki jih je težko odpraviti. Prav tako je koristno narediti kodo bolj berljivo in vzdržljivo. Oglejmo si nekaj prednosti konstante.

    Izboljšana berljivost -Pomaga izboljšati berljivost kode. Na primer, lažje je brati in razumeti konstanto z imenom MAX_SPEED kot samo znatno vrednost hitrosti.Jasna komunikacija namere -Večina razvijalcev meni, da je 3.14 konstanta pi. Vendar bo ime Pi, pi ali PI jasneje sporočalo namen. Ta praksa bo drugemu razvijalcu omogočila razumevanje naše kode.Boljša vzdržljivost -Konstante nam omogočajo uporabo iste vrednosti v vaši kodi. Recimo, da želimo posodobiti vrednost konstante; ni nam treba spreminjati vsakega primerka.Majhno tveganje napak -Konstanta, ki predstavlja dano vrednost v celotnem programu, je manj nagnjena k napakam. Če želimo spremeniti natančnost v izračunih, je lahko zamenjava vrednosti tvegana. Namesto da bi jo zamenjali, lahko ustvarimo različne konstante za različne stopnje natančnosti in spremenimo kodo, kjer jo potrebujemo.Nitno varno shranjevanje podatkov -Konstante so predmeti, varni za niti, kar pomeni, da lahko več niti hkrati uporablja konstanto, ne da bi pri tem tvegali izgubo podatkov.

Uporabniško določene konstante

Za definiranje konstante v Pythonu moramo uporabiti konvencijo o poimenovanju v Pythonu. Ime naj pišemo z velikimi tiskanimi črkami s podčrtajem, ki ločuje besede.

Sledi primer uporabniško definiranih konstant Python -

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

Uporabili smo enak način, kot ustvarjamo spremenljivke v Pythonu. Torej lahko domnevamo, da so konstante Python le spremenljivke in edina razlika je, da konstanta uporablja samo velike črke.

Z uporabo velikih črk konstanta izstopa iz naših spremenljivk in je uporabna ali prednostna praksa.

Zgoraj smo razpravljali o uporabniško določenih uporabnikih; Python ponuja tudi več notranjih imen, ki jih je mogoče upoštevati in jih je treba obravnavati kot konstante.

Pomembne konstante v Pythonu

V tem razdelku bomo spoznali nekatere notranje konstante, ki se uporabljajo za boljšo berljivost kode Python. Razumejmo nekaj pomembnih konstant.

Vgrajene konstante

V uradni dokumentaciji je Prav in False so navedene kot prva konstanta. To so logične vrednosti Python in so primerek int. A Prav ima vrednost 1 in False ima vrednost 0.

Primer -

blagajna v git
 >>> 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 

Ne pozabite, da so imena True in False stroge konstante. Z drugimi besedami, ne moremo jih dodeliti znova, in če jih poskušamo znova dodeliti, bomo prejeli sintaktično napako. Ti dve vrednosti sta enojni objekti v Pythonu, kar pomeni, da obstaja samo en primerek.

Notranja Dunderjeva imena

Python ima tudi veliko notranjih grmenje imena, ki jih lahko štejemo za konstante. Obstaja več teh edinstvenih imen, o __name__ in __file__ bomo izvedeli v tem razdelku.

Atribut __name__ je povezan s tem, kako zagnati dani del kode. Pri uvozu modula Python interno nastavi __name__ na niz, ki vsebuje ime modula.

nova_datoteka.py

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

V ukazno vrstico vnesite naslednji ukaz -

 python -c 'import new_file' 

-c se uporablja za izvajanje majhnega dela kode Pythona v ukazni vrstici. V zgornjem primeru smo uvozili nova_datoteka modul, ki prikazuje nekaj sporočil na zaslonu.

Izhod -

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

Kot lahko vidimo, da __name__ shrani niz __main__, to pomeni, da lahko izvajamo datoteke neposredno kot program Python.

Po drugi strani ima atribut __file__ datoteko, ki jo Python trenutno uvaža ali izvaja. Če uporabimo atribut __file__ znotraj datoteke, bomo dobili pot do samega modula.

Poglejmo naslednji primer -

Primer -

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

Izhod:

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

Lahko tečemo tudi neposredno in dobili bomo enak rezultat.

Primer -

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

Izhod:

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

Uporabni nizi in matematične konstante

V standardni knjižnici je veliko dragocenih konstant. Nekateri so strogo povezani z določenimi moduli, funkcijami in razredi; mnogi so generični in jih lahko uporabimo v več scenarijih. V spodnjem primeru bomo uporabili matematične in z nizi povezane module math in string.

Razumejmo naslednji primer -

Primer -

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

Te konstante bodo imele ključno vlogo, ko pišemo kodo, povezano z matematiko, ali izvajamo nekatere posebne izračune.

Razumejmo naslednji primer -

inurl:.git/head

Primer -

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

V zgornji kodi smo uporabili matematika.pi namesto po meri PI konstante. Konstanta, povezana z matematiko, zagotavlja programu več kontekstov. Prednost uporabe konstante math.pi je, da če uporabljamo starejšo različico Pythona, bomo dobili 32-bitno različico Pi. Če zgornji program uporabimo v sodobni različici Pythona, bomo dobili 64-bitno različico pi. Tako se bo naš program sam prilagodil svojemu konkretnemu izvajalnemu okolju.

Modul nizov ponuja tudi nekaj uporabnih vgrajenih konstant nizov. Spodaj je tabela imen in vrednosti vsake konstante.

Ime Vrednost
ascii_male črke Abcdefghijklmnopqrstuvwxyz
ascii_velike črke ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_črke ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
števke 0123456789
hexdigits 0123456789abcdefABCDEF
octdigits 01234567

Te konstante, povezane z nizi, lahko uporabimo v regularnih izrazih, obdelavi naravnega jezika, z veliko obdelavo nizov in več.

Konstante za označevanje tipa

Od Pythona 3.8 modul za tipkanje vključuje razred Final, ki nam omogoča vnašanje oznak konstant. Če za definiranje konstant v programu uporabimo razred Final, bomo dobili napako statičnega tipa, ki jo preveri preverjalnik mypy in bo pokazal, da ne moremo dodeliti imena Final. Razumejmo naslednji primer.

Primer -

 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) 

Določili smo konstantno spremenljivko s končnim razredom, ki je nakazal napako tipa za poročanje o napaki, če je deklarirano ime ponovno dodeljeno. Vendar pa dobi poročilo o napaki preverjalnika vrst; Python spremeni vrednost MAX_SPEED. Torej Final ne preprečuje nenehnega naključnega prerazporejanja med izvajanjem.

Konstante nizov

Kot je bilo razloženo v prejšnjem razdelku, Python ne podpira strogih konstant; ima le spremenljivke, ki se nikoli ne spremenijo. Zato skupnost Python sledi konvenciji o poimenovanju uporabe velike črke za identifikacijo konstantnih spremenljivk.

Težava je lahko, če delamo na velikem projektu Python z veliko programerji na različnih ravneh. Zato bi bilo dobro imeti mehanizem, ki bi nam omogočal uporabo strogih konstant. Kot vemo, je Python dinamičen jezik in obstaja več načinov, kako narediti konstante nespremenljive. V tem razdelku bomo spoznali nekatere od teh načinov.

Atributi .__slots__

Razredi Python omogočajo uporabo atributov __slots__. Reža ima poseben mehanizem za zmanjšanje velikosti predmetov. Gre za koncept optimizacije pomnilnika na objektih. Če v razredu uporabimo atribut __slots__, ne bomo mogli dodati novega primerka, ker ne uporablja atributov __dict__. Poleg tega, če nimate a .__dict__ atribut pomeni optimizacijo v smislu porabe pomnilnika. Razumejmo naslednji primer.

Primer – brez uporabe atributov __slots__

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

Izhod -

java nit ustvari
 {'a': 1, 'b': 2} 

Vsak objekt v Pythonu vsebuje dinamični slovar, ki omogoča dodajanje atributov. Slovarji porabijo veliko pomnilnika in uporaba __slotov__ zmanjša izgubo prostora in pomnilnika. Poglejmo še en primer.

Primer -

 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) 

Izhod -

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

V zgornji kodi smo inicializirali atribute razreda z atributi slotov. Spremenljivka ima konstantno vrednost, če poskusimo spremenljivko znova dodeliti, bomo dobili napako.

@property dekorater

Lahko tudi uporabimo @lastnina dekorater za ustvarjanje razreda, ki deluje kot imenski prostor za konstante. Samo definirati moramo lastnost konstant, ne da bi jim zagotovili metodo nastavitve. Razumejmo naslednji primer.

Primer -

 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) 

Izhod -

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

So le lastnosti samo za branje, če poskusimo znova dodeliti, bomo dobili AttributeError.

Tovarniška funkcija namedtuple().

Zbiralni modul Pythona ima tovarniško funkcijo, imenovano namedtuple(). Uporabljati namedtuple() funkcijo, lahko uporabimo imenovana polja in zapis s pikami za dostop do njihovih elementov. Vemo, da so tuple nespremenljive, kar pomeni, da ne moremo spreminjati obstoječega imenovanega tuple objekta na mestu.

Razumejmo naslednji primer.

Primer -

 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) 

Izhod -

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

@dataclass dekorater

Kot že ime pove, podatkovni razred hrani podatke, lahko so sestavljeni iz metod, vendar to ni njihov primarni cilj. Za ustvarjanje podatkovnih razredov moramo uporabiti dekorater @dataclass. Ustvarimo lahko tudi stroge konstante. Dekorater @dataclass sprejme zamrznjen argument, ki nam omogoča, da naš podatkovni razred označimo kot nespremenljiv. Prednosti uporabe dekoraterja @dataclass, ne moremo spremeniti njegovega atributa primerka.

Razumejmo naslednji primer.

Primer -

 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) 

Izhod -

 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' 

Pojasnilo -

V zgornji kodi smo uvozili dekorater @dataclass. Ta dekorator smo uporabili za ConstantsName, da bi ga naredili za podatkovni razred. Zamrznjeni argument smo nastavili na True, da je razred podatkov nespremenljiv. Ustvarili smo primerek podatkovnega razreda in lahko dostopamo do vseh konstant, vendar jih ne moremo spreminjati.

Posebna metoda .__setattr__().

Python nam omogoča uporabo posebne metode, imenovane .__setattr__(). S to metodo lahko prilagodimo postopek dodeljevanja atributa, ker Python samodejno pokliče metodo pri vsaki dodelitvi atributa. Razumejmo naslednji primer -

10 ml do oz

Primer -

 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) 

Izhod -

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

Metoda __setattr__() ne dovoljuje izvajanja nobene operacije dodelitve atributom razreda. Če poskušamo prerazporediti, samo dvigne an AttributeError.

Zaključek

Konstante se najbolj uporabljajo v konceptu programiranja, zlasti v matematičnem smislu. V tej vadnici smo se seznanili s pomembnimi koncepti konstant in njihovih okusov. Skupnost Python uporablja velike črke kot dogovor o imenih za identifikacijo konstant. Vendar smo razpravljali o nekaterih naprednih načinih uporabe konstant v Pythonu. Razpravljali smo o tem, kako s konstantami izboljšati berljivost, ponovno uporabnost in vzdržljivost kode. Omenili smo, kako uporabiti različne tehnike, da bodo naše Python konstante strogo konstantne.