logo

Vrste konstanti u Pythonu | Važnost konstante u Pythonu

U ovom vodiču naučit ćemo o tipovima konstanti i kako one pomažu u poboljšanju čitljivosti koda. Ako niste upoznati, konstante su imena koja predstavljaju vrijednosti koje se ne mijenjaju tijekom izvođenja programa. Oni su najčešći temeljni koncept u programiranju. Međutim, Python nema posebnu sintaksu za definiranje konstanti. Općenito, Python konstante su varijable koje se nikada ne mijenjaju. Imat ćemo detaljnu raspravu o Python konstanti u sljedećem odjeljku.

Što su konstante?

Općenito, u matematici se koristi stalni pojam, vrijednost ili količina koja se nikada ne mijenja. U programiranju, konstanta se odnosi na ime povezano s vrijednošću koja se nikada ne mijenja tijekom izvođenja programiranja. Programska konstanta razlikuje se od ostalih konstanti, a sastoji se od dvije stvari - imena i pridružene vrijednosti. Naziv će opisati o čemu se konstanta radi, a vrijednost je konkretan izraz same konstante.

Jednom kada definiramo konstantu, možemo samo pristupiti njenoj vrijednosti, ali je ne možemo mijenjati tijekom vremena. Međutim, možemo promijeniti vrijednost varijable. Primjer iz stvarnog života je - brzina svjetlosti, broj minuta u satu i naziv korijenske mape projekta.

java spojiti nizove

Zašto koristiti Constant?

U programskim jezicima, konstante nam omogućuju zaštitu od slučajne promjene njihove vrijednosti koja može uzrokovati pogreške koje je teško otkloniti. Također je korisno kod učiniti čitljivijim i lakšim za održavanje. Pogledajmo neke prednosti konstante.

    Poboljšana čitljivost -Pomaže poboljšati čitljivost koda. Na primjer, lakše je čitati i razumjeti konstantu pod nazivom MAX_SPEED nego samu bitnu vrijednost brzine.Jasna komunikacija namjere -Većina programera smatra 3.14 pi konstantom. Međutim, naziv Pi, pi ili PI jasnije će izraziti namjeru. Ova praksa će omogućiti drugom programeru da razumije naš kod.Bolja održivost -Konstante nam omogućuju korištenje iste vrijednosti u cijelom kodu. Pretpostavimo da želimo ažurirati vrijednost konstante; ne trebamo mijenjati svaku instancu.Nizak rizik od grešaka -Konstanta koja predstavlja zadanu vrijednost u cijelom programu manje je sklona greškama. Ako želimo promijeniti preciznost u izračunima, zamjena vrijednosti može biti riskantna. Umjesto da ga zamijenimo, možemo stvoriti različite konstante za različite razine preciznosti i promijeniti kod gdje nam je potrebno.Nitno sigurno pohranjivanje podataka -Konstante su objekti sigurni za niti, što znači da nekoliko niti može istovremeno koristiti konstantu bez opasnosti od gubitka podataka.

Korisnički definirane konstante

Moramo upotrijebiti konvenciju imenovanja u Pythonu da bismo definirali konstantu u Pythonu. Ime trebamo napisati velikim slovima s podvlakama koje razdvajaju riječi.

Slijede primjeri korisnički definiranih Python konstanti -

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

Koristili smo isti način kao što stvaramo varijable u Pythonu. Stoga možemo pretpostaviti da su Python konstante samo varijable, a jedina razlika je u tome što konstanta koristi samo velika slova.

Upotreba velikih slova ističe konstantu među našim varijablama i korisna je ili poželjna praksa.

Gore smo raspravljali o korisnički definiranim korisnicima; Python također nudi nekoliko internih imena koja se mogu smatrati i trebaju tretirati kao konstante.

Važne konstante u Pythonu

U ovom odjeljku naučit ćemo o nekim internim konstantama koje se koriste kako bi Python kod bio čitljiviji. Hajdemo razumjeti neke važne konstante.

Ugrađene konstante

U službenoj dokumentaciji, Pravi i lažno navedeni su kao prva konstanta. Ovo su Python Boolean vrijednosti i instanca su int. A Pravi ima vrijednost 1, i lažno ima vrijednost 0.

Primjer -

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

