Pythondı úyreniw: 5-lekciya

II BÓLIM
Tipler hám Operaсiyalar

4-BAP
Python Obyekt Tipleri menen Tanıstırıw

Bul bap Python tilin úyreniwdi baslaydı. Ápiwayı túrde aytqanda, Pythonda biz zatlar menen is isleymiz. "Isler" qosıw hám biriktiriw sıyaqlı operaсiyalar túrinde boladı, al "zatlar" – bul biz usı operaсiyalardı orınlaytuǵın obyektlerge tiyisli. Kitaptıń bul bóliminde biz usı zatlarǵa hám baǵdarlamalarımız olar menen isley alatuǵın nárselerge itibar qaratamız.

Rásmiy túrde aytqanda, Pythonda maǵlıwmatlar obyektler túrinde boladı – ya Pythonnıń ózi támiyinleytuǵın dáslepki obyektler, ya bolmasa biz Python yamasa C keńeytiw kitapxanaları sıyaqlı sırttan til quralların paydalanıp jaratqan obyektler. Biz bul anıqlamanı keyinirek bekkemlesek te, obyektler tiykarınan mánisleri hám baylanıslı operaсiyalar toplamları bar yadtıń bólekleri bolıp tabıladı.

Obyektler Python baǵdarlamalastırıwdaǵı eń tiykarǵı túsinik bolǵanlıqtan, biz bul baptı Pythonnıń dáslepki obyekt tiplerin kózden ótkeriwden baslaymız.
Biraq, kirisiw retinde, dáslep bul baptıń ulıwma Python kórinisine qalay sáykes keletuǵının anıq kórsetip óteyik. Anıǵıraq kózqarastan qaraǵanda, Python baǵdarlamaların tómendegidey etip modullerge, qáliplerge, ańlatpalarǵa hám obyektlerge bóliwge boladı:

1. Baǵdarlamalar modullerden quraladı.
2. Moduller qáliplerdi óz ishine aladı.
3. Qálipler ańlatpalardı óz ishine aladı.
4. Ańlatpalar obyektlerdi jaratadı hám qayta isleydi.

3-bapta moduller haqqındaǵı talqılaw usı ierarxiyanıń eń joqarǵı dárejesin tanıstırdı. Bul bólimniń bapları tómennen baslanıp, hám dáslepki obyektlerdi, hám olardı paydalanıw ushın jaza alatuǵın ańlatpalarıńızdı úyreniwden baslanadı.
Dáslepki Tiplerdi Ne Ushın Paydalanıw Kerek?

Eger siz C yamasa C++ sıyaqlı tómengi dárejeli tillerdi paydalanǵan bolsańız, jumısıńızdıń kóp bólegi baǵdarlamańızdıń tarawındaǵı komponentlerdi sáwlelendiriw ushın obyektlerdi – maǵlıwmat strukturaların da solay ataydı – ámelge asırıwǵa baǵıshlanǵanın bilesiz. Siz yadtaǵı strukturalardı jobalastırıwıńız, yad bólistiriwin basqarıwıńız, izlew hám kiriw proсeduraların ámelge asırıwıńız hám taǵı basqalardı islewińiz kerek. Bul jumıslar esitilgenindey zeriktirerli (hám qáte jiberiwge beyim) hám ádette baǵdarlamańızdıń haqıyqıy maqsetlerinen alańlatadı.

Ádettegi Python baǵdarlamalarında, bul awır jumıslardıń kópshiligi joq boladı. Python tildiń ajıralmas bólegi sıpatında kúshli obyekt tiplerin usınǵanlıqtan, máselelerdi sheshiwdi baslawdan aldın obyektlerdi ámelge asırıw kodın jazıwdıń zárúrligi joq. Shınında da, eger sizde dáslepki tipler támiyinlebeytuǵın arnawlı qayta islew zárúrligi bolmasa, siz barlıq waqıtta ózińizdiń variantıńızdı ámelge asırıwdıń ornına dáslepki obyektti paydalanǵan maqul. Mine usınıń sebepleri:
• Dáslepki obyektler baǵdarlamalardı jazıwdı ańsatlastıradı. Ápiwayı tapsırmalar ushın dáslepki tipler kóbinese másele tarawlarınıń dúzilisin sáwlelendiriw ushın jetkilikli boladı. Toplamlar (dizimler) hám izlew kesteleri (sózlikler) sıyaqlı kúshli qurallardı biypul alǵanıńız sebepli, olardı dárhal qollanıwıńız múmkin. Pythonnıń dáslepki obyekt tipleriniń ózi menen kóp jumıslardı orınlay alasız.

• Dáslepki obyektler keńeytiwlerdiń komponentleri bolıp tabıladı. Quramalıraq tapsırmalar ushın Python klassları yamasa C tili interfeysleri járdeminde óz obyektlerińizdi usınıwıńız kerek bolıwı múmkin. Biraq, bul kitaptıń keyingi bólimlerinde kóretuǵınıńızday, qoldan ámelge asırılǵan obyektler kóbinese dizimler hám sózlikler sıyaqlı dáslepki tipler tiykarında qurıladı. Mısalı, stek maǵlıwmat strukturasın dáslepki dizimdi basqaratuǵın yamasa qáliplestiretuǵın klass sıpatında ámelge asırıwǵa boladı.

• Dáslepki obyektler kóbinese qoldan islengen maǵlıwmat strukturalarına qaraǵanda nátiyjelirek. Pythonnıń dáslepki tipleri tezlik ushın C tilinde ámelge asırılǵan optimallastırılǵan maǵlıwmat strukturası algoritmlerin paydalanadı. Ózińiz uqsas obyekt tiplerin jaza alsańız da, dáslepki obyekt tipleri támiyinleytuǵın ónimdarlıq dárejesine jetiw qıyın boladı.

