Tässä opetusohjelmassa opimme vakiotyypeistä ja kuinka ne auttavat parantamaan koodin luettavuutta. Jos olet tuntematon, vakiot ovat nimiä, jotka edustavat arvoja, jotka eivät muutu ohjelman suorituksen aikana. Ne ovat ohjelmoinnin yleisin peruskäsite. Pythonilla ei kuitenkaan ole omaa syntaksia vakioiden määrittämiseen. Yleensä Python-vakiot ovat muuttujia, jotka eivät koskaan muutu. Käymme yksityiskohtaisen keskustelun Python-vakiosta tulevassa osiossa.
Mitä ovat vakiot?
Yleensä matematiikassa käytetään vakiotermiä, arvoa tai määrää, joka ei koskaan muutu. Ohjelmoinnissa vakio viittaa nimeen, joka liittyy arvoon, joka ei koskaan muutu ohjelmoinnin suorittamisen aikana. Ohjelmointivakio eroaa muista vakioista, ja se koostuu kahdesta asiasta - nimestä ja siihen liittyvästä arvosta. Nimi kertoo, mistä vakiosta on kyse, ja arvo on itse vakion konkreettinen ilmaus.
Kun olemme määrittäneet vakion, voimme käyttää vain sen arvoa, mutta emme voi muuttaa sitä ajan myötä. Voimme kuitenkin muuttaa muuttujan arvoa. Tosielämän esimerkki on - Valon nopeus, minuuttien määrä tunnissa ja projektin juurikansion nimi.
Miksi käyttää Constantia?
Ohjelmointikielissä vakiot antavat meille mahdollisuuden suojautua niiden arvon muuttamiselta vahingossa, mikä voi aiheuttaa vaikeasti korjattavia virheitä. On myös hyödyllistä tehdä koodista luettavampaa ja ylläpidettävämpää. Katsotaanpa joitain vakion etuja.
Käyttäjän määrittämät vakiot
Meidän on käytettävä Pythonin nimeämiskäytäntöä vakion määrittämiseen Pythonissa. Meidän tulee kirjoittaa nimi isoilla kirjaimilla ja alaviivat erottavat sanat.
Seuraavassa on esimerkki käyttäjän määrittelemistä Python-vakioista -
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', ... ]
Olemme käyttäneet samaa tapaa kuin luomme muuttujia Pythonissa. Joten voimme olettaa, että Python-vakiot ovat vain muuttujia, ja ainoa ero on, että vakio käyttää vain isoja kirjaimia.
Isojen kirjainten käyttö tekee vakiosta erottuvan muuttujistamme ja on hyödyllinen tai suositeltava käytäntö.
Edellä käsiteltiin käyttäjän määrittämiä käyttäjiä; Python tarjoaa myös useita sisäisiä nimiä, joita voidaan pitää vakioina ja joita pitäisi käsitellä vakioina.
Pythonin tärkeät vakiot
Tässä osiossa opimme sisäisistä vakioista, joita käytetään Python-koodin helpottamiseksi. Ymmärretään joitain tärkeitä vakioita.
Sisäänrakennetut vakiot
Virallisissa asiakirjoissa Totta ja Väärä luetellaan ensimmäisenä vakiona. Nämä ovat Python Boolen arvoja ja ovat int. A Totta sen arvo on 1 ja Väärä on arvo 0.
Esimerkki -
>>> 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
Muista, että oikeat ja väärät nimet ovat tiukkoja vakioita. Toisin sanoen emme voi määrittää niitä uudelleen, ja jos yritämme määrittää ne uudelleen, saamme syntaksivirheen. Nämä kaksi arvoa ovat yksittäisiä objekteja Pythonissa, mikä tarkoittaa, että vain yksi esiintymä on olemassa.
Sisäiset Dunder-nimet
Pythonilla on myös monia sisäisiä ukkonen nimiä, joita voimme pitää vakioina. Näitä ainutlaatuisia nimiä on useita, tässä osiossa opimme __name__ ja __file__.
javan oletusparametrit
Attribuutti __name__ liittyy siihen, kuinka tietty koodinpätkä suoritetaan. Kun tuodaan moduulia, Python sisäinen asetti __name__:n merkkijonoksi, joka sisältää moduulin nimen.
uusi_tiedosto.py
print(f'The type of __name__ is: {type(__name__)}') print(f'The value of __name__ is: {__name__}')
Kirjoita komentoriville seuraava komento -
python -c 'import new_file'
-c:tä käytetään suorittamaan pieni Python-koodinpätkä komentorivillä. Yllä olevassa esimerkissä toimme uusi_tiedosto moduuli, joka näyttää joitain viestejä näytöllä.
alisa manyonok
Lähtö -
The type of __name__ is: The value of __name__ is: timezone
Kuten näemme, että __name__ tallentaa __main__-merkkijonon, osoittaa, että voimme ajaa suoritettavat tiedostot suoraan Python-ohjelmana.
Toisaalta attribuutilla __file__ on tiedosto, jota Python parhaillaan tuo tai suorittaa. Jos käytämme tiedoston sisällä attribuuttia __file__, saamme polun itse moduuliin.
Katsotaanpa seuraava esimerkki -
Esimerkki -
print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}')
Lähtö:
The type of __file__ is: The value of __file__ is: D:Python Project ew_file.py
Voimme myös juosta suoraan ja saamme saman tuloksen.
Esimerkki -
print(f'The type of __file__ is: {type(__file__)}') print(f'The value of __file__ is: {__file__}')
Lähtö:
python new_file.py The type of __file__ is: The value of __file__ is: timezone.py
Hyödyllisiä merkkijonoja ja matemaattisia vakioita
Vakiokirjastossa on monia arvokkaita vakioita. Jotkut ovat tiukasti yhteydessä tiettyihin moduuleihin, toimintoihin ja luokkiin; monet ovat yleisiä, ja voimme käyttää niitä useissa skenaarioissa. Alla olevassa esimerkissä käytämme matematiikkaa ja merkkijonoon liittyviä moduuleja matematiikka ja merkkijono.
Ymmärretään seuraava esimerkki -
Esimerkki -
>>> 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
Näillä vakioilla on keskeinen rooli, kun kirjoitamme matematiikkaan liittyvää koodia tai suoritamme tiettyjä laskutoimituksia.
Ymmärretään seuraava esimerkki -
Esimerkki -
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})'
Yllä olevassa koodissa olemme käyttäneet math.pi mukautetun sijaan PI vakioita. Matematiikkaan liittyvä vakio tarjoaa enemmän konteksteja ohjelmalle. Math.pi-vakion käytön etuna on, että jos käytämme Pythonin vanhempaa versiota, saamme Pi:stä 32-bittisen version. Jos käytämme yllä olevaa ohjelmaa Pythonin modernissa versiossa, saamme 64-bittisen version pi:stä. Joten ohjelmamme mukautuu itse konkreettiseen suoritusympäristöönsä.
Merkkijonomoduuli tarjoaa myös hyödyllisiä sisäänrakennettuja merkkijonovakioita. Alla on taulukko kunkin vakion nimestä ja arvosta.
Nimi | Arvo |
---|---|
ascii_pienet kirjaimet | Abcdefghijklmnopqrstuvwxyz |
ascii_isot kirjaimet | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
ascii_kirjaimet | ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz |
numeroita | 0123456789 |
heksanumerot | 0123456789abcdefABCDEF |
oktnumeroa | 01234567 |
Voimme käyttää näitä merkkijonoihin liittyviä vakioita säännöllisissä lausekkeissa, luonnollisen kielen käsittelyssä, monissa merkkijonojen käsittelyssä ja muissa.
Type-Annotating Vakiot
Python 3.8:sta lähtien kirjoitusmoduuli sisältää Final-luokan, jonka avulla voimme kirjoittaa vakioita. Jos käytämme Final-luokkaa määrittämään ohjelman vakiot, saamme staattisen tyyppivirheen, jonka mypy checker tarkistaa, ja se osoittaa, että emme voi määrittää uudelleen lopulliselle nimelle. Ymmärretään seuraava esimerkki.
Esimerkki -
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)
Määritimme vakiomuuttujan Final Classin kanssa, joka osoitti tyyppivirheen ilmoittaakseen virheestä, jos ilmoitettu nimi annetaan uudelleen. Se saa kuitenkin raportin tyyppitarkistuksen virheestä; Python muuttaa MAX_SPEED:n arvoa. Joten Final ei estä jatkuvaa vahingossa tapahtuvaa uudelleennimeämistä suorituksen aikana.
Merkkijonojen vakiot
Kuten edellisessä osiossa mainittiin, Python ei tue tiukkoja vakioita; siinä on vain muuttujia, jotka eivät koskaan muutu. Siksi Python-yhteisö noudattaa nimeämiskäytäntöä käyttämällä isoa kirjainta vakiomuuttujien tunnistamiseen.
Se voi olla ongelma, jos työskentelemme suuressa Python-projektissa useiden ohjelmoijien kanssa eri tasoilla. Siksi olisi hyvä käytäntö, että meillä on mekanismi, jonka avulla voimme käyttää tiukkoja vakioita. Kuten tiedämme, Python on dynaaminen kieli, ja on olemassa useita tapoja tehdä vakioista muuttumattomia. Tässä osiossa opimme joistakin näistä tavoista.
.__slots__-attribuutit
Python-luokat tarjoavat mahdollisuuden käyttää __slots__-attribuutteja. Aukossa on erityinen mekanismi, joka pienentää esineiden kokoa. Se on objektien muistin optimoinnin käsite. Jos käytämme luokassa attribuuttia __slots__, emme voi lisätä uutta esiintymää, koska se ei käytä __dict__-attribuutteja. Lisäksi, jolla ei ole a .__dict__ attribuutti tarkoittaa optimointia muistin kulutuksen suhteen. Ymmärretään seuraava esimerkki.
Esimerkki - ilman __slots__-attribuutteja
class NewClass(object): def __init__(self, *args, **kwargs): self.a = 1 self.b = 2 if __name__ == '__main__': instance = NewClass() print(instance.__dict__)
Lähtö -
Tarkista null javassa
{'a': 1, 'b': 2}
Jokainen Pythonin objekti sisältää dynaamisen sanakirjan, joka mahdollistaa attribuuttien lisäämisen. Sanakirjat kuluttavat paljon muistia, ja __slots__-tunnisteiden käyttö vähentää tilan ja muistin hukkaa. Katsotaanpa toinen esimerkki.
Esimerkki -
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)
Lähtö -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 10, in AttributeError: 'ConstantsName' object attribute 'PI' is read-only
Yllä olevassa koodissa alustimme luokan attribuutit slot-attribuutteilla. Muuttujalla on vakioarvo, jos yritämme määrittää muuttujan uudelleen, saamme virheilmoituksen.
@kiinteistön sisustaja
Voimme myös käyttää @omaisuus decorator luodaksesi luokan, joka toimii vakioiden nimitilana. Meidän on vain määritettävä vakioiden ominaisuus antamatta heille setter-menetelmää. Ymmärretään seuraava esimerkki.
Esimerkki -
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)
Lähtö -
alamerkkijono bashissa
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 13, in AttributeError: can't set attribute
Ne ovat vain luku -ominaisuuksia, jos yritämme määrittää uudelleen, saamme an AttributeError.
Nimetty tuple()-tehdasfunktio
Pythonin kokoelmamoduulissa on tehdastoiminto nimeltä namedtuple(). Käyttämällä namedtuple() -funktion avulla voimme käyttää nimettyjä kenttiä ja pistemerkintää niiden kohteiden käyttämiseen. Tiedämme, että monikot ovat muuttumattomia, mikä tarkoittaa, että emme voi muokata olemassa olevaa nimettyä monikkoobjektia paikallaan.
Ymmärretään seuraava esimerkki.
Esimerkki -
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)
Lähtö -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 17, in AttributeError: can't set attribute
@dataclass-sisustaja
Kuten nimestä voi päätellä, dataluokka sisältää dataa, ne voivat koostua menetelmistä, mutta se ei ole niiden ensisijainen tavoite. Meidän on käytettävä @dataclass-koristelijaa tietoluokkien luomiseen. Voimme myös luoda tiukat vakiot. @dataclass-sisustaja käyttää jäädytettyä argumenttia, jonka avulla voimme merkitä tietoluokkamme muuttumattomiksi. @dataclass decoratorin käytön edut, emme voi muokata sen esiintymän attribuuttia.
Ymmärretään seuraava esimerkki.
Esimerkki -
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)
Lähtö -
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'
Selitys -
Yllä olevaan koodiin olemme tuoneet @dataclass-sisustimen. Käytimme tätä sisustuselementtiä ConstantsNameen tehdäksemme siitä dataluokan. Asetamme jäädytetyksi argumentiksi True, jotta tietoluokka muuttuu muuttumattomaksi. Loimme tietoluokan esiintymän, ja voimme käyttää kaikkia vakioita, mutta emme voi muokata niitä.
.__setattr__() -erikoismenetelmä
Python antaa meille mahdollisuuden käyttää erityistä menetelmää nimeltä .__setattr__(). Tällä menetelmällä voimme mukauttaa attribuuttien määritysprosessia, koska Python kutsuu menetelmää automaattisesti jokaisessa määritteen määrittämisessä. Ymmärretään seuraava esimerkki -
Esimerkki -
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)
Lähtö -
3.141592653589793 2.718281828459045 Traceback (most recent call last): File '', line 22, in File '', line 17, in __setattr__ AttributeError: can't reassign constant 'PI'
Metodi __setattr__() ei salli minkään luokan määritteiden määritystoimintojen suorittamista. Jos yritämme määrittää uudelleen, se vain nostaa an AttributeError.
Johtopäätös
Vakioita käytetään eniten ohjelmoinnin konseptissa erityisesti matemaattisessa termissä. Tässä opetusohjelmassa olemme oppineet tärkeistä vakioiden ja niiden makujen käsitteistä. Python-yhteisö käyttää isoja kirjaimia nimisääntönä vakioiden tunnistamiseen. Olemme kuitenkin keskustelleet joistakin edistyneistä tavoista käyttää vakioita Pythonissa. Olemme keskustelleet siitä, miten koodin luettavuutta, uudelleenkäytettävyyttä ja ylläpidettävyyttä voidaan parantaa vakioiden avulla. Mainitsimme kuinka soveltaa erilaisia tekniikoita Python-vakioiden tekemiseksi tiukasti vakioiksi.