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