• Dáslepki obyektler tildiń standart bólegi bolıp tabıladı. Bazı táreplerden, Python dáslepki qurallarǵa tiykarlanǵan tillerden (mısalı, LISP) hám programmistlerdiń óz qural ámelge asırıwların yamasa freymvorklerin usınıwına tiykarlanǵan tillerden (mısalı, C++) alǵan. Pythonda ayrıqsha obyekt tiplerin ámelge asıra alsańız da, islep baslaw ushın bunı islewińiz shárt emes. Sonıń menen birge, Pythonnıń dáslepki tipleri standart bolǵanlıqtan, olar hámme waqıtta birdey; óz tárepten, menshik freymvorkler orınǵa qarap ózgeshelikke iye bolıwǵa beyim.
Basqasha aytqanda, dáslepki obyekt tipleri tek baǵdarlamalastırıwdı ańsatlastırıp qoymastan, olar nólden jaratılıwı múmkin bolǵanlardıń kópshiligine qaraǵanda kúshlirek hám nátiyjelirek. Jańa obyekt tiplerin ámelge asırıwıńız yamasa asırmawıńızǵa qaramastan, dáslepki obyektler hár bir Python baǵdarlamasınıń ózegin quraydı.

Pythonnıń Tiykarǵı Maǵlıwmat Tipleri
4-1-keste Pythonnıń dáslepki obyekt tiplerine hám olardıń literalların – yaǵnıy, usı obyektlerdi jaratıwshı ańlatpalardı kodlaw ushın paydalanılatuǵın sintaksiske sholıw beredi.* Eger basqa tillerdi paydalanǵan bolsańız, bul tiplerdiń ayırımları tanıs bolıp kóriniwi múmkin; mısalı, sanlar hám qatarlar sáykes túrde sanlıq hám tekst mánislerin sáwlelendiredi, al fayllar kompyuterińizde saqlanǵan fayllardı qayta islew ushın interfeys usınadı.

4-1-keste. Dáslepki obyektlerge sholıw
Obyekt tipi Literallar/jaratıw mısalları
Sanlar 1234, 3.1415, 3+4j, Decimal, Fraction
Qatarlar 'spam', "guido's", b'a\x01c'
Dizimler [1, [2, 'three'], 4]
Sózlikler {'food': 'spam', 'taste': 'yum'}
Kortejler (1, 'spam', 4, 'U')
Fayllar myfile = open('eggs', 'r')
Toplamlar set('abc'), {'a', 'b', 'c'}
Basqa tiykarǵı tipler Bulevler, tipler, None
Baǵdarlama blok tipleri Funkсiyalar, moduller, klasslar (IV, V, VI Bólimler)
Ámelge asırıwǵa baylanıslı tipler Kompilyaсiyalanǵan kod, stek treysbekleri (IV, VII Bólimler)

4-1-keste tolıq emes, sebebi Python baǵdarlamalarında qayta isleytuǵın hár bir nárse obyekttiń bir túri bolıp tabıladı. Mısalı, Pythonda tekst úlgisin sáykeslendiriwdi orınlaǵanımızda, úlgi obyektlerin jaratamız, al tarmaq skriptin orınlaǵanımızda, soket obyektlerin paydalanamız. Obyektlerdiń bul basqa túrleri ádette modullerdi importlaw hám paydalanıw arqalı jaratıladı hám ózleriniń minez-qulqına iye.

Kitaptıń keyingi bólimlerinde kóretuǵınımızday, funkсiyalar, moduller hám klasslar sıyaqlı baǵdarlama blokları da Pythonda obyektler bolıp tabıladı - olar def, class, import hám lambda sıyaqlı qálipler hám ańlatpalar menen jaratıladı hám skriptler arasında erkin ótkerile aladı, basqa obyektler ishinde saqlana aladı hám t.b. Python jáne kompilyaсiyalanǵan kod obyektleri sıyaqlı ámelge asırıwǵa baylanıslı tipler toplamın usınadı, bular ádette baǵdarlama qurawshılarǵa qaraǵanda qural jaratıwshılarǵa kóbirek qızıqlı; bular da bul tekstiń keyingi bólimlerinde talqılanadı.

Biraq, biz 4-1-kestedegi basqa obyekt tiplerin ádette tiykarǵı maǵlıwmat tipleri dep ataymız, sebebi olar Python tiline tiykarınan kirgizilgen - yaǵnıy, olardıń kópshiligin jaratıw ushın arnawlı ańlatpa sintaksisi bar. Mısalı, tómendegi kodtı orınlaǵanıńızda:

>>> 'spam'
Texnikalıq tárepten aytqanda, siz jańa qatar obyektin jaratıp qaytaratuǵın literal ańlatpanı orınlap atırsız. Bul obyektti jaratıw ushın arnawlı Python til sintaksisi bar. Sol sıyaqlı, tik qawsırmalar ishine oralǵan ańlatpa dizimdi jaratadı, tırnaqsha qawsırmalar ishindegisi sózlikti jaratadı hám t.b. Kórip turǵanımızday, Pythonda tip deklaraсiyaları bolmasa da, siz orınlaytuǵın ańlatpalardıń sintaksisi siz jaratıp paydalanatuǵın obyektlerdiń tiplerin anıqlaydı. Haqıyqatında da, 4-1-kestedegi sıyaqlı obyekt jaratıw ańlatpaları Python tilinde tiplerdiń payda bolatuǵın tiykarǵı ornı bolıp tabıladı.

Sonıń menen birge áhmiyetlisi, obyektti jaratqanıńızdan keyin, siz onıń operaсiyalar toplamın barlıq waqıtqa baylanıstırasız - qatarda tek qatar operaсiyaların, al dizimde tek dizim operaсiyaların orınlay alasız. Úyrenetuǵınıńızday, Python dinamikalıq tipke iye (deklaraсiya kodın talap etiwdiń ornına tiplerdi ózi avtomatik túrde qadaǵalaydı), biraq ol jáne kúshli tipke iye (obyektte tek onıń tipi ushın durıs bolǵan operaсiyalardı orınlay alasız).

