Python programmalastırıw tilin úyreniw 4-BÓLIM_(Tipler hám Operaсiyalar)
.pdfUsı waqıtqa shekem kórgen tiykarǵı tiplerden tısqarı, qanshelli keń anıqlanǵanına baylanıslı toparǵa aǵza bolıwǵa ılayıq yamasa ılayıq emes basqa da tipler bar. Mısalı, jıyındılar (sets) - tilge jaqında qosılǵan, ol sáykeslik te, izbe-izlik te emes; kerisinshe, olar qaytalanbaytuǵın hám ózgermeytuǵın obyektlerdiń tártipsiz toplamları bolıp tabıladı. Jıyındılar qurılǵan set funkсiyasın shaqırıw arqalı yamasa 3.0 versiyasında jańa jıyındı literalları hám ańlatpaların qollanıw arqalı jasaladı hám ádettegi matematikalıq jıyındı operaсiyaların qollaydı (3.0 versiyasında jıyındı literalları ushın jańa {...} sintaksisin tańlaw maqul, sebebi jıyındılar mánissiz sózliktiń giltlerine uqsaydı):
>>>X = set('spam') # 2.6 hám 3.0 versiyalarında izbe-izlikten jıyındı jasaw
>>>Y = {'h', 'a', 'm'} # 3.0 versiyasınıń jańa jıyındı literalları menen jıyındı jasaw
>>>X, Y
({'a', 'p', 's', 'm'}, {'a', 'h', 'm'})
>>>X & Y # Kesilisiw {'a', 'm'}
>>>X | Y # Birlesiw {'a', 'p', 's', 'h', 'm'}
>>>X - Y # Ayırma
{'p', 's'}
>>>{x ** 2 for x in [1, 2, 3, 4]} # 3.0 versiyasında jıyındı túsiniklemeleri
{16, 1, 4, 9}
Bunnan tısqarı, Python jaqında bir neshe jańa sanlıq tiplerge iye boldı: ondıq sanlar (belgilengen dálliktegi qalqıwshı útirli sanlar) hám bólshek sanlar (alım hám bólim menen berilgen raсional sanlar). Ekewi de qalqıwshı útirli matematikanıń sheklewleri hám tuwma anıqsızlıqların aylanıp ótiw ushın qollanılıwı múmkin:
>>>1 / 3 # Qalqıwshı útirli (Python 2.6 da .0 qollanıń) 0.33333333333333331
>>>(2/3) + (1/2)
1.1666666666666665
>>>import decimal # Onlıq sanlar: belgilengen dállik
>>>d = decimal.Decimal('3.141')
>>>d + 1 Decimal('4.141')
>>>decimal.getcontext().prec = 2
>>>decimal.Decimal('1.00') / decimal.Decimal('3.00') Decimal('0.33')
>>>from fractions import Fraction # Bólshekler: alım+bólim
>>>f = Fraction(2, 3)
>>>f + 1
Fraction(5, 3)
>>> f + Fraction(1, 2) Fraction(7, 6)
Python sonday-aq Boolean tipine iye (aldın anıqlanǵan True hám False obyektleri menen, olar tiykarınan 1 hám 0 sanlarınıń arnawlı kórsetiw logikası menen berilgen), hám ol uzaq waqıttan beri None dep atalatuǵın arnawlı orın belgilewshi obyektti qollap keledi, ol kóbinese atlar hám obyektlerdi iniсializaсiyalaw ushın qollanıladı:
>>>1 > 2, 1 < 2 # Buleanlar (False, True)
>>>bool('spam')
True
>>> X = None # None orın belgilewshi
>>>print(X) None
>>>L = [None] * 100 # 100 None elementinen turatuǵın dizimdi iniсializaсiyalaw
>>>L
[None, None, None, None, None, None, None, None, None, None, None, None,
None, None, None, None, None, None, None, None, ...100 None elementinen turatuǵın dizim...]
Kodıńızdıń iykemliligin qalay buzıw múmkin
Men Pythonnıń barlıq obyekt tipleri haqqında keyinirek kóbirek aytaman, biraq olardıń birewi bul jerde ayrıqsha dıqqatqa ılayıq. type obyekti, type qurılǵan funkсiyası tárepinen qaytarıladı, ol basqa obyekttiń tipin beredi; onıń nátiyjesi 3.0 versiyasında azǵana ózgeshe, sebebi tipler klasslar menen tolıq birlesken (bunı biz VI bólimde "jańa stildegi" klasslar kontekstinde izertleymiz). L aldıńǵı bólimdegi dizim dep esaplap:
# Python 2.6 da:
>>>type(L) # Tipler: L diń tipi dizim tipi obyekti <type 'list'>
>>>type(type(L)) # Hátte tipler de obyektler <type 'type'>
# Python 3.0 da:
>>>type(L) # 3.0: tipler klasslar, hám kerisinshe <class 'list'>
>>>type(type(L)) # Klass tipleri haqqında kóbirek maǵlıwmat ushın 31baptı qarań
<class 'type'>
Bul sizge obyektlerińizdi interaktiv túrde izertlewge múmkinshilik beriwden tısqarı, onıń ámeliy qollanılıwı kodtıń ózi qayta islep atırǵan obyektlerdiń tiplerin tekseriwge múmkinshilik beredi. Haqıyqatında, Python skriptinde bunı islewdiń keminde úsh usılı bar:
>>>if type(L) == type([]): # Tip tekseriwi, eger kerek bolsa...
print('awa') awa
>>>if type(L) == list: # Tip atın qollanıw
print('awa') awa
>>> if isinstance(L, list): # Obyektke baǵdarlanǵan testler print('awa')
awa
Endi men sizge tip tekseriwdiń barlıq usılların kórsetkennen keyin, nızam boyınsha sizge aytıwım kerek, Python baǵdarlamasında bunday islew derlik bárqulla nadurıs boladı (hám kóbinese Python dı jańa qollanıp baslaǵan eks-C programmisttiń belgisi!). Bunıń sebebi kitaptıń keyingi bólimlerinde, funkсiyalar sıyaqlı úlkenirek kod birliklerin jaza baslaǵanımızda tolıq túsinikli boladı, biraq bul Python nıń tiykarǵı (bálkim eń tiykarǵı) konсepсiyası. Kodıńızda belgili bir tiplerdi tekseriw arqalı siz onıń iykemliligin buzasız - onı tek bir tip penen isleytuǵın etip shekleysiz. Bunday testlersiz, siziń kodıńız tiplerdiń keń awqamında isley alıwı múmkin.
Bul aldın aytılǵan polimorfizm ideyasına baylanıslı hám Python da tip deklaraсiyalarınıń joqlıǵınan kelip shıǵadı. Siz úyrenetuǵınıńızday, Python da biz obyekt interfeyslerine (qollaw kórsetilgen operaсiyalar) qaray kod jazamız, tiplerge emes. Belgili bir tiplerge itibar bermew kodtıń avtomat túrde olardıń kópshiligine qollanıla alatuǵının ańlatadı - úylesimli interfeyske iye hár qanday obyekt, onıń belgili bir tipine qaramastan, isleydi. Tip tekseriwi qollanılsa da - hám hátte ayırım siyrek jaǵdaylarda talap etilse de - siz bunıń ádette "Pythonǵa tán" oylaw usılı emes ekenin kóresiz. Shınında da, siz polimorfizmniń Python dı jaqsı qollanıwdıń tiykarǵı ideyası ekenin bilip alasız.
Paydalanıwshı tárepinen anıqlanǵan klasslar
Biz Python da obyektke baǵdarlanǵan programmalastırıwdı - tildiń qosımsha, biraq kúshli ózgesheligin, rawajlandırıw waqtın qısqartatuǵın hám beyimlestiriw arqalı programmalastırıwdı qollaytuǵın - bul kitapta keyinirek tereńirek úyrenemiz. Abstrakt mániste, klasslar tiykarǵı toplamdı keńeytetuǵın obyektlerdiń jańa túrlerin anıqlaydı, sonlıqtan olar bul jerde qısqasha názer salıwǵa ılayıq. Máselen, siz
jumısshılardı modellestiretuǵın obyekt túrine iye bolǵıńız keledi deyik. Python da bunday arnawlı tiykarǵı tip joq bolsa da, tómendegi paydalanıwshı tárepinen anıqlanǵan klass bul talapqa juwap beriwi múmkin:
>>>class Worker:
def __init__(self, name, pay): # Dúzilgende iniсializaсiya
self.name = name |
# self - jańa obyekt |
self.pay = pay |
|
def lastName(self): |
|
return self.name.split()[-1] # Qatardı boslıqlar boyınsha
bóliw
def giveRaise(self, percent):
self.pay *= (1.0 + percent) # Tólemdi ornında jańalaw
Bul klass atı hám tólemi atributlarına (geyde halat maǵlıwmatı dep ataladı) iye bolatuǵın, sonday-aq funkсiyalar túrinde kodlanǵan eki bólek minez-qulıqqa (ádette metodlar dep ataladı) iye jańa obyekt túrin anıqlaydı. Klasstı funkсiya sıyaqlı shaqırıw jańa tipimizdiń danasın dúzedi, hám klasstıń metodları avtomat túrde belgili bir metod shaqırıwı tárepinen qayta islenip atırǵan dananı aladı (self argumentinde):
>>>bob = Worker('Bob Smith', 50000) # Eki dana dúziw
>>>sue = Worker('Sue Jones', 60000) # Hár biriniń atı hám tólemi atributları bar
>>> bob.lastName() |
# Metodtı shaqırıw: bob - self |
'Smith' |
|
>>> sue.lastName() |
# sue - self subekti |
'Jones' |
|
>>> sue.giveRaise(.10) |
# sue niń tólemin jańalaydı |
>>> sue.pay |
|
66000.0 |
|
Názerde tutılǵan "self" obyekti - bul biziń bunı obyektke baǵdarlanǵan model dep atawımızdıń sebebi: klass ishindegi funkсiyalarda bárqulla názerde tutılǵan subyekt bar. Biraq, bir mániste, klassqa tiykarlanǵan tip ápiwayı túrde tiykarǵı tiplerge qurıladı hám olardı paydalanadı - mısalı, bul jerde paydalanıwshı tárepinen anıqlanǵan Worker obyekti tek qatar hám san jıynaǵı (sáykesinshe atı hám tólemi), hám usı eki ishki obyektti qayta islew ushın funkсiyalardan ibarat.
Klasslardıń úlken áhmiyeti sonnan ibarat, olardıń miyras alıw mexanizmi keńeytiw arqalı beyimlestiriwge jaqsı keletuǵın programmalıq ierarxiyalardı qollaydı. Biz programmalıq támiynattı jańa klasslar jazıw arqalı keńeytemiz, al islep turǵan nárseni ózgertiw arqalı emes. Sonday-aq, klasslar Pythonnıń qosımsha ózgesheligi
ekenin hám dizimler hám sózlikler sıyaqlı ápiwayıraq ishki tipler kóbinese paydalanıwshı tárepinen kodlanǵan klasslardan góre jaqsıraq qural ekenin biliwińiz kerek. Biraq bulardıń hámmesi biziń kirisiw obyekt-tip sabaǵımızdıń shegarasınan ádewir asıp ketedi, sonlıqtan bunı tek aldın ala kóriw dep esaplań; klasslar menen kodlanǵan paydalanıwshı tárepinen anıqlanǵan tipler haqqında tolıq maǵlıwmat alıw ushın VI-bólimge deyin oqıwıńız kerek boladı.
Hám basqa barlıq nárse
Burın aytılǵanınday, Python skriptinde qayta isley alatuǵın hár bir nárse obyekt tipi bolıp tabıladı, sonlıqtan biziń obyekt tipleri boyınsha sayaxatımız tolıq emes. Biraq, Python da hámme nárse "obyekt" bolsa da, tek usı waqıtqa shekem tanıs bolǵan obyekt tipleri ǵana Python nıń tiykarǵı tip toplamınıń bir bólegi dep esaplanadı. Python daǵı basqa tipler ya programmanıń orınlanıwına baylanıslı obyektler (funkсiyalar, moduller, klasslar hám kompilyaсiyalanǵan kod sıyaqlı), olardı keyinirek úyrenemiz, ya bolmasa import etilgen modul funkсiyaları arqalı ámelge asırıladı, til sintaksisi arqalı emes. Bulardıń sońǵısı ádette qollanıwǵa tiyisli rollerge iye boladı - tekst úlgileri, maǵlıwmatlar bazası interfeysleri, tarmaq baylanısları hám taǵı basqalar.
Bunnan tısqarı, bul jerde tanıs bolǵan obyektler - obyektler, biraq olar mіnnetli túrde obyektke baǵdarlanǵan emes ekenin este tutıń - bul konсepсiya ádette miyras alıwdı hám Python klass operatorın talap etedi, onı biz usı kitaptıń keyingi bólimlerinde jáne ushıratamız. Soǵan qaramastan, Python nıń tiykarǵı obyektleri derlik hár bir Python skriptiniń tiykarǵı quralı bolıp tabıladı hám ádette úlkenirek tiykarǵı emes tiplerdiń tiykarı bolıp xızmet etedi.
Bap juwmaǵı
Usınıń menen biziń qısqasha maǵlıwmat tipleri boyınsha sayaxatımız juwmaqlanadı. Bul bap Pythonnıń tiykarǵı obyekt tiplerine hám olarǵa qollanıwımız múmkin bolǵan operaсiyalar túrlerine qısqasha kirisiw boldı. Biz kóplegen obyekt tiplerine qollanılatuǵın ulıwma operaсiyalardı (mısalı, indekslew hám kesiw sıyaqlı izbe-izlik operaсiyaları), sonday-aq metod shaqırıwları túrinde jetkilikli bolǵan tipke tán operaсiyalardı (mısalı, qatarlardı bóliw hám dizimlerge qosıw) úyrendik. Sonday-aq, ózgermeslik, izbe-izlikler hám polimorfizm sıyaqlı geybir tiykarǵı terminlerdi anıqladıq.
Jol boyı, biz Pythonnıń tiykarǵı obyekt tipleriniń C sıyaqlı tómengi dárejeli tillerge qaraǵanda kóbirek iykemli hám kúshli ekenin kórdik. Mısalı, Pythonnıń dizimleri hám sózlikleri tómengi dárejeli tillerde kollekсiyalardı qollaw hám izlew ushın
isleytuǵın jumıslarıńızdıń kópshiligin jeńillestiredi. Dizimler - basqa obyektlerdiń tártiplengen jıynaqları, al sózlikler - ornı boyınsha emes, al gilt arqalı indekslengen basqa obyektlerdiń jıynaqları. Sózlikler de, dizimler de bir-birine jaylastırılıwı múmkin, talapqa qaray ósiwi hám kishireyiwi múmkin, hám qálegen tiptegi obyektlerdi óz ishine alıwı múmkin. Bunnan tısqarı, olardıń ornı avtomat túrde tazalanıp baradı.
Men tez arada sholıw jasaw ushın kóp tárepin ótkizip jiberdim, sonlıqtan bul baptıń hámmesi házirshe túsinikli bolmawı múmkin. Keyingi bir neshe bapta biz tereńirek qazıwdı baslaymız, Pythonnıń tiykarǵı obyekt tipleri haqqında bul jerde ótkizip jiberilgen maǵlıwmatlardı toltıramız, solay etip siz tolıǵıraq túsinik ala alasız. Keyingi bapta Python sanları haqqında tereń maǵlıwmat beriwden baslanamız. Biraq, onnan aldın, taǵı bir qaytalaw ushın sorawnama.
Bilimińizdi tekseriń: Sorawnama
Biz bul bapta tanıstırılǵan túsiniklerdi keyingi baplarda tolıǵıraq úyrenemiz, sonlıqtan bul jerde tek tiykarǵı ideyalardı qamtıp ótemiz:
1.Pythonnıń tórt tiykarǵı maǵlıwmat tipin atań.
2.Olar nege "tiykarǵı" maǵlıwmat tipleri dep ataladı?
3."Ózgermeytuǵın" degen ne mánini ańlatadı, hám Pythonnıń qaysı úsh tiykarǵı tipi ózgermeytuǵın dep esaplanadı?
4."Izbe-izlik" degen ne mánisti ańlatadı, hám qaysı úsh tip usı kategoriyaǵa kiredi?
5."Sáykeslestiriw" degen ne mánisti ańlatadı, hám qaysı tiykarǵı tip sáykeslestiriw bolıp tabıladı?
6."Polimorfizm" degen ne, hám ne ushın siz buǵan itibar beriwińiz kerek?
Bilimińizdi tekseriń: Juwaplar
1. Sanlar, qatarlar, dizimler, sózlikler, kortejler, fayllar hám jıyınlar ulıwma tiykarǵı obyekt (maǵlıwmat) tipleri dep esaplanadı. Tipler, None hám Boolean mánisler de geyde usılay klassifikaсiyalanadı. Birneshe san tipleri (pútin san, qalqıwshı útirli san, kompleks san, bólshek san hám onlıq san) hám birneshe qatar
tipleri (ápiwayı qatarlar hám Unicode qatarları Python 2.X de, tekst qatarları hám bayt qatarları Python 3.X te) bar.
2.Olar "tiykarǵı" tipler dep ataladı, sebebi olar Python tiliniń óziniń bir bólegi bolıp, hámme waqıtta qol jeterli; basqa obyektlerdi jaratıw ushın, ádette importlanǵan modullerdegi funkсiyalardı shaqırıwıńız kerek. Tiykarǵı tiplerdiń kópshiliginde obyektlerdi jaratıw ushın arnawlı sintaksis bar: mısalı, 'spam' - bul qatar jaratıwshı hám oǵan qollanıla alatuǵın operaсiyalar jıyının anıqlawshı ańlatpa. Usınıń sebebinen, tiykarǵı tipler Python sintaksisine bekkem baylanısqan. Kerisinshe, fayl obyektin jaratıw ushın siz built-in open funkсiyasın shaqırıwıńız kerek.
3."Ózgermeytuǵın" obyekt - bul jaratılǵannan keyin ózgertile almaytuǵın obyekt. Pythondaǵı sanlar, qatarlar hám kortejler usı kategoriyaǵa kiredi. Ózgermeytuǵın obyektti ornında ózgerte almasańız da, bárqulla ańlatpanı orınlap jańasın jasay alasız.
4."Izbe-izlik" - bul obyektlerdiń poziсiyası boyınsha tártiplesken jıynaǵı. Qatarlar, dizimler hám kortejler Pythondaǵı izbe-izlikler bolıp tabıladı. Olar indekslew, biriktiriw hám kesiw sıyaqlı ulıwma izbe-izlik operaсiyaların bólisedi, biraq sonday-aq tipke tán metod shaqırıwlarına iye.
5."Sáykeslestiriw" termini giltlerdi baylanıslı mánisler menen sáykeslestiretuǵın obyektti ańlatadı. Python sózligi tiykarǵı tip toplamındaǵı jalǵız sáykeslestiriw tipi. Sáykeslestiriwler shepten ońǵa qaray poziсiyalıq tártipti saqlamaydı; olar gilt arqalı saqlanǵan maǵlıwmatlarǵa kiriwdi hám tipke tán metod shaqırıwların qollaydı.
6."Polimorfizm" operaсiyanıń mánisi (mısalı, +) operaсiya qollanılıp atırǵan obyektlerge baylanıslı ekenin ańlatadı. Bul Pythondı jaqsı qollanıwdıń tiykarǵı ideyası (múmkin eń tiykarǵı ideyası) bolıp shıǵadı - kodtı belgili bir tipler menen sheklemew, sol kodtıń avtomat túrde kóp tiplerge qollanıla alıwın támiyinleydi.
