logo

Typy konštanty v Pythone | Význam konštanty v Pythone

V tomto návode sa dozvieme o konštantných typoch a o tom, ako pomáhajú zlepšiť čitateľnosť kódu. Ak nie ste oboznámení, konštanty sú názvy predstavujúce hodnoty, ktoré sa počas vykonávania programu nemenia. Sú najbežnejším základným konceptom v programovaní. Python však nemá vyhradenú syntax na definovanie konštánt. Vo všeobecnosti sú konštanty Pythonu premenné, ktoré sa nikdy nemenia. Podrobnú diskusiu o konštante Pythonu budeme mať v nasledujúcej časti.

Čo sú konštanty?

Vo všeobecnosti sa v matematike používa konštantný výraz, hodnota alebo množstvo, ktoré sa nikdy nemení. Pri programovaní sa konštanta vzťahuje na názov spojený s hodnotou, ktorá sa počas vykonávania programovania nikdy nemení. Programovacia konštanta sa líši od ostatných konštánt a pozostáva z dvoch vecí – názvu a pridruženej hodnoty. Názov bude popisovať, o čom konštanta je, a hodnota je konkrétnym vyjadrením samotnej konštanty.

Keď definujeme konštantu, môžeme pristupovať iba k jej hodnote, ale nemôžeme ju časom meniť. Hodnotu premennej však môžeme upraviť. Reálny príklad je - Rýchlosť svetla, počet minút za hodinu a názov koreňového priečinka projektu.

Prečo používať Constant?

V programovacích jazykoch nám konštanty umožňujú chrániť sa pred náhodnou zmenou ich hodnoty, ktorá môže spôsobiť ťažko laditeľné chyby. Je tiež užitočné, aby bol kód čitateľnejší a udržiavateľný. Pozrime sa na niektoré výhody konštanty.

    Vylepšená čitateľnosť -Pomáha to zlepšiť čitateľnosť kódu. Napríklad je jednoduchšie prečítať a pochopiť konštantu s názvom MAX_SPEED než samotná hodnota podstatnej rýchlosti.Jasná komunikácia zámeru -Väčšina vývojárov považuje 3.14 za konštantu pi. Avšak názov Pi, pi alebo PI bude jasnejšie komunikovať zámer. Tento postup umožní inému vývojárovi pochopiť náš kód.Lepšia udržiavateľnosť -Konštanty nám umožňujú používať rovnakú hodnotu v celom kóde. Predpokladajme, že chceme aktualizovať hodnotu konštanty; nemusíme meniť každý prípad.Nízke riziko chýb -Konštanta predstavujúca danú hodnotu v programe je menej náchylná na chyby. Ak chceme zmeniť presnosť výpočtov, nahradenie hodnoty môže byť riskantné. Namiesto toho, aby sme ho nahradili, môžeme vytvoriť rôzne konštanty pre rôzne úrovne presnosti a zmeniť kód tam, kde sme potrebovali.Bezpečné ukladanie dát -Konštanty sú objekty bezpečné pre vlákna, čo znamená, že niekoľko vlákien môže súčasne používať konštantu bez rizika straty údajov.

Používateľom definované konštanty

Na definovanie konštanty v Pythone musíme použiť konvenciu pomenovania v Pythone. Meno by sme mali písať veľkými písmenami s podčiarkovníkom oddeľujúcim slová.

Nasleduje príklad užívateľom definovaných konštánt 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 sme rovnaký spôsob, ako vytvárame premenné v Pythone. Môžeme teda predpokladať, že konštanty Pythonu sú len premenné a jediný rozdiel je v tom, že konštanta používa iba veľké písmená.

Používanie veľkých písmen odlišuje konštantu od našich premenných a je to užitočná alebo preferovaná prax.

Vyššie sme diskutovali o užívateľom definovaných užívateľoch; Python tiež poskytuje niekoľko interných názvov, ktoré možno považovať za konštanty a mali by sa s nimi zaobchádzať.

Dôležité konštanty v Pythone

V tejto časti sa dozvieme o niektorých interných konštantách, ktoré sa používajú na zvýšenie čitateľnosti kódu Pythonu. Poďme pochopiť niektoré dôležité konštanty.

Vstavané konštanty

V oficiálnej dokumentácii je Pravda a Nepravdivé sú uvedené ako prvé konštanty. Toto sú boolovské hodnoty Pythonu a sú inštanciou int. A Pravda má hodnotu 1 a Nepravdivé má hodnotu 0.

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