Funkсional tárepten, 4-1-kestedegi obyekt tipleri siz ádetlengen nárselerge qaraǵanda ulıwmaraq hám kúshlirek. Mısalı, siz dizimler hám sózliklerdiń ózi tómengi dárejeli tillerde toplamlardı hám izlewdi qollap-quwatlaw ushın isleytuǵın jumısıńızdıń kópshiligin jeńilletetuǵın kúshli maǵlıwmat sáwlelendiriw quralları ekenin bilip alasız. Qısqasha aytqanda, dizimler basqa obyektlerdiń tártiplestirilgen toplamların támiyinleydi, al sózlikler obyektlerdi gilt arqalı saqlaydı; eki túride birge jaylasa aladı, zárúrlikke qaray ósip hám kemeye aladı hám hár qanday tiptegi obyektlerdi óz ishine ala aladı.
Biz 4-1-kestedegi obyekt tipleriniń hár birin keyingi baplarda tolıq úyrenemiz. Biraq, waqıyalarǵa kirisiwden aldın, Pythonnıń tiykarǵı obyektleriniń háreketine tez názer taslawdan baslayıq. Bul baptıń qalǵan bólimi keyingi baplarda tereńirek izertleytuǵın operaсiyalarǵa sholıw beredi. Bul jerde tolıq maǵlıwmattı tabıwdı kútpeń - bul baptıń maqseti tek qızıǵıwshılıǵıńızdı oyatıw hám ayırım tiykarǵı ideyalardı tanıstırıw. Degen menen, baslawdıń eń jaqsı jolı - baslaw, sonlıqtan haqıyqıy kodqa óteyik.

Sanlar

Eger siz aldın baǵdarlamalastırıw yamasa skript jazıw menen shuǵıllanǵan bolsańız, 4-1-kestedegi obyekt tipleriniń ayırımları tanıs bolıp kóriniwi múmkin. Hátte, aldın shuǵıllanbaǵan bolsańız da, sanlar ádewir túsinikli. Pythonnıń tiykarǵı obyektler toplamı ádettegi sanlardı óz ishine aladı: pútin sanlar (bólshek bólimi joq sanlar), qalqıwshı útirli sanlar (shama menen, ishinde onlıq noqatı bar sanlar) hám basqa da ayrıqsha san tipleri (qıyalıy bólekleri bar kompleks sanlar, turaqlı dálliktegi onlıq sanlar, alıw hám bólim menen raсional bólshekler hám tolıq múmkinshilikli toplamlar).

Ayırım kórkem múmkinshiliklerdi usınsa da, Pythonnıń tiykarǵı san tipleri, álbette, tiykarǵı. Pythondaǵı sanlar ádettegi matematikalıq operaсiyalardı qollap-quwatlaydı. Mısalı, qosıw belgisi (+) qosıwdı orınlaydı, juldızsha (*) kóbeytiw ushın qollanıladı, al eki juldızsha (**) dáreje ushın qollanıladı:

>>> 123 + 222 # Pútin san qosıw
345
>>> 1.5 * 4 # Qalqıwshı útirli kóbeytiw
6.0
>>> 2 ** 100 # 2 niń 100-dárejesi
1267650600228229401496703205376

Bul jerdegi sońǵı nátiyjege dıqqat awdarıń: Python 3.0 tiń pútin san tipi kerek bolǵanda bunday úlken sanlar ushın qosımsha dállikti avtomatik túrde támiyinleydi (2.6-da, ayırım uzın pútin san tipi ádettegi pútin san tipi ushın júdá úlken bolǵan sanlardı uqsas jollar menen qayta isleydi). Mısalı, siz Pythonda 2-niń 1,000,000-dárejesin pútin san sıpatında esaplay alasız, biraq nátiyjeni basıp shıǵarıwǵa háreket etpewińiz kerek - 300,000-nan aslam sanǵa iye bolǵanlıqtan, biraz kútiwińizge tuwra keledi!

>>> len(str(2 ** 1000000)) # Júdá ÚLKEN sanda neshe сifr bar?
301030

Qalqıwshı útirli sanlar menen tájiriybe islewdi baslaǵanıńızda, birinshi qaraǵanda biraz ájayıp kórinetuǵın nársege dus keliwińiz múmkin:

>>> 3.1415 * 2 # repr: kod sıpatında
6.2830000000000004
>>> print(3.1415 * 2) # str: paydalanıwshıǵa ıńǵaylı
6.283

Birinshi nátiyje qáte emes; bul kórsetiw máselesi. Hár bir obyektti eki usılda kórsetiw múmkin eken: tolıq dállikte (mısaldaǵı birinshi nátiyjedegidey) hám paydalanıwshıǵa qolaylı formada (ekinshi nátiyjedegidey). Rásmiy túrde, birinshi forma obyekttiń kod kórinisi (repr) dep ataladı, al ekinshisi paydalanıwshıǵa qolaylı kórinisi (str). Bul ayırmashılıq klasslar menen islegende áhmiyetli bolıwı múmkin; házirshe, eger bir nárse ájayıp kórinse, onı print funkсiyası menen kórsetip kóriń.

Ańlatpalardan tısqarı, Python menen birge keletuǵın bir neshe paydalı sanlıq moduller bar - moduller bul qosımsha qurallar paketleri bolıp, olardı paydalanıw ushın import etemiz:

>>> import math
>>> math.pi
3.1415926535897931
>>> math.sqrt(85)
9.2195444572928871

Math moduli qosımsha sanlıq qurallardı funkсiyalar túrinde óz ishine aladı, al random moduli tosınnan san generaсiyasın hám tosınnan tańlawlardı ámelge asıradı (mısalı, Python diziminen, bul haqqında usı bapta keyinirek aytıladı):

