logo

Типове константи в Python | Значение на константата в Python

В този урок ще научим за типовете константи и как те помагат за подобряване на четливостта на кода. Ако не сте запознати, константите са имената, представляващи стойности, които не се променят по време на изпълнението на програмата. Те са най-разпространената фундаментална концепция в програмирането. Python обаче няма специален синтаксис за дефиниране на константи. Като цяло константите на Python са променливи, които никога не се променят. Ще имаме подробна дискусия за константата на Python в предстоящия раздел.

Какво представляват константите?

Обикновено в математиката се използва постоянен термин, стойност или количество, което никога не се променя. В програмирането константата се отнася до името, свързано със стойност, която никога не се променя по време на изпълнението на програмирането. Програмната константа е различна от другите константи и се състои от две неща - име и свързана стойност. Името ще опише какво представлява константата, а стойността е конкретният израз на самата константа.

След като дефинираме константата, имаме достъп само до нейната стойност, но не можем да я променим с течение на времето. Въпреки това можем да променим стойността на променливата. Пример от реалния живот е - скоростта на светлината, броя на минутите в един час и името на главната папка на проекта.

Защо да използвате Constant?

В езиците за програмиране константите ни позволяват да се предпазим от случайна промяна на тяхната стойност, което може да причини грешки, трудни за отстраняване на грешки. Също така е полезно да направите кода по-четлив и поддържаем. Нека да видим някои предимства на константата.

    Подобрена четливост -Помага за подобряване на четливостта на кода. Например, по-лесно е да се чете и разбира константа с име MAX_SPEED, отколкото самата значителна стойност на скоростта.Ясна комуникация на намерението -Повечето разработчици смятат 3.14 за pi константа. Името Pi, pi или PI обаче ще съобщи намерението по-ясно. Тази практика ще позволи на друг разработчик да разбере нашия код.По-добра поддръжка -Константите ни позволяват да използваме една и съща стойност във вашия код. Да предположим, че искаме да актуализираме стойността на константата; не е необходимо да променяме всеки екземпляр.Нисък риск от грешки -Константа, представляваща дадена стойност в цялата програма, е по-малко податлива на грешки. Ако искаме да променим точността на изчисленията, подмяната на стойността може да бъде рисковано. Вместо да го заменяме, можем да създадем различни константи за различни нива на точност и да променим кода, където имаме нужда.Безопасно за нишки съхранение на данни -Константите са обекти, безопасни за нишки, което означава, че няколко нишки могат едновременно да използват константа, без да рискуват да загубят данни.

Дефинирани от потребителя константи

Трябва да използваме конвенцията за именуване в Python, за да дефинираме константата в Python. Трябва да напишем името с главни букви с долна черта, разделяща думите.

Следват примери за дефинирани от потребителя константи на 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', ... ] 

Използвахме същия начин, както създаваме променливи в Python. Така че можем да приемем, че константите на Python са просто променливи и единствената разлика е, че константата използва само главни букви.

Използването на главни букви кара константата да се откроява от нашите променливи и е полезна или предпочитана практика.

По-горе обсъдихме дефинираните от потребителя потребители; Python също предоставя няколко вътрешни имена, които могат да се разглеждат и трябва да се третират като константи.

Важни константи в Python

В този раздел ще научим за някои вътрешни константи, които се използват, за да направят кода на Python по-четлив. Нека разберем някои важни константи.

Вградени константи

В официалната документация, Вярно и Невярно са посочени като първа константа. Това са булеви стойности на Python и са екземплярът на int. А Вярно има стойност 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 

Не забравяйте, че имената True и False са строги константи. С други думи, не можем да ги преназначим и ако се опитаме да ги преназначим, ще получим синтактична грешка. Тези две стойности са единични обекти в Python, което означава, че съществува само един екземпляр.

Вътрешни имена на Dunder

Python също има много вътрешни гръм имена, които можем да считаме за константи. Има няколко от тези уникални имена, ще научим за __name__ и __file__ в този раздел.

Атрибутът __name__ е свързан с това как да се изпълни дадена част от кода. Когато импортирате модул, вътрешният Python задава __name__ на низ, съдържащ името на модула.

нов_файл.py

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

В командния ред и въведете следната команда -

 python -c 'import new_file' 

-c се използва за изпълнение на малка част от кода на Python в командния ред. В горния пример ние импортирахме нов_файл модул, който показва някои съобщения на екрана.

Изход -

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

Както можем да видим, че __name__ съхранява низа __main__, показва, че можем да стартираме изпълнимите файлове директно като програма на Python.

От друга страна, атрибутът __file__ има файла, който Python импортира или изпълнява в момента. Ако използваме атрибута __file__ във файла, ще получим пътя до самия модул.

Да видим следния пример -

пример -

 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 

Полезни низови и математически константи

В стандартната библиотека има много ценни константи. Някои са тясно свързани със специфични модули, функции и класове; много от тях са общи и можем да ги използваме в няколко сценария. В примера по-долу ще използваме съответно модулите math и string, свързани с math и string.

Нека разберем следния пример -

пример -

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

В горния код използвахме math.pi вместо обичай ПИ константи. Константата, свързана с математиката, предоставя повече контексти на програмата. Предимството на използването на константа math.pi е, че ако използваме по-стара версия на Python, ще получим 32-битова версия на Pi. Ако използваме горната програма в съвременната версия на Python, ще получим 64-битова версия на pi. Така нашата програма ще се самоадаптира към своята конкретна среда за изпълнение.

