logo

Konstantos tipai Python | Konstantos svarba Python

Šioje pamokoje sužinosime apie pastovius tipus ir kaip jie padeda pagerinti kodo skaitomumą. Jei nesate susipažinę, konstantos yra pavadinimai, nurodantys reikšmes, kurios nesikeičia vykdant programą. Jie yra labiausiai paplitusi pagrindinė programavimo sąvoka. Tačiau Python neturi specialios sintaksės konstantoms apibrėžti. Apskritai Python konstantos yra kintamos, kurios niekada nesikeičia. Išsamiai aptarsime Python konstantą būsimame skyriuje.

Kas yra konstantos?

Paprastai matematikoje naudojamas pastovus terminas, vertė arba dydis, kuris niekada nesikeičia. Programuojant konstanta nurodo pavadinimą, susietą su reikšme, kuri niekada nesikeičia programavimo metu. Programavimo konstanta skiriasi nuo kitų konstantų ir susideda iš dviejų dalykų – pavadinimo ir susijusios reikšmės. Pavadinimas apibūdins, kas yra konstanta, o reikšmė yra konkreti pačios konstantos išraiška.

Apibrėžę konstantą, galime pasiekti tik jos vertę, bet negalime jos pakeisti laikui bėgant. Tačiau galime keisti kintamojo reikšmę. Realus pavyzdys: šviesos greitis, minučių skaičius per valandą ir projekto šakninio aplanko pavadinimas.

Kodėl verta naudoti „Constant“?

Programavimo kalbose konstantos leidžia apsisaugoti nuo netyčinio jų vertės pakeitimo, dėl kurio gali atsirasti sunkiai derinamų klaidų. Taip pat naudinga padaryti kodą skaitomesnį ir lengviau prižiūrimą. Pažiūrėkime keletą konstantos pranašumų.

    Patobulintas skaitomumas –Tai padeda pagerinti kodo skaitomumą. Pavyzdžiui, lengviau perskaityti ir suprasti konstantą, pavadintą MAX_SPEED, nei pačią esminę greičio reikšmę.Aiškus ketinimų pareiškimas -Dauguma kūrėjų 3.14 laiko pi konstanta. Tačiau Pi, pi arba PI pavadinimas aiškiai parodys ketinimą. Ši praktika leis kitam kūrėjui suprasti mūsų kodą.Geresnė priežiūra –Konstantos leidžia naudoti tą pačią reikšmę visame jūsų kode. Tarkime, kad norime atnaujinti konstantos reikšmę; mums nereikia keisti kiekvieno atvejo.Maža klaidų rizika -Konstanta, vaizduojanti nurodytą reikšmę visoje programoje, yra mažiau klaidų. Jei norime pakeisti skaičiavimų tikslumą, vertės pakeitimas gali būti rizikingas. Užuot jį pakeitę, galime sukurti skirtingas konstantas skirtingiems tikslumo lygiams ir pakeisti kodą ten, kur mums reikia.Saugi duomenų saugykla –A konstantos yra gijų saugūs objektai, o tai reiškia, kad kelios gijos gali vienu metu naudoti konstantą nerizikuodami prarasti duomenis.

Vartotojo nustatytos konstantos

Norėdami apibrėžti Python konstantą, turime naudoti pavadinimų suteikimo tvarką Python. Vardą turėtume rašyti didžiosiomis raidėmis su apatiniais brūkšniais, skiriančiais žodžius.

Toliau pateikiamas vartotojo apibrėžtų Python konstantų pavyzdys -

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

Mes naudojome tą patį būdą, kaip kurdami kintamuosius Python. Taigi galime manyti, kad Python konstantos yra tik kintamieji, o vienintelis skirtumas yra tas, kad konstantoje naudojamos tik didžiosios raidės.

Naudojant didžiąsias raides konstanta išsiskiria iš mūsų kintamųjų ir yra naudinga arba pageidaujama praktika.

Python __dict__

Aukščiau aptarėme vartotojo apibrėžtus vartotojus; Python taip pat pateikia keletą vidinių pavadinimų, kurie gali būti laikomi ir turėtų būti traktuojami kaip konstantos.

Svarbios Python konstantos

Šiame skyriuje sužinosime apie kai kurias vidines konstantas, kurios naudojamos norint, kad Python kodas būtų skaitomesnis. Supraskime kai kurias svarbias konstantas.

Integruotos konstantos

Oficialiuose dokumentuose, Tiesa ir Netiesa yra išvardytos kaip pirmoji konstanta. Tai yra Python Būlio reikšmės ir yra int pavyzdys. A Tiesa turi reikšmę 1 ir Netiesa turi reikšmę 0.

Pavyzdys -

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

Atminkite, kad tikri ir klaidingi vardai yra griežtos konstantos. Kitaip tariant, mes negalime jų priskirti iš naujo, o jei bandysime juos priskirti iš naujo, gausime sintaksės klaidą. Šios dvi reikšmės yra pavieniai Python objektai, tai reiškia, kad egzistuoja tik vienas egzempliorius.