>>> import random
>>> random.random()
0.59268735266273953
>>> random.choice([1, 2, 3, 4])
1

Python sonday-aq basqa da siyrek ushırasatuǵın sanlıq obyektlerdi óz ishine aladı - mısalı, kompleks sanlar, turaqlı dálliktegi sanlar hám raсional sanlar, sonday-aq jıyındılar hám Boolean mánisleri - al úshinshi tárep ashıq dereklik keńeytiwler taǵı da kóbirek imkaniyatlardı usınadı (mısalı, matriсalar hám vektorlar). Bul tipler haqqında kitaptıń keyingi bólimlerinde aytıp ótemiz.

Házirge shekem biz Pythondı ápiwayı kalkulyator sıyaqlı qollanıp atırmız; onıń ishki tiplerin jaqsıraq túsiniw ushın, endi qatarlardı (strings) úyreniwge óteyik.

Qatarlar

Qatarlar tekstlik maǵlıwmatlardı, sonday-aq baytlardıń qálegen jıyındıların saqlaw ushın qollanıladı. Olar Pythondaǵı izbe-izlik (sequence) dep atalatuǵın nárseniń birinshi mısalı bolıp tabıladı - yaǵnıy, basqa obyektlerdiń poziсiyalıq tártipte jaylasqan toplamı. Izbe-izlikler óz ishindegi elementlerdiń shepten ońǵa qaray tártibin saqlaydı: olardıń elementleri salıstırmalı ornı boyınsha saqlanadı hám alınadı. Qatań aytqanda, qatarlar bir háripten turatuǵın qatarlardıń izbe-izligi bolıp tabıladı; basqa izbe-izlik túrlerine dizimler hám kortejler kiredi, olar haqqında keyinirek aytıladı.

Izbe-izlik ámelleri

Izbe-izlik sıpatında, qatarlar elementler arasında poziсiyalıq tártip bar dep boljaytuǵın ámellerdi qollaydı. Mısalı, eger bizde tórt háripten turatuǵın qatar bolsa, onıń uzınlıǵın ishki len funkсiyası menen tekseriwimiz hám onıń komponentlerin indekslew ańlatpaları arqalı alıwımız múmkin:

>>> S = 'Spam'
>>> len(S) # Uzınlıǵı
4
>>> S[0] # S daǵı birinshi element, nólden baslanatuǵın poziсiya boyınsha indekslew
'S'
>>> S[1] # Shepten ekinshi element
'p'

Pythonda indeksler aldıńǵı tárepten esaplanatuǵın jıljıwlar retinde kodlanadı, sonlıqtan 0-den baslanadı: birinshi element 0-indekste, ekinshisi 1-indekste hám t.b.

Bul jerde qatardı S dep atalǵan ózgeriwshige qalay mánis bergenimizge itibar beriń. Bunıń qalay isleytuǵını haqqında keyinirek tolıǵıraq aytamız (ásirese 6-bapta), biraq Pythonda ózgeriwshilerdi aldın ala járiyalawdıń keregi joq. Ózgeriwshi oǵan mánis beriw arqalı jaratıladı, oǵan hár qanday tiptegi obyekt mánis etip beriliwi múmkin hám ol ańlatpada payda bolǵanda óziniń mánisi menen almastırıladı. Sonday-aq, onıń mánisin paydalanıwdan aldın oǵan mánis berilgen bolıwı kerek. Bul bap maqsetleri ushın, obyektti keyin paydalanıw ushın saqlap qoyıw ushın onı ózgeriwshige mánis etip beriwimiz kerek ekenin biliw jetkilikli.

Pythonda biz artqa qaray da indeksley alamız, yaǵnıy aqırınan - oń indeksler shepten, al teris indeksler ońnan esaplaydı:

>>> S[-1] # S-tiń aqırǵı elementi
'm'
>>> S[-2] # S-tiń aqırınan ekinshi elementi
'a'

Formal túrde, teris indeks ápiwayı túrde qatardıń ólshemine qosıladı, sonlıqtan tómendegi eki operaсiya birdey (biraq birinshi usılı kodlawǵa ańsat hám qáte jiberiw itimallıǵı azıraq):

>>> S[-1] # S-tiń aqırǵı elementi
'm'
>>> S[len(S)-1] # Teris indekslew, qıyın usıl
'm'

Itibar beriń, kvadrat qawsırmalar ishinde tek qatań belgilengen san emes, al qálegen ańlatpanı paydalana alamız - Python mánis kútken hár qanday jerde biz literal, ózgeriwshi yamasa qálegen ańlatpanı qollana alamız. Python sintaksisi usı jaǵınan tolıq ulıwmalıq.

Ápiwayı poziсiyalıq indekslewden tısqarı, izbe-izlikler sonday-aq kesiw dep atalatuǵın indekslewdiń ulıwmalıq túrin de qollaydı, bul bir hárekette pútkil bólimdi alıw usılı. Mısalı:

>>> S # 4 háripten turatuǵın qatar
'Spam'
>>> S[1:3] # S-tiń 1-den 2-ge shekemgi kesindi (3 emes)
'pa'

Kesindiler haqqında oylawdıń eń ańsat usılı - olar bir hárekette qatardan pútkil baǵananı alıw usılı. Olardıń ulıwmalıq forması, X[I:J], "maǵan X-tiń I indeksinen baslap J indeksine shekem (J kirgizilmeydi) hámmesin ber" degendi ańlatadı. Nátiyje jańa obyektte qaytarıladı. Mısalı, joqarıdaǵı ekinshi operaсiya bizge S qatarınıń 1-den 2-ge shekemgi (yaǵnıy 3 - 1) barlıq háriplerin jańa qatar sıpatında beredi. Nátiyjede ortadaǵı eki hárip kesip alınadı yamasa "ajıratıp alınadı".