Zapamtite da su True i False imena striktne konstante. Drugim riječima, ne možemo ih ponovno dodijeliti, a ako ih pokušamo ponovno dodijeliti, dobit ćemo sintaktičku pogrešku. Ove dvije vrijednosti su singleton objekti u Pythonu, što znači da postoji samo jedna instanca.

Interna Dunder imena

Python također ima mnogo internih grmljavina imena koja možemo smatrati konstantama. Postoji nekoliko ovih jedinstvenih imena, u ovom odjeljku naučit ćemo o __name__ i __file__.

Atribut __name__ povezan je s načinom pokretanja određenog dijela koda. Prilikom uvoza modula, Python interno postavlja __name__ na niz koji sadrži naziv modula.

nova_datoteka.py

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

U naredbeni redak upišite sljedeću naredbu -

 python -c 'import new_file' 

-c se koristi za izvršavanje malog dijela koda Pythona u naredbenom retku. U gornjem primjeru uvezli smo nova_datoteka modul, koji prikazuje neke poruke na ekranu.

Izlaz -

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

Kao što možemo vidjeti da __name__ pohranjuje __main__ string, označava da možemo pokrenuti izvršne datoteke izravno kao Python program.

S druge strane, atribut __file__ ima datoteku koju Python trenutno uvozi ili izvršava. Ako koristimo atribut __file__ unutar datoteke, dobit ćemo putanju do samog modula.

Pogledajmo sljedeći primjer -

Primjer -

tvrdi uvez vs meki uvez
 print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}') 

Izlaz:

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

Također možemo trčati izravno i dobit ćemo isti rezultat.

Primjer -

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

Izlaz:

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

Korisne string i matematičke konstante

Postoje mnoge vrijedne konstante u standardnoj biblioteci. Neki su strogo povezani s određenim modulima, funkcijama i klasama; mnogi su generički i možemo ih koristiti u nekoliko scenarija. U donjem primjeru koristit ćemo module math i string povezane s matematikom i stringom.

Razumimo sljedeći primjer -

Primjer -

 >>> 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 će konstante igrati vitalnu ulogu kada pišemo matematički kod ili izvodimo neke specifične proračune.

Razumimo sljedeći primjer -

Primjer -

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

U gornjem kodu koristili smo matematika.pi umjesto običaja PI konstante. Konstanta povezana s matematikom daje više konteksta programu. Prednost korištenja math.pi konstante je ta što ćemo, ako koristimo stariju verziju Pythona, dobiti 32-bitnu verziju Pija. Ako gornji program koristimo u modernoj verziji Pythona, dobit ćemo 64-bitnu verziju pi-ja. Dakle, naš program će se sam prilagoditi svom konkretnom okruženju izvršenja.

Modul string također pruža neke korisne ugrađene konstante niza. Ispod je tablica naziva i vrijednosti svake konstante.

Ime Vrijednost
ascii_mala slova Abcdefghijklmnopqrstuvwxyz
ascii_veliko slovo ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_slova ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
znamenke 0123456789
hex znamenke 0123456789abcdefABCDEF
osmeroznamenkasti 01234567

Ove konstante povezane sa nizovima možemo koristiti u regularnim izrazima, obradi prirodnog jezika, s puno obrade nizova i više.

Konstante označavanja tipa

Od Pythona 3.8, modul za tipkanje uključuje Finalnu klasu koja nam omogućuje upisivanje bilješki konstanti. Ako koristimo klasu Final za definiranje konstanti u programu, dobit ćemo statičku pogrešku tipa koju provjerava mypy checker i pokazat će da ne možemo ponovno dodijeliti naziv Final. Razumimo sljedeći primjer.

Primjer -

 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) 

Specificirali smo konstantnu varijablu s konačnom klasom koja je ukazala na pogrešku tipa za prijavu pogreške ako se deklarirano ime ponovno dodijeli. Međutim, dobiva izvješće o pogrešci provjere tipa; Python mijenja vrijednost MAX_SPEED. Dakle, Final ne sprječava stalno slučajno ponovno dodjeljivanje tijekom izvođenja.

String konstante

Kao što je objašnjeno u prethodnom odjeljku, Python ne podržava striktne konstante; samo ima varijable koje se nikad ne mijenjaju. Stoga zajednica Pythona slijedi konvenciju imenovanja korištenja velikih slova za identifikaciju konstantnih varijabli.

