logo

A konstansok típusai a Pythonban | A konstans jelentősége a Pythonban

Ebben az oktatóanyagban megismerjük a konstans típusokat, és azt, hogy ezek hogyan segítenek javítani a kód olvashatóságát. Ha nem ismeri, a konstansok olyan értékeket jelölnek, amelyek nem változnak a program végrehajtása során. Ezek a leggyakoribb alapfogalmak a programozásban. A Python azonban nem rendelkezik dedikált szintaxissal az állandók meghatározásához. Általában a Python-konstansok olyan változók, amelyek soha nem változnak. A Python konstansról a következő részben lesz részletes megbeszélésünk.

Mik azok a konstansok?

A matematikában általában állandó kifejezést használnak, olyan értéket vagy mennyiséget, amely soha nem változik. A programozásban a konstans egy értékhez társított névre utal, amely soha nem változik a programozás végrehajtása során. A programozási állandó különbözik a többi konstanstól, és két dologból áll - egy névből és egy kapcsolódó értékből. A név leírja, hogy miről szól az állandó, az érték pedig magának az állandónak a konkrét kifejezése.

Miután meghatároztuk az állandót, csak az értékéhez férhetünk hozzá, de nem tudjuk idővel megváltoztatni. A változó értékét azonban módosíthatjuk. Egy valós példa: A fénysebesség, a percek száma egy órán belül és a projekt gyökérmappájának neve.

Miért használja a Constantot?

A programozási nyelvekben a konstansok lehetővé teszik számunkra, hogy megvédjük az értéküket az értékük véletlen megváltoztatásától, ami nehezen hibakereshető hibákat okozhat. Hasznos az is, hogy a kód olvashatóbbá és karbantarthatóbbá váljon. Nézzük meg az állandó előnyeit.

    Továbbfejlesztett olvashatóság -Segít a kód olvashatóságának javításában. Például könnyebb egy MAX_SPEED nevű állandót olvasni és megérteni, mint magát a lényeges sebességértéket.A szándék egyértelmű közlése -A legtöbb fejlesztő a 3.14-et tekinti pi állandónak. A Pi, pi vagy PI név azonban világosabban kommunikálja a szándékot. Ez a gyakorlat lehetővé teszi egy másik fejlesztő számára, hogy megértse a kódunkat.Jobb karbantarthatóság -A konstansok lehetővé teszik, hogy ugyanazt az értéket használjuk a kódban. Tegyük fel, hogy frissíteni akarjuk a konstans értékét; nem kell minden esetben változtatnunk.Alacsony hibakockázat -A programban egy adott értéket képviselő konstans kevésbé hibás. Ha változtatni akarunk a számítások pontosságán, az érték cseréje kockázatos lehet. Ahelyett, hogy lecserélnénk, különböző konstansokat hozhatunk létre a különböző pontossági szintekhez, és megváltoztathatjuk a kódot, ahol szükséges.Szálbiztos adattárolás -Az állandók szálbiztos objektumok, ami azt jelenti, hogy több szál egyidejűleg használhat egy konstanst anélkül, hogy kockáztatná az adatvesztést.

Felhasználó által definiált állandók

A Pythonban az elnevezési konvenciót kell használnunk a Python konstans meghatározásához. A nevet nagybetűkkel írjuk, a szavakat elválasztó aláhúzással.

A következő példa a felhasználó által definiált Python-konstansokra -

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

Ugyanazt a módszert használtuk, mint a Pythonban változókat. Feltételezhetjük tehát, hogy a Python-konstansok csak változók, és az egyetlen különbség az, hogy a konstans csak nagybetűket használ.

A nagybetűk használatával a konstans kiemelkedik változóink közül, és hasznos vagy előnyben részesített gyakorlat.

Fentebb a felhasználó által definiált felhasználókat tárgyaltuk; A Python számos belső nevet is biztosít, amelyek konstansnak tekinthetők és kezelhetők.

Fontos állandók a Pythonban

Ebben a részben megismerünk néhány belső állandót, amelyek a Python kód olvashatóbbá tételére szolgálnak. Értsünk meg néhány fontos állandót.

nevezzen át egy könyvtárat Linuxon

Beépített állandók

A hivatalos dokumentációban a Igaz és Hamis első állandóként szerepelnek. Ezek Python logikai értékek, és az int. A Igaz értéke 1, és Hamis értéke 0.

Példa -

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

Ne feledje, hogy az igaz és hamis nevek szigorú állandók. Más szóval, nem tudjuk őket újra rendelni, és ha megpróbáljuk újra hozzárendelni őket, szintaktikai hibát kapunk. Ez a két érték egyszemélyes objektum a Pythonban, ami azt jelenti, hogy csak egy példány létezik.