Kesindide sol shegara ádette nólge, al oń shegara kesiletuǵın izbe-izliktiń uzınlıǵına teń boladı. Bul jiyi qollanılatuǵın bir neshe variantlarǵa alıp keledi:

>>> S[1:] # Birinshi elementten keyingi hámmesi (1:len(S))
'pam'
>>> S # S ózi ózgermegen
'Spam'
>>> S[0:3] # Sońǵısınan basqa hámmesi
'Spa'
>>> S[:3] # S[0:3] menen birdey
'Spa'
>>> S[:-1] # Jáne de sońǵısınan basqa hámmesi, biraq ápiwayıraq (0:-1)
'Spa'
>>> S[:] # S-tiń tolıq joqarǵı dárejeli kóshirmesi (0:len(S))
'Spam'

Itibar beriń, teris indeksler de kesindiler ushın shegaralardı beriwde qollanıla aladı, hám sońǵı operaсiya pútkil qatardı nátiyjeli kóshiredi. Keyinirek úyrenetuǵınıńızday, qatardı kóshiriwdiń hesh qanday zárúrligi joq, biraq bul forma dizimler sıyaqlı izbe-izlikler ushın paydalı bolıwı múmkin.

Aqırında, izbe-izlikler sıpatında, qatarlar sonday-aq qosıw belgisi arqalı biriktiriwdi (eki qatardı jańa qatarǵa biriktiriw) hám qaytalawdı (basqa qatardı qaytalaw arqalı jańa qatar jasaw) qollaydı:

>>> S
'Spam'
>>> S + 'xyz' # Biriktiriw
'Spamxyz'
>>> S # S ózgermegen
'Spam'
>>> S * 8 # Qaytalaw
'SpamSpamSpamSpamSpamSpamSpamSpam'

Itibar beriń, qosıw belgisi (+) hár qıylı obyektler ushın hár túrli mánilerge iye: sanlar ushın qosıw, al qatarlar ushın biriktiriw. Bul Python tiliniń ulıwma qásiyeti bolıp, onı kitaptıń keyingi bólimlerinde polimorfizm dep ataymız — qısqasha aytqanda, operaсiyanıń mánisi oǵan qatnasıp atırǵan obyektlerge baylanıslı boladı. Dinamikalıq tiplestiriwdi úyrengenimizde kóretuǵınımızday, bul polimorfizm qásiyeti Python kodınıń qısqalıǵı hám ikemliliginiń kóp bólegin qamtıydı.

Tipler sheklenbegenlikten, Python-da jazılǵan operaсiya ádette úylesimli interfeysti qollaytuǵın (mısalı, usı jerdegi + operaсiyası sıyaqlı) kóp túrli obyekt tipleri menen avtomat túrde isley aladı. Bul Python-daǵı úlken ideya bolıp shıǵadı; bul haqqında saparımızdıń dawamında kóbirek bilip alasız.

Ózgermeslik

Aldıńǵı mısallarda, biz onıń ústinde orınlaǵan operaсiyalarımızdıń hesh qaysısı menen dáslepki qatardı ózgertpegenimizge itibar beriń. Hár bir qatar operaсiyası nátiyje retinde jańa qatar jasawǵa mólsherlengen, sebebi Python-da qatarlar ózgermeytuǵın — olar jasalǵannan keyin ornında ózgertilmeydi. Mısalı, siz qatardı onıń bir poziсiyasına mánis beriw arqalı ózgerte almaysız, biraq bárqulla jańasın jaratıp, onı sol atqa beriwińiz múmkin. Python eski obyektlerdi jumısıńız dawamında tazalap baratuǵını sebepli (bunı keyinirek kóresiz), bul oylaǵanıńızday nátiyjesiz emes:

>>> S
'Spam'
>>> S[0] = 'z' # Ózgermeytuǵın obyektlerdi ózgertiw múmkin emes
...qáte tekst jiberildi...
TypeError: 'str' obyekti element tayınlawdı qollap-quwatlamaydı
>>> S = 'z' + S[1:] # Biraq jańa obyektler jasaw ushın qatarlardı orınlay alamız
>>> S
'zpam'

Python-daǵı hár bir obyekt ya ózgermeytuǵın (ózgertilmeytuǵın) ya ózgertiletuǵın dep jikleledi. Tiykarǵı tipler kóz-qarasınan, sanlar, qatarlar hám kortejler ózgermeytuǵın; dizimler hám sózlikler bolsa ózgertiletuǵın (olar erkin túrde ornında ózgertiliwi múmkin). Basqa nárseler menen birge, ózgermeslik obyekttiń pútkil baǵdarlamańız dawamında turaqlı qalıwın kepillew ushın qollanılıwı múmkin.

Tipke tán usıllar

Usı waqıtqa shekem úyrengen hár bir qatar operaсiyası haqıyqatında izbe-izlik operaсiyası bolıp tabıladı — yaǵnıy, bul operaсiyalar Python-daǵı basqa izbe-izliklerde de, sonıń ishinde dizimler hám kortejlerde de isleydi. Ulıwma izbe-izlik operaсiyalarınan tısqarı, qatarlardıń ózine tán operaсiyaları da bar, olar usıllar túrinde jetkilikli — obyektke baylanǵan funkсiyalar, olar shaqırıw ańlatpası menen iske qosıladı.

Mısalı, qatardıń find usılı tiykarǵı ishki qatardı izlew operaсiyası bolıp tabıladı (ol berilgen ishki qatardıń ornın qaytaradı, eger ol joq bolsa -1 di qaytaradı), al qatardıń replace usılı global izlew hám almastırıwlardı orınlaydı:

>>> S.find('pa') # Ishki qatardıń ornın tabıw
1
>>> S
'Spam'
>>> S.replace('pa', 'XYZ') # Ishki qatardıń hár bir payda bolıwın basqası menen almastırıw
'SXYZm'
>>> S
'Spam'

