У овом водичу ћемо научити о типовима константи и како они помажу у побољшању читљивости кода. Ако нисте упознати, константе су имена која представљају вредности које се не мењају током извршавања програма. Они су најчешћи фундаментални концепт у програмирању. Међутим, Питхон нема наменску синтаксу за дефинисање константи. Генерално, Питхон константе су променљиве које се никада не мењају. Имаћемо детаљну дискусију о Питхон константи у наредном одељку.
Шта су константе?
Генерално, у математици се користи константан термин, вредност или количина која се никада не мења. У програмирању, константа се односи на име повезано са вредношћу која се никада не мења током извршавања програмирања. Програмска константа се разликује од осталих константи и састоји се од две ствари – имена и придружене вредности. Име ће описати шта је константа, а вредност је конкретан израз саме константе.
Једном када дефинишемо константу, можемо само да приступимо њеној вредности, али не можемо да је променимо током времена. Међутим, можемо да изменимо вредност променљиве. Пример из стварног живота је – брзина светлости, број минута у сату и назив основног фолдера пројекта.
Зашто користити константу?
У програмским језицима, константе нам омогућавају да заштитимо од случајне промене њихове вредности што може да изазове грешке које је тешко отклонити. Такође је корисно учинити код читљивијим и одржаваним. Хајде да видимо неке предности константе.
изврши љуску скрипте
Кориснички дефинисане константе
Морамо да користимо конвенцију именовања у Питхон-у да бисмо дефинисали константу у Питхон-у. Име треба да напишемо великим словима са подвлакама које раздвајају речи.
Следи пример кориснички дефинисаних Питхон константи -
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', ... ]
Користили смо исти начин као што смо креирали променљиве у Питхон-у. Дакле, можемо претпоставити да су Питхон константе само променљиве, а једина разлика је у томе што константа користи само велика слова.
Коришћење великих слова издваја константу од наших променљивих и представља корисну или пожељну праксу.
Горе смо разговарали о кориснички дефинисаним корисницима; Питхон такође обезбеђује неколико интерних имена која могу да разматрају и треба да их третирају као константе.
Важне константе у Питхон-у
У овом одељку ћемо научити о неким интерним константама које се користе да Питхон код буде читљивији. Хајде да разумемо неке важне константе.
Уграђене константе
У званичној документацији, Истина и Фалсе су наведене као прва константа. Ово су Питхон логичке вредности и инстанца инт. А Истина има вредност 1, и Фалсе има вредност 0.
Пример -
>>> 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
Запамтите да су тачна и лажна имена строге константе. Другим речима, не можемо их поново доделити, а ако покушамо да их поново доделимо, добићемо синтаксичку грешку. Ове две вредности су синглетон објекти у Питхон-у, што значи да постоји само једна инстанца.
Интерна имена Дундер
Питхон такође има много интерних гром имена које можемо сматрати константама. Постоји неколико ових јединствених имена, научићемо о __наме__ и __филе__ у овом одељку.
Атрибут __наме__ повезан је са начином на који се покреће дати део кода. Приликом увоза модула, Питхон интерно поставља __наме__ на стринг који садржи име модула.
нев_филе.пи
print(f'The type of __name__ is: {type(__name__)}') print(f'The value of __name__ is: {__name__}')
У командној линији укуцајте следећу команду -
python -c 'import new_file'
-ц се користи за извршавање малог дела Питхон кода на командној линији. У горњем примеру, увезли смо нова_датотека модул, који приказује неке поруке на екрану.
Излаз -
The type of __name__ is: The value of __name__ is: timezone
Као што видимо да __наме__ складишти стринг __маин__, указује да можемо покренути извршне датотеке директно као Питхон програм.
С друге стране, атрибут __филе__ има датотеку коју Питхон тренутно увози или извршава. Ако користимо атрибут __филе__ унутар датотеке, добићемо путању до самог модула.
Погледајмо следећи пример -
Пример -
print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}')
Излаз:
ц++ функција прототипа
The type of __file__ is: The value of __file__ is: D:Python Project ew_file.py
Такође можемо да трчимо директно и добићемо исти резултат.
Пример -
print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}')
Излаз:
python new_file.py The type of __file__ is: The value of __file__ is: timezone.py
Корисне стринг и математичке константе
У стандардној библиотеци има много вредних константи. Неки су стриктно повезани са одређеним модулима, функцијама и класама; многи су генерички и можемо их користити у неколико сценарија. У следећем примеру користићемо математику и модуле повезане са стринговима матх и стринг, респективно.
Хајде да разумемо следећи пример -
Пример -
>>> 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
Ове константе ће играти виталну улогу када пишемо математички код или изводимо нека специфична израчунавања.
Хајде да разумемо следећи пример -
Пример -
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})'
У горњем коду смо користили матх.пи уместо обичаја ПИ константе. Константа везана за математику пружа више контекста програму. Предност коришћења константе матх.пи је у томе што ако користимо старију верзију Питхона, добићемо 32-битну верзију Пи. Ако користимо горњи програм у модерној верзији Пајтона, добићемо 64-битну верзију пи. Дакле, наш програм ће се сам прилагодити свом конкретном окружењу за извршавање.
Модул стринг такође пружа неке корисне уграђене стринг константе. Испод је табела имена и вредности сваке константе.
Име | Валуе |
---|---|
асции_ловерцасе | Абцдефгхијклмнопкрстуввкиз |
асции_упперцасе | АБЦДЕФГХИЈКЛМНОПКРСТУВВКСИЗ |
асции_леттерс | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz |
цифре | 0123456789 |
хекдигитс | 0123456789абцдефАБЦДЕФ |
оцтдигитс | 01234567 |
Можемо да користимо ове константе повезане са стринговима у регуларним изразима, обради природног језика, уз пуно обраде стрингова и још много тога.
Константе за означавање типа
Од Питхон-а 3.8, модул за куцање укључује класу Финал која нам омогућава да уносимо коментаре на константе. Ако користимо класу Финал да дефинишемо константе у програму, добићемо грешку статичког типа коју проверава мипи цхецкер и она ће показати да не можемо да прерасподелимо Финал наме. Хајде да разумемо следећи пример.
Пример -
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)
Навели смо константну променљиву са Финалном класом која је указивала на грешку у типу за пријаву грешке ако се декларисано име поново додели. Међутим, добија извештај о грешци провере типа; Питхон мења вредност МАКС_СПЕЕД. Дакле, Финал не спречава сталну случајну прерасподелу током извршавања.
Стринг Цонстантс
Као што је објашњено у претходном одељку, Питхон не подржава строге константе; само има променљиве које се никада не мењају. Стога, Питхон заједница следи конвенцију именовања користећи велико слово за идентификацију константних променљивих.
То може бити проблем ако радимо на великом Питхон пројекту са много програмера на различитим нивоима. Зато би била добра пракса да имамо механизам који нам омогућава да користимо строге константе. Као што знамо, Питхон је динамичан језик и постоји неколико начина да константе учините непроменљивим. У овом одељку ћемо научити о неким од ових начина.
Атрибути .__слотс__
Питхон класе пружају могућност коришћења атрибута __слотс__. Утор има посебан механизам за смањење величине предмета. То је концепт оптимизације меморије на објектима. Ако користимо атрибут __слотс__ у класи, нећемо моћи да додамо нову инстанцу, јер она не користи атрибуте __дицт__. Поред тога, нема а .__дицт__ атрибут подразумева оптимизацију у смислу потрошње меморије. Хајде да разумемо следећи пример.
Пример – Без коришћења атрибута __слотс__
class NewClass(object): def __init__(self, *args, **kwargs): self.a = 1 self.b = 2 if __name__ == '__main__': instance = NewClass() print(instance.__dict__)
Излаз -
рујира банерјее
{'a': 1, 'b': 2}
Сваки објекат у Питхон-у садржи динамички речник који омогућава додавање атрибута. Речници троше много меморије, а коришћење __слотова__ смањује губитак простора и меморије. Хајде да видимо још један пример.
Пример -
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)
Излаз -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 10, in AttributeError: 'ConstantsName' object attribute 'PI' is read-only
У горњем коду смо иницијализовали атрибуте класе са атрибутима слотова. Променљива има константну вредност, ако покушамо да поново доделимо променљиву, добићемо грешку.
@проперти Децоратор
Такође можемо користити @имовина декоратор за креирање класе која ради као именски простор за константе. Само треба да дефинишемо својство константе без да им обезбедимо метод за подешавање. Хајде да разумемо следећи пример.
Пример -
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)
Излаз -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 13, in AttributeError: can't set attribute
Они су само својства само за читање, ако покушамо да поново доделимо, добићемо АттрибутеЕррор.
Фабричка функција намедтупле().
Питхон-ов модул за прикупљање долази са фабричком функцијом која се зове намедтупле(). Помоћу намедтупле() функцију, можемо да користимо именована поља и тачку за приступ њиховим ставкама. Знамо да су торке непроменљиве, што значи да не можемо да модификујемо постојећи именовани објекат тупле на месту.
Хајде да разумемо следећи пример.
Пример -
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)
Излаз -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 17, in AttributeError: can't set attribute
Декоратор @датацласс
Као што јој име говори, класа података садржи податке, могу се састојати од метода, али то није њихов примарни циљ. Морамо да користимо @датацласс декоратор да креирамо класе података. Такође можемо креирати строге константе. Декоратор @датацласс узима замрзнути аргумент који нам омогућава да означимо нашу класу података као непроменљиву. Предности коришћења @датацласс декоратора, не можемо да мењамо његов атрибут инстанце.
Хајде да разумемо следећи пример.
Пример -
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)
Излаз -
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'
Објашњење -
У горњи код смо увезли @датацласс декоратор. Користили смо овај декоратор за ЦонстантсНаме да бисмо га учинили класом података. Поставили смо замрзнути аргумент на Тачно да би класа података била непроменљива. Направили смо инстанцу класе података и можемо приступити свим константама, али не можемо да их мењамо.
Специјални метод .__сетаттр__().
Питхон нам омогућава да користимо посебан метод који се зове .__сетаттр__(). Користећи овај метод, можемо да прилагодимо процес додељивања атрибута јер Питхон аутоматски позива метод за сваки додељивање атрибута. Хајде да разумемо следећи пример -
база података о својствима киселина
Пример -
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)
Излаз -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 22, in File '', line 17, in __setattr__ AttributeError: can't reassign constant 'PI'
Метода __сетаттр__() не дозвољава да се изврши било каква операција додељивања на атрибутима класе. Ако покушамо да прерасподелимо, то само подиже а АттрибутеЕррор.
Закључак
Константе се најчешће користе у концепту у програмирању, посебно у математичком термину. У овом водичу смо научили о важним концептима константи и њиховим укусима. Питхон заједница користи велико слово као конвенцију о имену за идентификацију константи. Међутим, разговарали смо о неким напредним начинима коришћења константи у Питхон-у. Разговарали смо о томе како да побољшамо читљивост кода, поновну употребу и могућност одржавања помоћу константи. Споменули смо како да применимо различите технике да наше Питхон константе буду стриктно константне.