logo

Python의 상수 유형 | Python에서 상수의 중요성

이 튜토리얼에서는 상수 유형과 이것이 코드 가독성을 향상시키는 데 어떻게 도움이 되는지 알아봅니다. 낯설다면 상수란 프로그램이 실행되는 동안 변하지 않는 값을 나타내는 이름이다. 이는 프로그래밍에서 가장 일반적인 기본 개념입니다. 그러나 Python에는 상수 정의를 위한 전용 구문이 없습니다. 일반적으로 Python 상수는 절대 변경되지 않는 변수입니다. 다음 섹션에서는 Python 상수에 대해 자세히 논의하겠습니다.

상수란 무엇입니까?

일반적으로 상수 용어는 수학에서 절대 변하지 않는 값이나 수량을 사용합니다. 프로그래밍에서 상수는 프로그래밍 실행 중에 절대 변경되지 않는 값과 관련된 이름을 나타냅니다. 프로그래밍 상수는 다른 상수와 다르며 이름과 관련 값이라는 두 가지로 구성됩니다. 이름은 상수가 무엇인지 설명하고 값은 상수 자체의 구체적인 표현입니다.

상수를 정의하면 해당 값에 액세스할 수만 있고 시간이 지나도 변경할 수는 없습니다. 그러나 변수 값을 수정할 수 있습니다. 실제 예는 빛의 속도, 1시간의 분 수, 프로젝트 루트 폴더 이름입니다.

상수를 사용하는 이유는 무엇입니까?

프로그래밍 언어에서 상수를 사용하면 실수로 값을 변경하여 디버그하기 어려운 오류가 발생하는 것을 방지할 수 있습니다. 코드를 더 읽기 쉽고 유지 관리하기 쉽게 만드는 것도 도움이 됩니다. 상수의 몇 가지 장점을 살펴보겠습니다.

    가독성 향상 -코드의 가독성을 높이는 데 도움이 됩니다. 예를 들어, 실제 속도 값 자체보다 MAX_SPEED라는 상수를 읽고 이해하는 것이 더 쉽습니다.명확한 의도 전달 -대부분의 개발자는 3.14를 파이 상수로 간주합니다. 그러나 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의 싱글톤 개체입니다. 즉, 인스턴스가 하나만 존재한다는 의미입니다.

내부 던더 이름

Python에는 또한 많은 내부 우뢰 상수로 간주할 수 있는 이름입니다. 이러한 고유한 이름은 여러 가지가 있습니다. 이 섹션에서는 __name__ 및 __file__에 대해 알아봅니다.

__name__ 속성은 주어진 코드를 실행하는 방법과 관련이 있습니다. 모듈을 가져올 때 Python 내부는 __name__을 모듈 이름이 포함된 문자열로 설정합니다.

new_file.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을 각각 사용합니다.

다음 예를 이해해 봅시다 -

예 -

 >>> 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 커스텀 대신 PI 상수. 수학 관련 상수는 프로그램에 더 많은 컨텍스트를 제공합니다. math.pi 상수를 사용하면 이전 버전의 Python을 사용하는 경우 32비트 버전의 Pi를 사용할 수 있다는 장점이 있습니다. 최신 버전의 Python에서 위 프로그램을 사용하면 64비트 버전의 pi를 얻게 됩니다. 따라서 우리 프로그램은 구체적인 실행 환경에 스스로 적응할 것입니다.

string 모듈은 유용한 내장 문자열 상수도 제공합니다. 아래는 각 상수의 이름과 값을 정리한 표입니다.

이름
ascii_소문자 ABCdefghijklmnopqrstuvwxyz
ascii_uppercase ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_letters ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
숫자 0123456789
16진수 0123456789abcdefABCDEF
팔각형 01234567

이러한 문자열 관련 상수를 정규식, 자연어 처리, 많은 문자열 처리 등에서 사용할 수 있습니다.

유형 주석 상수