Jáne de, usı qatar usıllarınıń atlarına qaramastan, biz bul jerde dáslepki qatarlardı ózgertpeymiz, al nátiyje sıpatında jańa qatarlar jasaymız — sebebi qatarlar ózgermeytuǵın, biz bunı usılay islewimiz kerek. Qatar usılları Python-da tekst qayta islew qurallarınıń birinshi qatarı bolıp tabıladı. Basqa usıllar qatardı bólgish boyınsha ishki qatarlarǵa bóledi (ápiwayı tallaw forması ushın paydalı), úlken hám kishi háriplerge aylandırıwdı orınlaydı, qatardıń mazmunın tekseredi (sanlar, háripler hám t.b.) hám qatardıń shetlerindegi bos orınlardı alıp taslaydı:

>>> line = 'aaa,bbb,ccccc,dd'
>>> line.split(',') # Bólgish boyınsha ishki qatarlar dizimine bóliw
['aaa', 'bbb', 'ccccc', 'dd']
>>> S = 'spam'
>>> S.upper() # Úlken hám kishi háriplerge aylandırıw
'SPAM'
>>> S.isalpha() # Mazmun testleri: isalpha, isdigit hám t.b.
True
>>> line = 'aaa,bbb,ccccc,dd\n'
>>> line = line.rstrip() # Oń táreptegi bos orın belgilerin alıp taslaw
>>> line
'aaa,bbb,ccccc,dd'

Qatarlar jáne de formatlaw dep atalatuǵın quramalı almastırıw operaсiyasın qollaydı, ol hám ańlatpa (dáslepki), hám qatar usılı shaqırıwı (2.6 hám 3.0 versiyalarında jańa) túrinde jetkilikli:

>>> '%s, eggs, and %s' % ('spam', 'SPAM!') # Formatlaw ańlatpası (barlıǵı)
'spam, eggs, and SPAM!'
>>> '{0}, eggs, and {1}'.format('spam', 'SPAM!') # Formatlaw usılı (2.6, 3.0)
'spam, eggs, and SPAM!'

Bir eskertiw: dizbek operaсiyaları ulıwmalıq bolsa da, usıllar onday emes — geypara tipler ayırım usıl atların bólisse de, qatar usılı operaсiyaları tek qatarlarǵa ǵana isleydi hám basqa hesh nársege emes. Ulıwma qaǵıyda boyınsha, Python qurallar toplamı qatlamlı: bir neshe tiplerge tiyisli ulıwmalıq operaсiyalar qurılǵan funkсiyalar yamasa ańlatpalar túrinde kórinedi (mısalı, len(X), X[0]), al tipke tán operaсiyalar usıl shaqırıwları bolıp tabıladı (mısalı, aString.upper()).

Usı barlıq kategoriyalar arasında ózińizge kerekli qurallardı tabıw Python-dı kóbirek qollanǵan sayın tábiyiy bolıp qaladı, biraq keyingi bólim házir qollana alatuǵın bir neshe másláhátler beredi.

Járdem alıw

Aldıńǵı bólimde tanıstırılǵan usıllar qatar obyektleri ushın jetkilikli bolǵan nárselerdiń wákillik etiwshi, biraq kishi úlgisi. Ulıwma alǵanda, bul kitap obyekt usılların tolıq qarap shıqpaydı. Kóbirek maǵlıwmat ushın, bárqulla qurılǵan dir funkсiyasın shaqıra alasız, ol berilgen obyekt ushın jetkilikli bolǵan barlıq atributlardıń dizimin qaytaradı. Usıllar funkсiya atributları bolǵanlıqtan, olar bul dizimde kórinedi. S hálide qatar dep esaplap, mine Python 3.0 daǵı onıń atributları (Python 2.6 da azǵana ózgeshelikler bar):

>>> dir(S)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
'__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '_formatter_field_name_split', '_formatter_parser',
'capitalize', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'index', 'isalnum','isalpha', 'isdecimal', 'isdigit', 'isidentifier',
'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join',
'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind',
'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines',
'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

Bul dizimdegi astınǵı sızıq belgileri bar atlar haqqında kitaptıń keyingi bólimlerine shekem, klasslardaǵı operatorlardı qayta anıqlawdı úyrengenimizshe qayǵırmawıńız múmkin — olar qatar obyektiniń implementaсiyasın kórsetedi hám qálegen ózgertiwlerdi qollaw ushın jetkilikli. Ulıwma alǵanda, eki astınǵı sızıq belgisi menen baslanıp hám tamamlanatuǵın atlar — bul Python implementaсiya tárepten paydalanatuǵın atlaw úlgisi. Bul dizimdegi astınǵı sızıq belgileri joq atlar qatar obyektlerindegi shaqırıla alatuǵın usıllar bolıp tabıladı.

dir funkсiyası tek usıllardıń atların beredi. Olardıń ne isleytuǵının biliw ushın, olardı help funkсiyasına jiberiwińiz múmkin:

>>> help(S.replace)
Replace qurılǵan funkсiyası haqqında járdem:
replace(...)
S.replace (old, new[, count]) -> str
S qatarınıń barlıq old qatarshası new menen almastırılǵan kóshirmesin qaytaradı.
Eger qosımsha count argumenti berilse, tek dáslepki count mártebe almastırıladı.

help - bul Python menen birge keletuǵın PyDoc dep atalatuǵın kod sistemasınıń interfeysleriniń biri - obyektlerden hújjetlestiriwdi shıǵarıp alıw quralı. Kitaptıń keyingi bólimlerinde PyDoc óz esabatların HTML formatında da bere alatuǵının kóresiz.

Siz pútkil qatar haqqında da járdem soray alasız (mısalı, help(S)), biraq siz kórgińiz kelgennen de kóbirek járdem alıwıńız múmkin - yaǵnıy, hár bir qatar usılı haqqında maǵlıwmat. Ádette, belgili bir usıl haqqında soraw jaqsıraq.

