logo

Typy konstant v Pythonu | Význam konstanty v Pythonu

V tomto tutoriálu se seznámíme s konstantními typy a jak pomáhají zlepšit čitelnost kódu. Pokud nejste obeznámeni, konstanty jsou názvy představující hodnoty, které se během provádění programu nemění. Jsou nejběžnějším základním konceptem v programování. Python však nemá vyhrazenou syntaxi pro definování konstant. Obecně jsou konstanty Pythonu proměnné, které se nikdy nemění. Podrobnou diskusi o konstantě Pythonu budeme mít v nadcházející sekci.

Co jsou konstanty?

Obecně se v matematice používá konstantní termín, hodnota nebo veličina, která se nikdy nemění. V programování konstanta odkazuje na název spojený s hodnotou, která se během provádění programování nikdy nemění. Programovací konstanta se liší od ostatních konstant a skládá se ze dvou věcí – názvu a přidružené hodnoty. Název bude popisovat, o čem konstanta je, a hodnota je konkrétním vyjádřením konstanty samotné.

Jakmile konstantu definujeme, máme přístup pouze k její hodnotě, ale nemůžeme ji v průběhu času měnit. Hodnotu proměnné však můžeme upravit. Příkladem ze skutečného života je - Rychlost světla, počet minut za hodinu a název kořenové složky projektu.

Proč používat Constant?

V programovacích jazycích nám konstanty umožňují chránit před náhodnou změnou jejich hodnoty, která může způsobit těžko laditelné chyby. Je také užitečné, aby byl kód čitelnější a udržitelnější. Podívejme se na některé výhody konstanty.

    Vylepšená čitelnost -Pomáhá zlepšit čitelnost kódu. Například je snazší přečíst a pochopit konstantu s názvem MAX_SPEED než samotnou hodnotu podstatné rychlosti.Jasná komunikace záměru -Většina vývojářů považuje 3.14 za konstantu pi. Název pí, pí nebo PI však bude sdělovat záměr jasněji. Tato praxe umožní dalšímu vývojáři porozumět našemu kódu.Lepší údržba -Konstanty nám umožňují používat stejnou hodnotu v celém kódu. Předpokládejme, že chceme aktualizovat hodnotu konstanty; nemusíme měnit každou instanci.Nízké riziko chyb -Konstanta představující danou hodnotu v programu je méně náchylná k chybám. Pokud chceme změnit přesnost ve výpočtech, může být nahrazení hodnoty riskantní. Místo jeho nahrazení můžeme vytvořit různé konstanty pro různé úrovně přesnosti a změnit kód tam, kde jsme potřebovali.Bezpečné ukládání dat -Konstanty jsou objekty bezpečné pro vlákna, což znamená, že několik vláken může současně používat konstantu, aniž by riskovali ztrátu dat.

Uživatelsky definované konstanty

K definování konstanty v Pythonu musíme použít konvenci pojmenování v Pythonu. Jméno bychom měli psát velkými písmeny s podtržítky oddělujícími slova.

Následuje příklad uživatelsky definovaných konstant Pythonu -

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

Použili jsme stejný způsob, jakým vytváříme proměnné v Pythonu. Můžeme tedy předpokládat, že konstanty Pythonu jsou pouze proměnné a jediný rozdíl je v tom, že konstanta používá pouze velká písmena.

pro smyčku v Javě

Použitím velkých písmen se konstanta odlišuje od našich proměnných a je to užitečná nebo preferovaná praxe.

Výše jsme diskutovali o uživatelsky definovaných uživatelích; Python také poskytuje několik interních názvů, které lze považovat za konstanty a měly by se s nimi chovat.

Důležité konstanty v Pythonu

V této části se seznámíme s některými interními konstantami, které se používají ke zvýšení čitelnosti kódu Pythonu. Pojďme pochopit některé důležité konstanty.

Vestavěné konstanty

V oficiální dokumentaci je Skutečný a Nepravdivé jsou uvedeny jako první konstanty. Toto jsou booleovské hodnoty Pythonu a jsou instancí int. A Skutečný má hodnotu 1 a Nepravdivé má hodnotu 0.

Příklad -

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