Python 3.8부터 타이핑 모듈에는 상수에 유형 주석을 달 수 있는 Final 클래스가 포함되어 있습니다. Final 클래스를 사용하여 프로그램의 상수를 정의하면 mypy 검사기가 검사하는 정적 유형 오류가 발생하고 Final 이름에 다시 할당할 수 없다는 메시지가 표시됩니다. 다음 예를 이해해 봅시다.

예 -

자바 멀티스레딩
 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) 

선언된 이름이 다시 할당되면 오류를 보고하기 위해 유형 오류를 나타내는 Final Class에 상수 변수를 지정했습니다. 그러나 유형 검사기의 오류에 대한 보고를 받습니다. Python은 MAX_SPEED 값을 변경합니다. 따라서 Final은 런타임 시 지속적으로 우발적으로 재할당되는 것을 방지하지 않습니다.

문자열 상수

이전 섹션에서 설명한 것처럼 Python은 엄격한 상수를 지원하지 않습니다. 결코 변하지 않는 변수가 있습니다. 따라서 Python 커뮤니티는 대문자를 사용하여 상수 변수를 식별하는 명명 규칙을 따릅니다.

다양한 수준의 많은 프로그래머가 참여하는 대규모 Python 프로젝트를 진행하는 경우 문제가 될 수 있습니다. 따라서 엄격한 상수를 사용할 수 있는 메커니즘을 갖는 것이 좋습니다. 우리가 알고 있듯이 Python은 동적 언어이며 상수를 변경할 수 없게 만드는 여러 가지 방법이 있습니다. 이 섹션에서는 이러한 방법 중 일부에 대해 알아봅니다.

.__slots__ 속성

Python 클래스는 __slots__ 속성을 사용하는 기능을 제공합니다. 슬롯에는 물체의 크기를 줄이는 특별한 메커니즘이 있습니다. 객체에 대한 메모리 최적화 개념입니다. 클래스에서 __slots__ 속성을 사용하면 __dict__ 속성을 사용하지 않기 때문에 새 인스턴스를 추가할 수 없습니다. 게다가 .__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 데코레이터

우리는 또한 사용할 수 있습니다 @재산 상수의 네임스페이스로 작동하는 클래스를 만드는 데코레이터입니다. setter 메소드를 제공하지 않고 상수 속성만 정의하면 됩니다. 다음 예를 이해해 봅시다.

예 -

 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 

이는 읽기 전용 속성이므로 재할당을 시도하면 속성 오류.

Namedtuple() 팩토리 함수

Python의 컬렉션 모듈에는 namestuple()이라는 팩토리 함수가 함께 제공됩니다. 사용하여 네임튜플() 함수를 사용하면 명명된 필드와 점 표기법을 사용하여 해당 항목에 액세스할 수 있습니다. 우리는 튜플이 불변이라는 것을 알고 있습니다. 즉, 기존 명명된 튜플 객체를 그 자리에서 수정할 수 없다는 뜻입니다.

다음 예를 이해해 봅시다.

예 -

 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__() 메서드는 클래스 속성에 대한 할당 작업을 수행하는 것을 허용하지 않습니다. 재할당을 시도하면 단지 속성 오류.

결론

상수는 프로그래밍 개념, 특히 수학 용어에서 가장 많이 사용됩니다. 이 튜토리얼에서 우리는 상수와 그 특징의 중요한 개념에 대해 배웠습니다. Python 커뮤니티에서는 상수를 식별하기 위한 이름 규칙으로 대문자를 사용합니다. 그러나 우리는 Python에서 상수를 사용하는 몇 가지 고급 방법을 논의했습니다. 우리는 상수를 사용하여 코드의 가독성, 재사용성 및 유지 관리성을 향상시키는 방법을 논의했습니다. 우리는 Python 상수를 엄격하게 일정하게 만들기 위해 다양한 기술을 적용하는 방법을 언급했습니다.