Vidiniai Dundero vardai

Python taip pat turi daug vidinių griaustinis pavadinimai, kuriuos galime laikyti konstantomis. Yra keletas šių unikalių pavadinimų, apie __name__ ir __file__ sužinosime šiame skyriuje.

Atributas __name__ yra susijęs su tuo, kaip paleisti tam tikrą kodo dalį. Importuojant modulį, Python internal nustatė __name__ į eilutę, kurioje yra modulio pavadinimas.

naujas_failas.py

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

Komandinėje eilutėje įveskite šią komandą -

 python -c 'import new_file' 

-c naudojamas atlikti nedidelę Python kodo dalį komandinėje eilutėje. Aukščiau pateiktame pavyzdyje mes importavome naujas_failas modulis, kuris ekrane rodo kai kuriuos pranešimus.

Išvestis -

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

Kaip matome, kad __name__ saugo eilutę __main__, tai rodo, kad vykdomuosius failus galime paleisti tiesiogiai kaip Python programą.

Kita vertus, atributas __file__ turi failą, kurį Python šiuo metu importuoja arba vykdo. Jei failo viduje naudosime atributą __file__, gausime kelią į patį modulį.

Pažiūrėkime tokį pavyzdį -

Pavyzdys -

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

Išvestis:

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

Taip pat galime bėgti tiesiogiai ir gausime tą patį rezultatą.

Pavyzdys -

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

Išvestis:

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

Naudingos stygų ir matematikos konstantos

Standartinėje bibliotekoje yra daug vertingų konstantų. Kai kurie yra griežtai susieti su konkrečiais moduliais, funkcijomis ir klasėmis; daugelis yra bendriniai ir galime juos naudoti keliuose scenarijuose. Žemiau pateiktame pavyzdyje naudosime atitinkamai matematikos ir su eilutėmis susijusius modulius matematika ir eilutė.

Supraskime šį pavyzdį -

Pavyzdys -

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

Šios konstantos vaidins gyvybiškai svarbų vaidmenį rašant su matematika susijusį kodą arba atliekant tam tikrus skaičiavimus.

Supraskime šį pavyzdį -

Pavyzdys -

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

Aukščiau pateiktame kode mes panaudojome math.pi vietoj papročių PI konstantos. Su matematika susijusi konstanta suteikia daugiau programos kontekstų. Konstantos math.pi naudojimo pranašumas yra tas, kad jei naudojame senesnę Python versiją, gausime 32 bitų Pi versiją. Jei naudosime aukščiau pateiktą programą šiuolaikinėje Python versijoje, gausime 64 bitų pi versiją. Taigi mūsų programa savarankiškai prisitaikys prie konkrečios vykdymo aplinkos.

Styginių modulis taip pat pateikia keletą naudingų įmontuotų eilučių konstantų. Žemiau yra kiekvienos konstantos pavadinimo ir reikšmės lentelė.

vardas Vertė
ascii_mažosios raidės Abcdefghijklmnopqrstuvwxyz
ascii_didžiosios raidės ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_ raidės ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
skaitmenys 0123456789
šešioliktainiai skaitmenys 0123456789abcdefABCDEF
aštuonskaitmenys 01234567

Šias su eilutėmis susijusias konstantas galime naudoti įprastose išraiškose, apdorojant natūralią kalbą, daug apdorojant eilutes ir kt.

python sąrašo inicijavimas

Tipo anotavimo konstantos

Nuo Python 3.8, spausdinimo modulis apima galutinę klasę, kuri leidžia mums rašyti anotuoti konstantas. Jei programoje konstantoms apibrėžti naudosime Final klasę, gausime statinio tipo klaidą, kurią patikrins mypy checker, ir parodys, kad negalime iš naujo priskirti galutinio pavadinimo. Supraskime šį pavyzdį.

Pavyzdys -

 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) 

Mes nurodėme pastovų kintamąjį su galutine klase, kuri nurodė tipo klaidą, kad praneštume apie klaidą, jei deklaruotas vardas priskiriamas iš naujo. Tačiau ji gauna pranešimą apie tipo tikrintuvo klaidą; Python keičia MAX_SPEED reikšmę. Taigi, „Final“ neapsaugo nuo nuolatinio atsitiktinio priskyrimo vykdymo metu.

Styginių konstantos

Kaip aptarta ankstesniame skyriuje, Python nepalaiko griežtų konstantų; jis tiesiog turi kintamuosius, kurie niekada nesikeičia. Todėl „Python“ bendruomenė laikosi vardų suteikimo taisyklės, kad pastoviems kintamiesiems identifikuoti naudojama didžioji raidė.