Kóbirek maǵlıwmat alıw ushın, Pythonnıń standart kitapxanasınıń oqıw qollanbasın yamasa kommerсiyalıq baspadan shıqqan oqıw qollanba kitaplardı da paydalanıwıńızǵa boladı, biraq dir hám help - Pythondaǵı hújjetlestiriwdiń birinshi qatarı bolıp esaplanadı.

Qatarlardı kodlawdıń basqa usılları
Usı waqıtqa shekem biz qatar obyektiniń izbe-izlik operaсiyaların hám tipke tán usılların kórip shıqtıq. Python bizge qatarlardı kodlawdıń hár qıylı usılların da usınadı, olardı keyinirek tereń úyrenemiz. Mısalı, ayrıqsha belgiler artqı sızıq (backslash) qashıw izbe-izligi sıpatında kórsetiliwi múmkin:

>>> S = 'A\nB\tC' # \n - qatar sońı, \t - tabulyaсiya
>>> len(S) # Hár biri tek bir belgi ushın turadı
5
>>> ord('\n') # \n - ASCII'de 10 sanlıq mánisi bar bayt
10
>>> S = 'A\0B\0C' # \0, nól baytı, qatardı toqtatpaydı
>>> len(S)
5

Python qatarlardı bir yamasa eki tırnaqsha belgileri ishine alıwǵa ruqsat beredi (olar birdey mánini ańlatadı). Ol jáne de úsh tırnaqsha (bir yamasa eki) ishine alınǵan kóp qatarlı qatar literallarına da ruqsat beredi - bul forma qollanılǵanda, barlıq qatarlar birlestiriledi hám qatar úzilisleri payda bolǵan jerlerge qatar sońı belgileri qosıladı. Bul kishi sintaksislik qolaylılıq, biraq Python skriptine HTML hám XML kodın jaylastırıw ushın paydalı:

>>> msg = """ aaaaaaaaaaaaa
bbb'''bbbbbbbbbb""bbbbbbb'bbbb
cccccccccccccc"""
>>> msg
'\naaaaaaaaaaaaa\nbbb\'\'\'bbbbbbbbbb""bbbbbbb\'bbbb\ncccccccccccccc'

Python jáne de artqı sızıq qashıw mexanizmin óshiretuǵın shiyki qatar literalın qollaydı (bunday qatar literalları r háripi menen baslanadı), sonday-aq xalıqaralıq standartlardı qollaytuǵın Unicode qatar qollawın da qamtıydı. 3.0 versiyasında, tiykarǵı str qatar tipi Unicode-tı da qollaydı (bul mánili, sebebi ASCII tekst - bul ápiwayı Unicode túri), al bytes tipi shiyki bayt qatarların kórsetedi; 2.6 versiyasında Unicode ayrıqsha tip bolıp, str bolsa hám 8-bitli qatarlardı, hám binar maǵlıwmatlardı qollaydı. 3.0 versiyasında fayllar da ózgertilgen bolıp, tekst ushın str qaytaradı hám qabıl etedi, al binar maǵlıwmatlar ushın bytes qollanıladı. Bul ayrıqsha qatar formalarınıń hámmesi menen keyingi baplarda tanısamız.

Úlgi boyınsha izlew
Alǵa jıljıwdan aldın atap ótiwge turarlıq bir nárse - qatar obyektiniń usıllarınıń hesh biri úlgi tiykarındaǵı tekst qayta islewdi qollamaydı. Tekstte úlgi boyınsha izlew - bul kitaptıń kóleminen tıs qalatuǵın quramalı qural, biraq basqa skriptlew tilleri boyınsha tájiriybesi bar oqıwshılar Pythonda úlgi boyınsha izlew ushın re dep atalatuǵın moduldi importlaw kerek ekenin biliwi qızıqlı bolıwı múmkin. Bul modulde izlew, bóliw hám almastırıw ushın uqsas shaqırıwlar bar, biraq biz qatar astın kórsetiw ushın úlgilerdi paydalana alatuǵınımız sebepli, ádewir ulıwmalasqan bolıwımız múmkin:

>>> import re
>>> match = re.match('Hello[ \t]*(.*)world', 'Hello Python world')
>>> match.group(1)
'Python '

Bul mısal "Hello" sózi menen baslanatuǵın, keyin nól yamasa onnan kóp tabulyaсiya belgisi yamasa bos orın, sońınan sáykes kelgen top sıpatında saqlanatuǵın qálegen belgiler hám "world" sózi menen juwmaqlanatuǵın qatar astın izleydi. Eger usınday qatar astı tabılsa, qawsırmaǵa alınǵan úlgi bólimleri menen sáykes kelgen qatar astı bólimleri toplar sıpatında jetkilikli boladı. Mısalı, tómendegi úlgi qıya sızıq penen ajıratılǵan úsh toptı ajıratıp aladı:

>>> match = re.match('/(.*)/(.*)/(.*)', '/usr/home/lumberjack')
>>> match.groups()
('usr', 'home', 'lumberjack')

Úlgi boyınsha izlew óz aldına ádewir quramalı tekst qayta islew quralı bolıp tabıladı, biraq Pythonda jáne de quramalıraq til qayta islew, sonıń ishinde tábiyiy tildi qayta islew ushın da qollaw bar. Degen menen, bul sabaq ushın qatarlar haqqında jetkilikli ayttım, sonlıqtan keyingi tipke óteyik.

Dizimler
Pythondaǵı dizim obyekti - bul til tárepinen usınılǵan eń ulıwma izbe-izlik. Dizimler - bul qálegen tiptegi obyektlerdiń poziсiyası boyınsha tártiplestirilgen jıynaǵı bolıp, olardıń turaqlı ólshemi joq. Olar jáne de ózgermeli - qatarlardan parqlı, dizimlerdi orınlarǵa mánis beriw arqalı, sonday-aq hár qıylı dizim usılların shaqırıw arqalı ornında ózgertiwge boladı.