Belső Dunder nevek

A Pythonnak is sok belsője van mennydörgés nevek, amelyeket konstansnak tekinthetünk. Több ilyen egyedi név létezik, ebben a részben a __name__ és a __file__ névvel fogunk megismerkedni.

A __name__ attribútum egy adott kódrészlet futtatásához kapcsolódik. Modul importálásakor a Python interior a __name__ értéket a modul nevét tartalmazó karakterláncra állítja be.

new_file.py

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

A parancssorba írja be a következő parancsot -

 python -c 'import new_file' 

A -c a Python egy kis kódrészletének végrehajtására szolgál a parancssorban. A fenti példában importáltuk a új fájl modult, amely néhány üzenetet jelenít meg a képernyőn.

Kimenet -

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

Amint látjuk, hogy a __name__ tárolja a __main__ karakterláncot, azt jelzi, hogy a végrehajtható fájlokat közvetlenül Python programként futtathatjuk.

Másrészt a __file__ attribútum tartalmazza azt a fájlt, amelyet a Python éppen importál vagy végrehajt. Ha a fájlon belül a __file__ attribútumot használjuk, akkor magának a modulnak az elérési útját kapjuk meg.

Nézzük a következő példát -

Példa -

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

Kimenet:

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

Közvetlenül is futhatunk, és ugyanazt az eredményt kapjuk.

Példa -

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

Kimenet:

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

Hasznos karakterláncok és matematikai állandók

A standard könyvtárban sok értékes állandó található. Néhányuk szigorúan meghatározott modulokhoz, funkciókhoz és osztályokhoz kapcsolódik; sok általános, és több forgatókönyvben is használhatjuk őket. Az alábbi példában a matematikai és a karakterláncokhoz kapcsolódó matematikai és karakterlánc modulokat fogjuk használni.

Értsük meg a következő példát -

Példa -

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

Ezek a konstansok létfontosságú szerepet fognak játszani, amikor matematikával kapcsolatos kódot írunk vagy bizonyos számításokat végzünk.

Értsük meg a következő példát -

Példa -

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

A fenti kódban a math.pi szokás helyett PI állandók. A matematikai konstans több kontextust biztosít a programhoz. A math.pi konstans használatának az az előnye, hogy ha a Python régebbi verzióját használjuk, akkor a Pi 32 bites verzióját kapjuk. Ha a fenti programot a Python modern verziójában használjuk, akkor a pi 64 bites verzióját kapjuk. Így programunk önállóan alkalmazkodik a konkrét végrehajtási környezetéhez.

A karakterlánc-modul néhány hasznos beépített karakterlánc-állandót is tartalmaz. Az alábbiakban az egyes állandók nevének és értékének táblázata látható.

Név Érték
ascii_lowercase Abcdefghijklmnopqrstuvwxyz
ascii_nagybetű ABCDEFGHIJKLMNOPQRSTUVWXYZ
ascii_levelek ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
számjegyek 0123456789
hatjegyű 0123456789abcdefABCDEF
nyolcas számjegyek 01234567

Ezeket a karakterláncokhoz kapcsolódó konstansokat használhatjuk reguláris kifejezésekben, természetes nyelv feldolgozásában, sok karakterlánc-feldolgozásnál stb.

Típusannotáló konstansok

A Python 3.8 óta a gépelési modul tartalmaz egy Final osztályt, amely lehetővé teszi az állandók beírását. Ha a programban a Final osztályt használjuk a konstansok definiálására, akkor a mypy ellenőrző által ellenőrzött statikus típushibát kapjuk, és azt mutatja, hogy nem tudjuk átadni a Final nevet. Értsük meg a következő példát.

Példa -

vagány nyelv
 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) 

Megadtuk az állandó változót a Final Class-szal, amely a típushibát jelezte, hogy hibát jelentsen, ha egy deklarált név újra van rendelve. Azonban kap egy jelentést a típusellenőrző hibájáról; A Python megváltoztatja a MAX_SPEED értékét. Tehát a Final nem akadályozza meg az állandó véletlen átcsoportosítást futás közben.

String állandók

Ahogy az előző részben tárgyaltuk, a Python nem támogatja a szigorú konstansokat; csak olyan változói vannak, amelyek soha nem változnak. Ezért a Python közösség azt az elnevezési konvenciót követi, hogy nagybetűt használ az állandó változók azonosítására.

Problémát jelenthet, ha egy nagy Python projekten dolgozunk, sok programozóval különböző szinten. Tehát jó gyakorlat lenne egy olyan mechanizmus, amely lehetővé teszi szigorú konstansok használatát. Mint tudjuk, a Python egy dinamikus nyelv, és számos módja van az állandók megváltoztathatatlanná tételére. Ebben a részben ezekről a módokról tanulunk meg.