Pamätajte, že pravdivé a nepravdivé mená sú prísne konštanty. Inými slovami, nemôžeme ich priradiť a ak sa ich pokúsime zmeniť, dostaneme chybu syntaxe. Tieto dve hodnoty sú jednotlivé objekty v Pythone, čo znamená, že existuje iba jedna inštancia.

úplná sčítačka

Interné mená Dunder

Python má tiež veľa interných hrom mená, ktoré môžeme považovať za konštanty. Existuje niekoľko týchto jedinečných mien, v tejto časti sa dozvieme o __name__ a __file__.

Atribút __name__ súvisí s tým, ako spustiť danú časť kódu. Pri importe modulu Python interne nastaví __name__ na reťazec obsahujúci názov modulu.

new_file.py

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

Do príkazového riadka zadajte nasledujúci príkaz -

 python -c 'import new_file' 

-c sa používa na spustenie malej časti kódu Pythonu na príkazovom riadku. Vo vyššie uvedenom príklade sme importovali súbor nový_súbor modul, ktorý zobrazuje niektoré správy na obrazovke.

Výkon -

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

Ako vidíme, že __name__ ukladá reťazec __main__, znamená to, že môžeme spúšťať spustiteľné súbory priamo ako program Python.

Na druhej strane, atribút __file__ má súbor, ktorý Python práve importuje alebo spúšťa. Ak vo vnútri súboru použijeme atribút __file__, dostaneme cestu k samotnému modulu.

Pozrime sa na nasledujúci príklad -

java polymorfizmus

Príklad -

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

Výkon:

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

Môžeme tiež spustiť priamo a dostaneme rovnaký výsledok.

Príklad -

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

Výkon:

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

Užitočné reťazcové a matematické konštanty

V štandardnej knižnici je veľa cenných konštánt. Niektoré sú striktne spojené so špecifickými modulmi, funkciami a triedami; mnohé sú všeobecné a môžeme ich použiť v niekoľkých scenároch. V nižšie uvedenom príklade použijeme matematický a reťazcový modul math a string.

Poďme pochopiť nasledujúci príklad -

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

Tieto konštanty budú hrať dôležitú úlohu pri písaní matematického kódu alebo pri vykonávaní niektorých špecifických výpočtov.

Poďme pochopiť nasledujúci príklad -

abs c kód

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

Vo vyššie uvedenom kóde sme použili math.pi namiesto zvyku PI konštanty. Konštanta súvisiaca s matematikou poskytuje programu viac kontextov. Výhodou použitia konštanty math.pi je, že ak používame staršiu verziu Pythonu, dostaneme 32-bitovú verziu Pi. Ak použijeme vyššie uvedený program v modernej verzii Pythonu, získame 64-bitovú verziu pi. Náš program sa teda sám prispôsobí svojmu konkrétnemu vykonávaciemu prostrediu.

Reťazový modul tiež poskytuje niektoré užitočné vstavané reťazcové konštanty. Nižšie je uvedená tabuľka s názvom a hodnotou každej konštanty.

názov Hodnota
ascii_malé písmená Abcdefghijklmnopqrstuvwxyz
ascii_uppercase ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_letters ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
číslic 0123456789
šestnástkové číslice 0123456789abcdefABCDEF
osemčíslie 01234567

Tieto konštanty súvisiace s reťazcami môžeme použiť v regulárnych výrazoch, pri spracovaní prirodzeného jazyka, s množstvom spracovania reťazcov a podobne.

Typovo anotujúce konštanty

Od Pythonu 3.8 obsahuje typovací modul triedu Final, ktorá nám umožňuje typové anotovanie konštánt. Ak použijeme triedu Final na definovanie konštánt v programe, dostaneme chybu statického typu, ktorú kontroluje mypy checker a ukáže, že nemôžeme preradiť meno Final. Poďme pochopiť nasledujúci príklad.

Prí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) 

Konštantnú premennú sme špecifikovali s Final Class, ktorá indikovala chybu typu, aby nahlásila chybu, ak je deklarovaný názov znova priradený. Dostane však hlásenie o chybe typovej kontroly; Python mení hodnotu MAX_SPEED. Final teda nezabráni neustálemu náhodnému preraďovaniu za behu.

Konštanty reťazca

Ako bolo uvedené v predchádzajúcej časti, Python nepodporuje prísne konštanty; má len premenné, ktoré sa nikdy nemenia. Preto sa komunita Pythonu riadi konvenciou pomenovania používania veľkého písmena na identifikáciu konštantných premenných.