Pamatujte, že pravdivá a nepravdivá jména jsou striktní konstanty. Jinými slovy, nemůžeme je znovu přiřadit, a pokud se je pokusíme znovu přiřadit, dostaneme chybu syntaxe. Tyto dvě hodnoty jsou singletonové objekty v Pythonu, což znamená, že existuje pouze jedna instance.

Interní jména Dunder

Python má také mnoho interních hrom jména, která můžeme považovat za konstanty. Existuje několik těchto jedinečných jmen, v této sekci se dozvíme o __name__ a __file__.

Atribut __name__ souvisí s tím, jak spustit danou část kódu. Při importu modulu Python interní nastaví __name__ na řetězec obsahující název modulu.

nový_soubor.py

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

Na příkazovém řádku a zadejte následující příkaz -

 python -c 'import new_file' 

-c se používá ke spuštění malého kousku kódu Pythonu na příkazovém řádku. Ve výše uvedeném příkladu jsme importovali nový soubor modul, který zobrazuje některé zprávy na obrazovce.

Výstup -

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

Jak vidíme, že __name__ ukládá řetězec __main__, znamená to, že spustitelné soubory můžeme spouštět přímo jako program Python.

Na druhou stranu má atribut __file__ soubor, který Python aktuálně importuje nebo spouští. Pokud použijeme atribut __file__ uvnitř souboru, získáme cestu k samotnému modulu.

Podívejme se na následující příklad -

Příklad -

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

Výstup:

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

Můžeme také spustit přímo a dostaneme stejný výsledek.

Příklad -

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

Výstup:

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

Užitečné řetězce a matematické konstanty

Ve standardní knihovně je mnoho cenných konstant. Některé jsou přísně spojeny se specifickými moduly, funkcemi a třídami; mnohé jsou generické a můžeme je použít v několika scénářích. V níže uvedeném příkladu použijeme moduly math a string-related moduly math a string.

Pojďme pochopit následující příklad -

Příklad -

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

Tyto konstanty budou hrát zásadní roli, když píšeme matematický kód nebo provádíme nějaké specifické výpočty.

Pojďme pochopit následující příklad -

Příklad -

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

Ve výše uvedeném kódu jsme použili math.pi místo zvyku PI konstanty. Konstanta související s matematikou poskytuje programu více kontextů. Výhodou použití konstanty math.pi je, že pokud používáme starší verzi Pythonu, získáme 32bitovou verzi Pi. Pokud použijeme výše uvedený program v moderní verzi Pythonu, získáme 64bitovou verzi pi. Náš program se tedy sám přizpůsobí svému konkrétnímu prováděcímu prostředí.

Řetězcový modul také poskytuje některé užitečné vestavěné řetězcové konstanty. Níže je tabulka názvů a hodnot každé konstanty.

java long to string
název Hodnota
ascii_malá písmena Abcdefghijklmnopqrstuvwxyz
ascii_uppercase ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_letters ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
číslic 0123456789
hexadecimální číslice 0123456789abcdefABCDEF
osmičíslí 01234567

Tyto konstanty související s řetězci můžeme použít v regulárních výrazech, zpracování přirozeného jazyka, se spoustou zpracování řetězců a další.

Typové anotační konstanty

Od Pythonu 3.8 obsahuje typovací modul třídu Final, která nám umožňuje typové anotování konstant. Pokud použijeme třídu Final k definování konstant v programu, dostaneme chybu statického typu, kterou kontroluje mypy checker, a ukáže, že nemůžeme znovu přiřadit jméno Final. Pojďme pochopit následující příklad.

Příklad -

 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) 

Zadali jsme konstantní proměnnou s Final Class, která indikovala chybu typu, aby hlásila chybu, pokud je deklarovaný název znovu přiřazen. Dostane však hlášení o chybě kontroly typu; Python mění hodnotu MAX_SPEED. Final tedy nebrání neustálému náhodnému přeřazení za běhu.

Konstanty řetězce

Jak bylo uvedeno v předchozí části, Python nepodporuje striktní konstanty; má jen proměnné, které se nikdy nemění. Komunita Pythonu se proto řídí konvencí pojmenování pomocí velkého písmene k identifikaci konstantních proměnných.

To může být problém, pokud pracujeme na velkém projektu Python s mnoha programátory na různých úrovních. Bylo by tedy dobrou praxí mít mechanismus, který nám umožňuje používat striktní konstanty. Jak víme, Python je dynamický jazyk a existuje několik způsobů, jak učinit konstanty neměnnými. V této části se seznámíme s některými z těchto způsobů.