A .__slots__ attribútumok

A Python osztályok lehetőséget biztosítanak a __slots__ attribútumok használatára. A nyílás speciális mechanizmussal rendelkezik, amely csökkenti az objektumok méretét. Ez az objektumok memóriaoptimalizálásának koncepciója. Ha az osztályban a __slots__ attribútumot használjuk, akkor nem tudjuk hozzáadni az új példányt, mert nem használ __dict__ attribútumot. Ezen túlmenően, ha nem rendelkezik a .__dict__ Az attribútum a memóriafogyasztás optimalizálását jelenti. Értsük meg a következő példát.

Példa – A __slots__ attribútumok használata nélkül

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

Kimenet -

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

A Pythonban minden objektum tartalmaz egy dinamikus szótárat, amely lehetővé teszi attribútumok hozzáadását. A szótárak sok memóriát fogyasztanak, és a __slots__ használata csökkenti a hely- és memóriapazarlást. Lássunk egy másik példát.

Példa -

 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) 

Kimenet -

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

A fenti kódban az osztály attribútumait inicializáltuk a slot attribútumokkal. A változónak állandó értéke van, ha megpróbáljuk újra hozzárendelni a változót, akkor hibát kapunk.

Az @ingatlan dekorátor

Használhatjuk is @ingatlan dekorátor, hogy hozzon létre egy osztályt, amely névtérként működik az állandók számára. Csak meg kell határoznunk a konstans tulajdonságot anélkül, hogy beállító metódussal látnánk el. Értsük meg a következő példát.

Példa -

 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) 

Kimenet -

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

Ezek csak olvasható tulajdonságok, ha megpróbáljuk átrendelni, akkor egy an-t kapunk AttributeError.

A namedtuple() gyári függvény

A Python gyűjtőmodulja tartalmazza a namedtuple() nevű gyári függvényt. Használni a namedtuple() függvényében a megnevezett mezőket és a pont jelölést használhatjuk az elemeik eléréséhez. Tudjuk, hogy a sorok megváltoztathatatlanok, ami azt jelenti, hogy nem módosíthatunk egy létező nevű tuple objektumot a helyén.

Értsük meg a következő példát.

Példa -

 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) 

Kimenet -

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

A @dataclass dekorátor

Ahogy a neve is sugallja, az adatosztály adatokat tartalmaz, állhatnak metódusokból, de nem ez az elsődleges céljuk. Az adatosztályok létrehozásához a @dataclass dekorátort kell használnunk. Létrehozhatjuk a szigorú konstansokat is. A @dataclass dekorátor egy fagyott argumentumot vesz fel, amely lehetővé teszi számunkra, hogy az adatosztályunkat megváltoztathatatlanként jelöljük meg. A @dataclass dekorátor használatának előnyei, nem tudjuk módosítani a példány attribútumait.

Értsük meg a következő példát.

Példa -

 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) 

Kimenet -

 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' 

Magyarázat -

A fenti kódban importáltuk a @dataclass dekorátort. Ezt a díszítőt használtuk a ConstantsName-hez, hogy adatosztályt hozzunk létre. A fagyasztott argumentumot True-ra állítottuk, hogy az adatosztály változhatatlan legyen. Létrehoztuk az adatosztály példányát, és az összes állandót elérjük, de nem módosíthatjuk.

A .__setattr__() speciális módszer

A Python lehetővé teszi a .__setattr__() nevű speciális metódus használatát. Ezzel a módszerrel testreszabhatjuk az attribútum-hozzárendelési folyamatot, mivel a Python automatikusan meghívja a metódust minden attribútum-hozzárendeléskor. Értsük meg a következő példát -

Példa -

 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) 

Kimenet -

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

A __setattr__() metódus nem teszi lehetővé az osztály attribútumainak hozzárendelési műveleteinek végrehajtását. Ha megpróbáljuk átcsoportosítani, akkor csak emeljen egy AttributeError.

Következtetés

A konstansokat leginkább a programozás fogalmában használják, különösen matematikai értelemben. Ebben az oktatóanyagban megismerkedtünk az állandók fontos fogalmaival és ízeivel. A Python közösség nagybetűt használ névkonvencióként az állandók azonosítására. Megbeszéltünk azonban néhány előrehaladott módot a konstansok használatára a Pythonban. Megbeszéltük, hogyan javítható a kód olvashatósága, újrafelhasználhatósága és karbantarthatósága konstansokkal. Említettük, hogyan alkalmazhatunk különféle technikákat, hogy Python-konstansainkat szigorúan állandóvá tegyük.