Модулът за низове също предоставя някои полезни вградени константи за низове. По-долу е таблицата с името и стойността на всяка константа.

Име Стойност
ascii_малки букви Abcdefghijklmnopqrstuvwxyz
ascii_главен регистър ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_букви ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
цифри 0123456789
шестнадесетични цифри 0123456789abcdefABCDEF
осемцифри 01234567

Можем да използваме тези свързани с низове константи в регулярни изрази, обработка на естествен език, с много обработка на низове и др.

Константи за анотиране на типа

От Python 3.8 модулът за писане включва клас Final, който ни позволява да въвеждаме анотации за константи. Ако използваме класа Final, за да дефинираме константите в програмата, ще получим грешка от статичен тип, която проверката на mypy проверява и ще покаже, че не можем да присвоим отново името на Final. Нека разберем следния пример.

q3 месеца

пример -

 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) 

Уточнихме постоянната променлива с финалния клас, който посочва грешката на типа, за да докладва грешка, ако декларирано име бъде преназначено. Въпреки това получава отчет за грешка на проверка на типа; Python променя стойността на MAX_SPEED. Така че Final не предотвратява постоянно случайно преназначаване по време на изпълнение.

Константи на низове

Както беше обсъдено в предишния раздел, Python не поддържа строги константи; просто има променливи, които никога не се променят. Следователно общността на Python следва конвенцията за именуване за използване на главна буква за идентифициране на постоянните променливи.

Може да е проблем, ако работим върху голям проект на Python с много програмисти на различни нива. Така че би било добра практика да имаме механизъм, който ни позволява да използваме строги константи. Както знаем, Python е динамичен език и има няколко начина да направите константите непроменими. В този раздел ще научим за някои от тези начини.

Атрибутите .__slots__

Класовете на Python предоставят възможност за използване на атрибутите __slots__. Слотът има специален механизъм за намаляване на размера на обектите. Това е концепция за оптимизиране на паметта на обекти. Ако използваме атрибута __slots__ в класа, няма да можем да добавим новия екземпляр, защото той не използва атрибути __dict__. Освен това, липсата на a .__dict__ атрибут предполага оптимизация по отношение на потреблението на памет. Нека разберем следния пример.

Пример - Без използване на атрибути __slots__

 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} 

Всеки обект в Python съдържа динамичен речник, който позволява добавяне на атрибути. Речниците консумират много памет и използването на __slots__ намалява загубата на пространство и памет. Да видим друг пример.

пример -

 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 

В горния код инициализирахме атрибутите на класа с атрибутите на слотовете. Променливата има постоянна стойност, ако се опитаме да преназначим променливата, ще получим грешка.

Декораторът на @property

Можем също да използваме @Имот декоратор за създаване на клас, който работи като пространство от имена за константи. Просто трябва да дефинираме свойството на константите, без да им предоставяме метод за настройка. Нека разберем следния пример.

пример -

 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 

Те са само свойства само за четене, ако се опитаме да преназначим, ще получим AttributeError.

Фабричната функция namedtuple().

Модулът за събиране на Python идва с фабричната функция, наречена namedtuple(). Използвайки namedtuple() функция, можем да използваме именуваните полета и нотацията с точка за достъп до техните елементи. Знаем, че кортежите са неизменни, което означава, че не можем да модифицираме съществуващ именуван обект на кортеж на място.

Нека разберем следния пример.

пример -

 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 

Декораторът @dataclass

Както подсказва името му, класът данни съдържа данни, те могат да се състоят от методи, но това не е основната им цел. Трябва да използваме декоратора @dataclass, за да създадем класовете данни. Можем също да създадем строги константи. Декораторът @dataclass приема замразен аргумент, който ни позволява да маркираме нашия клас данни като неизменен. Предимствата на използването на @dataclass декоратор, ние не можем да променим неговия атрибут на екземпляр.

Нека разберем следния пример.

пример -

 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' 

Обяснение -

В горния код ние импортирахме декоратора @dataclass. Използвахме този декоратор за ConstantsName, за да го направим клас данни. Задаваме замразения аргумент на True, за да направим класа данни неизменен. Създадохме екземпляра на класа данни и имаме достъп до всички константи, но не можем да ги променяме.

Специалният метод .__setattr__().

Python ни позволява да използваме специален метод, наречен .__setattr__(). Използвайки този метод, можем да персонализираме процеса на присвояване на атрибут, тъй като Python автоматично извиква метода при всяко присвояване на атрибут. Нека разберем следния пример -

пример -

 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' 

Методът __setattr__() не позволява извършването на никакви операции по присвояване на атрибутите на класа. Ако се опитаме да преназначим, това просто повдига an AttributeError.

Заключение

Константите се използват най-много в концепцията в програмирането, особено в математически план. В този урок научихме за важните концепции за константите и техните вкусове. Общността на Python използва главна буква като конвенция за име за идентифициране на константите. Обсъдихме обаче някои предварителни начини за използване на константите в Python. Обсъдихме как да подобрим четливостта, повторната употреба и поддръжката на кода с константи. Споменахме как да приложим различни техники, за да направим нашите константи на Python строго постоянни.