Atributy .__slots__

Třídy Pythonu poskytují možnost používat atributy __slots__. Slot má speciální mechanismus pro zmenšení velikosti předmětů. Jedná se o koncept optimalizace paměti objektů. Pokud ve třídě použijeme atribut __slots__, nebudeme moci přidat novou instanci, protože nepoužívá atributy __dict__. Navíc nemít a .__diktovat__ implikuje optimalizaci z hlediska spotřeby paměti. Pojďme pochopit následující příklad.

Příklad – Bez použití atributů __slots__

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

Výstup -

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

Každý objekt v Pythonu obsahuje dynamický slovník, který umožňuje přidávat atributy. Slovníky spotřebovávají spoustu paměti a používání __slotů__ snižuje plýtvání místem a pamětí. Podívejme se na další příklad.

Příklad -

Panel nástrojů rychlého přístupu ms word
 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) 

Výstup -

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

Ve výše uvedeném kódu jsme inicializovali atributy třídy pomocí atributů slotů. Proměnná má konstantní hodnotu, pokud se pokusíme proměnnou přeřadit, dostaneme chybu.

@property Decorator

Můžeme také použít @vlastnictví decorator k vytvoření třídy, která funguje jako jmenný prostor pro konstanty. Potřebujeme pouze definovat vlastnost konstant, aniž bychom jim poskytli metodu setter. Pojďme pochopit následující příklad.

Příklad -

 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) 

Výstup -

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

Jsou to vlastnosti pouze pro čtení, pokud se pokusíme znovu přiřadit, dostaneme an AttributeError.

Funkce namedtuple() Factory

Modul kolekce Pythonu je dodáván s tovární funkcí nazvanou namedtuple(). Za použití Namedtuple() funkce, můžeme použít pojmenovaná pole a tečkovou notaci pro přístup k jejich položkám. Víme, že n-tice jsou neměnné, což znamená, že nemůžeme upravit existující pojmenovaný objekt n-tice na místě.

Pojďme pochopit následující příklad.

Příklad -

 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) 

Výstup -

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

@dataclass Decorator

Jak název napovídá, datová třída obsahuje data, mohou se skládat z metod, ale není to jejich primární cíl. K vytvoření datových tříd musíme použít dekorátor @dataclass. Můžeme také vytvořit striktní konstanty. Dekorátor @dataclass přebírá zmrazený argument, který nám umožňuje označit naši datovou třídu jako neměnnou. Výhody použití dekorátoru @dataclass, nemůžeme upravit jeho atribut instance.

Pojďme pochopit následující příklad.

Příklad -

 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) 

Výstup -

 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' 

Vysvětlení -

Ve výše uvedeném kódu jsme importovali dekorátor @dataclass. Tento dekorátor jsme použili pro ConstantsName, abychom z něj udělali datovou třídu. Argument zmrazené nastavíme na hodnotu True, aby byla datová třída neměnná. Vytvořili jsme instanci datové třídy a můžeme přistupovat ke všem konstantám, ale nemůžeme je upravovat.

Speciální metoda .__setattr__().

Python nám umožňuje používat speciální metodu nazvanou .__setattr__(). Pomocí této metody můžeme přizpůsobit proces přiřazení atributů, protože Python automaticky volá metodu při každém přiřazení atributu. Pojďme pochopit následující příklad -

Příklad -

 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) 

Výstup -

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

Metoda __setattr__() neumožňuje provádět žádnou operaci přiřazení atributů třídy. Pokud se pokusíme přeřadit, prostě to zvýší AttributeError.

Závěr

Konstanty se nejvíce používají v konceptu v programování, zejména v matematickém termínu. V tomto tutoriálu jsme se dozvěděli o důležitých konceptech konstant a jejich příchutích. Komunita Pythonu používá velká písmena jako konvenci názvu k identifikaci konstant. Nicméně jsme probrali některé pokročilé způsoby použití konstant v Pythonu. Diskutovali jsme o tom, jak zlepšit čitelnost kódu, jeho opětovné použití a udržovatelnost pomocí konstant. Zmínili jsme, jak aplikovat různé techniky, aby naše konstanty Pythonu byly přísně konstantní.