Tai gali būti problema, jei dirbame su dideliu Python projektu su daugybe skirtingų lygių programuotojų. Taigi būtų gera praktika turėti mechanizmą, leidžiantį naudoti griežtas konstantas. Kaip žinome, Python yra dinamiška kalba, todėl yra keletas būdų, kaip konstantas padaryti nekeičiamas. Šiame skyriuje sužinosime apie kai kuriuos iš šių būdų.

.__slots__ atributai

Python klasės suteikia galimybę naudoti __slots__ atributus. Lizdas turi specialų mechanizmą, leidžiantį sumažinti objektų dydį. Tai objektų atminties optimizavimo koncepcija. Jei klasėje naudosime atributą __slots__, negalėsime pridėti naujo egzemplioriaus, nes jis nenaudoja __dict__ atributų. Be to, neturint a .__diktuoti__ atributas reiškia optimizavimą atminties suvartojimo atžvilgiu. Supraskime šį pavyzdį.

Pavyzdys – nenaudojant __slots__ atributų

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

Išvestis -

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

Kiekviename Python objekte yra dinaminis žodynas, leidžiantis pridėti atributų. Žodynai sunaudoja daug atminties, o naudojant __slots__ sumažėja vietos ir atminties eikvojimas. Pažiūrėkime kitą pavyzdį.

Pavyzdys -

kuo skiriasi megabaitas ir gigabaitas
 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) 

Išvestis -

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

Aukščiau pateiktame kode klasės atributus inicijavome su lizdų atributais. Kintamasis turi pastovią reikšmę, jei bandysime perskirti kintamąjį, gausime klaidą.

@Nuosavybės dekoratorius

Taip pat galime naudoti @nuosavybė dekoratorius, kad sukurtumėte klasę, kuri veiktų kaip konstantų vardų erdvė. Mums tereikia apibrėžti konstantų savybę, nepateikiant joms nustatymo metodo. Supraskime šį pavyzdį.

Pavyzdys -

 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) 

Išvestis -

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

Jie yra tik skaitomos savybės, jei bandysime priskirti iš naujo, gausime an Atributo klaida.

Namedtuple() gamyklinė funkcija

Python rinkimo modulyje yra gamyklos funkcija namedtuple (). Naudojant namedtuple() funkciją, galime naudoti pavadintus laukus ir taško žymėjimą, kad pasiektume jų elementus. Žinome, kad kortelės yra nekintančios, o tai reiškia, kad negalime pakeisti esamo pavadinimo objekto vietoje.

Supraskime šį pavyzdį.

Pavyzdys -

 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) 

Išvestis -

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

@dataclass dekoratorius

Kaip rodo pavadinimas, duomenų klasėje saugomi duomenys, juos gali sudaryti metodai, tačiau tai nėra pagrindinis jų tikslas. Norėdami sukurti duomenų klases, turime naudoti @dataclass dekoratorių. Taip pat galime sukurti griežtas konstantas. @dataclass dekoratorius priima įšaldytą argumentą, leidžiantį pažymėti mūsų duomenų klasę kaip nekintamą. @dataclass dekoratoriaus naudojimo pranašumai, negalime keisti jo egzemplioriaus atributo.

Supraskime šį pavyzdį.

Pavyzdys -

 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) 

Išvestis -

 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' 

Paaiškinimas -

Aukščiau pateiktame kode importavome @dataclass dekoratorių. Mes panaudojome šį dekoratorių „ConstantsName“, kad padarytume jį duomenų klase. Fiksuotą argumentą nustatėme į True, kad duomenų klasė būtų nekintanti. Sukūrėme duomenų klasės egzempliorių ir galime pasiekti visas konstantas, bet negalime jų keisti.

.__setattr__() specialusis metodas

Python leidžia mums naudoti specialų metodą, vadinamą .__setattr__(). Naudodami šį metodą galime tinkinti atributo priskyrimo procesą, nes Python automatiškai iškviečia metodą kiekvieno atributo priskyrimo metu. Supraskime šį pavyzdį -

Pavyzdys -

 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) 

Išvestis -

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

Metodas __setattr__() neleidžia atlikti jokios priskyrimo operacijos su klasės atributais. Jei bandome perskirstyti, tai tiesiog pakelkite an Atributo klaida.

Išvada

Konstantos dažniausiai naudojamos programavimo sąvokoje, ypač matematiniame termine. Šioje pamokoje sužinojome apie svarbias konstantų ir jų skonių sąvokas. Python bendruomenė naudoja didžiąsias raides kaip pavadinimo susitarimą, kad nustatytų konstantas. Tačiau mes aptarėme kai kuriuos išankstinius konstantų naudojimo Python būdus. Aptarėme, kaip pagerinti kodo skaitomumą, pakartotinį naudojimą ir techninę priežiūrą naudojant konstantas. Minėjome, kaip taikyti įvairius metodus, kad mūsų Python konstantos būtų griežtai pastovios.