Môže to byť problém, ak pracujeme na veľkom projekte Python s mnohými programátormi na rôznych úrovniach. Preto by bolo dobrým zvykom mať mechanizmus, ktorý nám umožňuje používať prísne konštanty. Ako vieme, Python je dynamický jazyk a existuje niekoľko spôsobov, ako urobiť konštanty nemennými. V tejto časti sa dozvieme o niektorých z týchto spôsobov.

java tostring

Atribúty .__slots__

Triedy Pythonu poskytujú možnosť používať atribúty __slots__. Slot má špeciálny mechanizmus na zmenšenie veľkosti predmetov. Ide o koncept optimalizácie pamäte na objektoch. Ak v triede použijeme atribút __slots__, nebudeme môcť pridať novú inštanciu, pretože nepoužíva atribúty __dict__. Navyše, nemať a .__dikt__ implikuje optimalizáciu z hľadiska spotreby pamäte. Poďme pochopiť nasledujúci príklad.

Príklad – Bez použitia atribútov __slots__

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

Výkon -

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

Každý objekt v Pythone obsahuje dynamický slovník, ktorý umožňuje pridávanie atribútov. Slovníky spotrebúvajú veľa pamäte a používanie __slotov__ znižuje plytvanie priestorom a pamäťou. Pozrime sa na ďalší príklad.

Príklad -

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

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

Vo vyššie uvedenom kóde sme inicializovali atribúty triedy s atribútmi slotov. Premenná má konštantnú hodnotu, ak sa pokúsime premennú znova priradiť, dostaneme chybu.

@property Decorator

Môžeme použiť aj @nehnuteľnosť decorator na vytvorenie triedy, ktorá funguje ako menný priestor pre konštanty. Potrebujeme len definovať vlastnosť konštánt bez toho, aby sme im poskytli metódu setter. Poďme pochopiť nasledujúci príklad.

Prí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ýkon -

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

Sú to vlastnosti len na čítanie, ak sa ich pokúsime zmeniť, dostaneme AttributeError.

Továrenská funkcia namedtuple().

Kolekčný modul Pythonu sa dodáva s továrenskou funkciou s názvom namedtuple(). Pomocou namedtuple() funkciu, môžeme použiť pomenované polia a bodkový zápis na prístup k ich položkám. Vieme, že n-tice sú nemenné, čo znamená, že nemôžeme upraviť existujúci objekt s názvom n-tice na mieste.

Poďme pochopiť nasledujúci príklad.

Prí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ýkon -

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

@dataclass Decorator

Ako už názov napovedá, dátová trieda obsahuje dáta, môžu pozostávať z metód, ale nie je to ich primárny cieľ. Na vytvorenie dátových tried musíme použiť dekorátor @dataclass. Môžeme tiež vytvoriť prísne konštanty. Dekorátor @dataclass používa zmrazený argument, ktorý nám umožňuje označiť našu triedu údajov ako nemennú. Výhody použitia dekorátora @dataclass, nemôžeme upravovať jeho atribút inštancie.

Poďme pochopiť nasledujúci príklad.

b+ strom

Prí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ýkon -

 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' 

vysvetlenie -

Vo vyššie uvedenom kóde sme importovali dekorátor @dataclass. Tento dekorátor sme použili pre ConstantsName, aby sme z neho urobili dátovú triedu. Argument zmrazenia sme nastavili na hodnotu True, aby bola dátová trieda nemenná. Vytvorili sme inštanciu dátovej triedy a môžeme pristupovať ku všetkým konštantám, ale nemôžeme ich upravovať.

Špeciálna metóda .__setattr__().

Python nám umožňuje použiť špeciálnu metódu s názvom .__setattr__(). Pomocou tejto metódy môžeme prispôsobiť proces priraďovania atribútov, pretože Python automaticky volá metódu pri každom priradení atribútu. Poďme pochopiť nasledujúci príklad -

Prí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ýkon -

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

Metóda __setattr__() neumožňuje vykonať žiadnu operáciu priradenia atribútov triedy. Ak sa pokúsime preradiť, jednoducho to zvýši AttributeError.

Záver

Konštanty sa najviac používajú v koncepcii v programovaní, najmä v matematickom zmysle. V tomto návode sme sa dozvedeli o dôležitých pojmoch konštanty a ich príchutiach. Komunita Pythonu používa veľké písmeno ako konvenciu názvu na identifikáciu konštánt. Diskutovali sme však o niektorých pokročilých spôsoboch použitia konštánt v Pythone. Diskutovali sme o tom, ako zlepšiť čitateľnosť kódu, jeho opätovnú použiteľnosť a udržiavateľnosť pomocou konštánt. Spomenuli sme, ako použiť rôzne techniky, aby boli naše konštanty Pythonu prísne konštantné.