Može biti problem ako radimo na velikom Python projektu s mnogo programera na različitim razinama. Stoga bi bilo dobro imati mehanizam koji nam omogućuje korištenje strogih konstanti. Kao što znamo, Python je dinamičan jezik i postoji nekoliko načina da konstante učinite nepromjenjivima. U ovom odjeljku naučit ćemo o nekim od tih načina.

Atributi .__slots__

Klase Pythona omogućuju korištenje atributa __slots__. Utor ima poseban mehanizam za smanjenje veličine predmeta. To je koncept optimizacije memorije na objektima. Ako koristimo atribut __slots__ u klasi, nećemo moći dodati novu instancu jer ne koristi atribute __dict__. Osim toga, nemanje a .__dict__ atribut implicira optimizaciju u smislu potrošnje memorije. Razumimo sljedeći primjer.

Primjer - bez korištenja atributa __slots__

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

Izlaz -

linkedlist i arraylist
 {'a': 1, 'b': 2} 

Svaki objekt u Pythonu sadrži dinamički rječnik koji omogućuje dodavanje atributa. Rječnici troše puno memorije, a korištenje __slotova__ smanjuje rasipanje prostora i memorije. Pogledajmo još jedan primjer.

Primjer -

 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) 

Izlaz -

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

U gornjem kodu, inicijalizirali smo atribute klase s atributima utora. Varijabla ima konstantnu vrijednost, ako pokušamo ponovno dodijeliti varijablu, dobit ćemo grešku.

@property dekorater

Također možemo koristiti @vlasništvo dekorater za stvaranje klase koja radi kao imenski prostor za konstante. Samo trebamo definirati svojstvo konstanti bez davanja metode postavljača. Razumimo sljedeći primjer.

Primjer -

 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) 

Izlaz -

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

Oni su samo svojstva samo za čitanje, ako ih pokušamo ponovno dodijeliti, dobit ćemo AttributeError.

webdriver

Tvornička funkcija namedtuple().

Pythonov modul za prikupljanje dolazi s tvorničkom funkcijom koja se zove namedtuple(). Koristiti namedtuple() možemo upotrijebiti imenovana polja i točku za pristup njihovim stavkama. Znamo da su torke nepromjenjive, što znači da ne možemo mijenjati postojeći imenovani objekt tuple na mjestu.

Razumimo sljedeći primjer.

Primjer -

 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) 

Izlaz -

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

@dataclass dekorater

Kao što joj ime govori, klasa podataka sadrži podatke, mogu se sastojati od metoda, ali im to nije primarni cilj. Moramo upotrijebiti @dataclass dekorater za stvaranje klasa podataka. Također možemo stvoriti stroge konstante. @dataclass dekorater uzima zamrznuti argument koji nam omogućuje da našu klasu podataka označimo kao nepromjenjivu. Prednosti korištenja dekoratera @dataclass, ne možemo mijenjati njegov atribut instance.

Razumimo sljedeći primjer.

Primjer -

 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) 

Izlaz -

 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' 

Objašnjenje -

U gornjem kodu smo uvezli @dataclass dekorater. Koristili smo ovaj dekorater za ConstantsName kako bismo ga napravili klasom podataka. Postavili smo zamrznuti argument na True kako bismo klasu podataka učinili nepromjenjivom. Stvorili smo instancu klase podataka i možemo pristupiti svim konstantama, ali ih ne možemo mijenjati.

Posebna metoda .__setattr__().

Python nam omogućuje korištenje posebne metode koja se zove .__setattr__(). Pomoću ove metode možemo prilagoditi proces dodjele atributa jer Python automatski poziva metodu pri svakoj dodjeli atributa. Razumimo sljedeći primjer -

Primjer -

 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) 

Izlaz -

 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 dopušta izvođenje nijedne operacije dodjele na atributima klase. Ako pokušamo preraspodijeliti, to samo podiže AttributeError.

Zaključak

Konstante se najviše koriste u konceptu programiranja, posebno u matematičkom smislu. U ovom vodiču smo naučili o važnim konceptima konstanti i njihovih okusa. Python zajednica koristi veliko slovo kao konvenciju naziva za identifikaciju konstanti. Međutim, raspravljali smo o nekim naprednim načinima korištenja konstanti u Pythonu. Raspravljali smo o tome kako poboljšati čitljivost koda, mogućnost ponovne upotrebe i održavanja pomoću konstanti. Spomenuli smo kako primijeniti različite tehnike kako bi naše Python konstante bile strogo konstantne.