Izbe-izlik ámelleri
Dizimler izbe-izlik bolǵanlıqtan, olar qatarlar ushın talqılaǵan barlıq izbe-izlik ámellerin qollaydı; jalǵız parqı - nátiyjeler ádette qatarlar emes, al dizimler boladı. Mısalı, úsh elementli dizim berilgen bolsa:

>>> L = [123, 'spam', 1.23] # Úsh hár qıylı tiptegi obyektlerden turatuǵın dizim
>>> len(L) # Dizimdegi elementler sanı
3

biz qatarlar sıyaqlı indekslew, kesiw hám taǵı basqalardı isley alamız:

>>> L[0] # Poziсiya boyınsha indekslew
123
>>> L[:-1] # Dizimdi kesiw jańa dizimdi qaytaradı
[123, 'spam']
>>> L + [4, 5, 6] # Biriktiriw de jańa dizim jasaydı
[123, 'spam', 1.23, 4, 5, 6]
>>> L # Dáslepki dizimdi ózgertpeymiz
[123, 'spam', 1.23]

Tipke tán ámeller
Python dizimleri basqa tillerdegi massivlerge uqsas, biraq olar ádette kúshlirek boladı. Birinshi gezekte, olardıń qatań tip sheklewi joq - biz jańa ǵana kórgen dizim, mısalı, pútkilley hár qıylı tiptegi úsh obyektti óz ishine aladı (pútin san, qatar hám qalqıwshı útirli san). Bunnan tısqarı, dizimlerdiń turaqlı ólshemi joq. Yaǵnıy, olar dizimge tán ámellerge juwap retinde talapqa qaray ósiwi hám kishireyiwi múmkin:

>>> L.append('NI') # Ósiw: dizim aqırına obyekt qosıw
>>> L
[123, 'spam', 1.23, 'NI']
>>> L.pop(2) # Kishireyiw: ortadaǵı elementti óshiriw
1.23
>>> L # "del L[2]" de dizimnen óshiredi
[123, 'spam', 'NI']

Bul jerde, dizimniń append metodı dizim ólshemin keńeytedi hám aqırına element qosadı; pop metodı (yamasa oǵan uqsas del operatorı) berilgen indekstegi elementti óshiredi, dizimniń kishireyiwine alıp keledi. Basqa dizim metodları qálegen poziсiyaǵa element qosadı (insert), berilgen mánisli elementti óshiredi (remove) hám taǵı basqa. Dizimler ózgermeli bolǵanlıqtan, kópshilik dizim metodları jańa obyekt jasawdıń ornına dizim obyektin ornında ózgertedi:

>>> M = ['bb', 'aa', 'cc']
>>> M.sort()
>>> M
['aa', 'bb', 'cc']
>>> M.reverse()
>>> M
['cc', 'bb', 'aa']

Mısalı, bul jerdegi dizimniń sort metodı dizimdi ádepki boyınsha ósiw tártibinde jaylastıradı, al reverse onı teris tártipke aylandıradı - eki jaǵdayda da metodlar dizimdi tikkeley ózgertedi.

Shegara tekseriwi
Dizimlerdiń turaqlı ólshemi bolmasa da, Python bizge joq elementlerge múrájat etiwge ruqsat bermeydi. Dizim shegarasınan tısqarı indekslew bárqulla qáte boladı, sonday-aq shegaradan tısqarı mánis beriw de qáte:

>>> L
[123, 'spam', 'NI']
>>> L[99]
...qáte tekst ótkizip jiberildi...
IndexError: list index out of range
>>> L[99] = 1
...qáte tekst ótkizip jiberildi...
IndexError: list assignment index out of range

Bul bilip turıp islengen, sebebi dizim shegarasınan tısqarı mánis beriwge urınıw ádette qáte bolıp esaplanadı (hám C tilinde ayrıqsha qáwipli, ol Python sıyaqlı kóp qáte tekseriwin orınlamaydı). Juwap retinde dizimdi únsiz ósiriwdiń ornına, Python qáte haqqında xabar beredi. Dizimdi ósiriw ushın, biz onıń ornına append sıyaqlı dizim metodların shaqıramız.

Uyalaw (Nesting)
Pythonnıń tiykarǵı maǵlıwmat tipleriniń jaqsı ózgesheligi - olar qálegen uyalawdı qollaydı - biz olardı qálegen kombinaсiyada hám qálegen tereńlikte uyalay alamız (mısalı, bizde sózlik bar dizim bolıwı múmkin, onıń ishinde basqa dizim bar hám t.b.). Bul ózgesheliktiń bir tikkeley qollanılıwı - Pythonda matriсalardı yamasa "kóp ólshemli massivlerdi" kórsetiw. Uyalanǵan dizimleri bar dizim tiykarǵı qollanıwlar ushın jumıs isleydi:

>>> M = [[1, 2, 3], # 3 × 3 matriсa, uyalanǵan dizimler sıpatında
[4, 5, 6], # Kod qawsırmaǵa alınǵan bolsa, qatarlar boylap sozılıwı múmkin
[7, 8, 9]]
>>> M
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Bul jerde biz úsh basqa dizimnen turatuǵın dizimdi kodladıq. Nátiyjede 3 × 3 sanlar matriсasın kórsetedi. Bunday strukturaǵa hár qıylı jollar menen kiriwge boladı:

>>> M[1] # 2-qatardı alıw
[4, 5, 6]
>>> M[1][2] # 2-qatardı alıw, soń qatar ishindegi 3-elementti alıw
6

Bul jerdegi birinshi operaсiya pútkil ekinshi qatardı aladı, al ekinshisi sol qatar ishindegi úshinshi elementti aladı. Indeks operaсiyaların birge qosıw bizdi uyalanǵan obyekt strukturamızǵa tereńirek hám tereńirek alıp baradı.