Š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ų.
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.