Pythondı úyreniw: 6-lekciya
Túsinikler (Comprehensions)
Izbe-izlik operaсiyaları hám dizim metodlarınan tısqarı, Python dizimdi túsiniw ańlatpası (list comprehension expression) dep atalatuǵın qosımsha rawajlanǵan operaсiyanı qamtıydı, bul bolsa matriсamız sıyaqlı strukturalardı qayta islewdiń kúshli usılı bolıp shıǵadı. Mısalı, bizge úlgi matriсamızdıń ekinshi baǵanasın alıw kerek bolsın. Matriсa qatarlar boyınsha saqlanǵanlıqtan, ápiwayı indekslew arqalı qatarlardı alıw ańsat, biraq dizimdi túsiniw arqalı baǵananı alıw da sonday ańsat:
>>> col2 = [row[1] for row in M] # 2-baǵanadaǵı elementlerdi jıynaw
>>> col2
[2, 5, 8]
>>> M # Matriсa ózgerissiz qaladı
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Dizimdi túsiniw ańlatpaları kóplik belgilewinen kelip shıqqan; olar izbe-izliktegi hár bir elementke ańlatpanı bir waqıtta, shepten ońǵa qaray orınlaw arqalı jańa dizim qurıwdıń usılı. Dizimdi túsiniw ańlatpaları kvadrat qawsırmalarda jazıladı (bul olardıń dizim jasaytuǵının bildiredi) hám ańlatpa hám aynımalı atın bólisetuǵın qaytalaw konstrukсiyasınan turadı (bul jerde row). Joqarıdaǵı dizimdi túsiniw ańlatpası tiykarınan mınanı ańlatadı: "M matriсasındaǵı hár bir qatar ushın row[1] di jańa dizimde ber". Nátiyje matriсanıń 2-baǵanasın qamtıytuǵın jańa dizim boladı.
Dizimdi túsiniw ańlatpaları ámeliyatta quramalıraq bolıwı múmkin:
>>> [row[1] + 1 for row in M] # 2-baǵanadaǵı hár bir elementke 1 qosıw
[3, 6, 9]
>>> [row[1] for row in M if row[1] % 2 == 0] # Taq sanlardı súzip taslaw
[2, 8]
Mısalı, birinshi operaсiya hár bir elementti jıynaǵanda oǵan 1 qosadı, al ekinshisi if shártin qollanıp, % modul ańlatpası (bóliwden qalǵan qaldıq) arqalı nátiyjeden taq sanlardı súzip taslaydı. Dizimdi túsiniw ańlatpaları jańa nátiyjeler dizimin jasaydı, biraq olar hár qanday iteraсiyalanatuǵın obyekt boyınsha iteraсiya jasaw ushın qollanılıwı múmkin. Mısalı, bul jerde biz dizimdi túsiniw ańlatpaların aldın ala belgilengen koordinatalar dizimi hám qatar boyınsha júriw ushın qollanamız:
>>> diag = [M[i][i] for i in [0, 1, 2]] # Matriсadan diagonaldı jıynaw
>>> diag
[1, 5, 9]
>>> doubles = [c * 2 for c in 'spam'] # Qatardaǵı háriplerdi eki ret qaytalaw
>>> doubles
['ss', 'pp', 'aa', 'mm']
Dizimdi túsiniw ańlatpaları hám olarǵa uqsas map hám filter sıyaqlı qurılǵan funkсiyalar haqqında bul jerde kóbirek aytıw ushın biraz quramalı. Bul qısqasha kirisiwdiń tiykarǵı maqseti - Pythonnıń óz qurallarında ápiwayı hám quramalı qurallardı qamtıytuǵının kórsetiw. Dizimdi túsiniw ańlatpaları qosımsha múmkinshilik, biraq olar ámeliyatta paydalı bolıwǵa beyim hám kóbinese ádewir qayta islew tezligin beredi. Olar sonday-aq Pythondaǵı hár qanday izbe-izlik tipinde, sonday-aq izbe-izlik bolmaǵan bazı bir tiplerde de isleydi. Bul kitapta keyinirek olar haqqında kóbirek esitesiz.
Aldın ala kóriw retinde, jaqında shıqqan Python versiyalarında qawsırmalar ishindegi túsiniw sintaksisin talap boyınsha nátiyjeler beriwshi generatorlardı jasaw ushın da qollanıwǵa boladı (mısalı, sum funkсiyası izbe-izliktegi elementlerdi qosadı):
>>> G = (sum(row) for row in M) # Qatar jıyındılarınıń generatorın jasaw
>>> next(G)
6
>>> next(G) # Iteraсiya protokolın iske qosıw
15
Map funkсiyası da usıǵan uqsas jumıstı isley aladı, elementlerdi funkсiya arqalı ótkizip nátiyjeler beredi. Onı list funkсiyasına orap, Python 3.0-de barlıq mánislerin qaytarıwǵa májbúrleymiz:
>>> list(map(sum, M)) # M-degi elementler boyınsha sum funkсiyasın qollanıw
[6, 15, 24]
Python 3.0-de túsiniw sintaksisin jıyındı hám sózlikler jasaw ushın da qollanıwǵa boladı:
>>> {sum(row) for row in M} # Qatar jıyındılarınıń jıyındısın jasaw
{24, 6, 15}
>>> {i : sum(M[i]) for i in range(3)} # Qatar jıyındılarınıń gilt/mánis kestesin jasaw
{0: 6, 1: 15, 2: 24}
Haqıyqatında, Python 3.0-de dizimler, jıyındılar hám sózliklerdi túsiniw ańlatpaları menen qurıwǵa boladı:
>>> [ord(x) for x in 'spaam'] # Háriplerdiń kod sanlarınıń dizimi
[115, 112, 97, 97, 109]
>>> {ord(x) for x in 'spaam'} # Jıyındılar qaytalanıwlardı alıp taslaydı
{112, 97, 115, 109}
>>> {x: ord(x) for x in 'spaam'} # Sózlik giltleri unikal boladı
{'a': 97, 'p': 112, 's': 115, 'm': 109}
Biraq generatorlar, jıyındılar hám sózlikler sıyaqlı obyektlerdi túsiniw ushın bizge alǵa jıljıwımız kerek.
Sózlikler
Python sózlikleri pútkilley basqa nárse (Monty Python-ǵa silteme etilgen)—olar hesh qanday izbe-izlikler emes, al kartaǵa túsiriw (mapping) dep ataladı. Kartaǵa túsiriwler de basqa obyektlerdiń jıynaǵı bolıp tabıladı, biraq olar obyektlerdi salıstırmalı ornı boyınsha emes, al gilt arqalı saqlaydı. Shınında da, kartaǵa túsiriwler hesh qanday isenimli shepten ońǵa tártipti saqlamaydı; olar tek giltlerdi baylanıslı mánislerge sáykeslendiredi. Sózlikler, Python-nıń tiykarǵı obyektler toplamındaǵı jalǵız kartaǵa túsiriw túri, sonday-aq ózgermeli: olardı ornında ózgertiwge boladı hám olar dizimler sıyaqlı talap boyınsha ósip hám kishireye aladı.
Kartaǵa túsiriw operaсiyaları
Literallar túrinde jazılǵanda, sózlikler figuralı qawsırmalarda kodlanadı hám "gilt: mánis" jublarınıń qatarınan turadı. Sózlikler giltler menen mánisler toplamın baylanıstırıw kerek bolǵan hár qanday jaǵdayda paydalı—mısalı, bir nárseniń qásiyetlerin súwretlew ushın. Mısal retinde, tómendegi úsh elementli sózlikti qarań (giltleri "food", "quantity" hám "color"):
>>> D = {'food': 'Spam', 'quantity': 4, 'color': 'pink'}
Biz bul sózlikti gilt arqalı indekslep, giltlerdiń baylanıslı mánislerin alıw hám ózgertiw ushın paydalana alamız. Sózlik indekslew operaсiyası izbe-izlikler ushın qollanılatuǵın sintaksisti paydalanadı, biraq kvadrat qawsırmalar ishindegi element salıstırmalı orın emes, al gilt bolıp tabıladı:
>>> D['food'] # 'food' giltiniń mánisin alıw
'Spam'
>>> D['quantity'] += 1 # 'quantity' mánisine 1 qosıw
>>> D
{'food': 'Spam', 'color': 'pink', 'quantity': 5}
Figuralı qawsırmalı literal forması qollanılsa da, sózliklerdi basqa jollar menen qurıw kóbirek tarqalǵan. Mısalı, tómendegi kod bos sózlikten baslanıp, onı bir waqıtta bir gilt penen toltıradı. Dizimlerdegi shegaradan tıs tayınlawlardan ayırmashılıǵı, jańa sózlik giltlerine tayınlawlar sol giltlerdi jaratadı:
>>> D = {}
>>> D['name'] = 'Bob' # Tayınlaw arqalı giltlerdi jaratıw
>>> D['job'] = 'dev'
>>> D['age'] = 40
>>> D
{'age': 40, 'job': 'dev', 'name': 'Bob'}
>>> print(D['name'])
Bob
Bul jerde biz sózlik giltlerin birewdi súwretleytuǵın jazbadaǵı ańlatpa atları sıpatında paydalanıp atırmız. Basqa qollanıwlarda, sózlikler izlew operaсiyaların almastırıw ushın da qollanılıwı múmkin—gilt boyınsha sózlikti indekslew kóbinese Python-da izlewdi kodlawdıń eń tez usılı bolıp tabıladı.
Qayta qaralǵan jaylastırıw
Aldıńǵı mısalda biz úsh giltli sózlikti gipotetikalıq adamdı súwretlew ushın paydalandıq. Biraq, maǵlıwmat bunnan da quramalıraq bolıwı múmkin dep kóz aldıńızǵa keltiriń. Mısalı, bizge atı hám familiyasın, sonday-aq birneshe lawazımın jazıp alıw kerek bolıwı múmkin. Bul Python obyektlerin jaylastırıwdıń jáne bir qollanılıwına alıp keledi. Tómendegi sózlik, bir waqıtta literal sıpatında kodlanǵan, quramalıraq maǵlıwmattı qamtıydı:
>>> rec = {'name': {'first': 'Bob', 'last': 'Smith'},
'job': ['dev', 'mgr'],
'age': 40.5}
Bul jerde biz jáne úsh giltli sózlikke iyemiz (giltler "name", "job" hám "age"), biraq mánisler quramalıraq bolǵan: attı qollap-quwatlaw ushın jaylastırılǵan sózlik birneshe bólimlerge iye, al lawazım ushın jaylastırılǵan dizim birneshe wazıypalardı hám keleshekte keńeytiwdi qollap-quwatlaydı. Biz bul strukturanıń komponentlerine aldıńǵı matriсamız ushın islegenimizdey kirise alamız, biraq bul jolı indekslerimizdiń geyparaları dizim jıljıwları emes, al sózlik giltleri:
>>> rec['name'] # 'name' jaylastırılǵan sózlik
{'last': 'Smith', 'first': 'Bob'}
>>> rec['name']['last'] # Jaylastırılǵan sózlikti indekslew
'Smith'
>>> rec['job'] # 'job' jaylastırılǵan dizim
['dev', 'mgr']
>>> rec['job'][-1] # Jaylastırılǵan dizimdi indekslew
'mgr'
>>> rec['job'].append('janitor') # Bobtıń lawazım súwretlemesin ornında keńeytiw
>>> rec
{'age': 40.5, 'job': ['dev', 'mgr', 'janitor'], 'name': {'last': 'Smith',
'first': 'Bob'}}
Dıqqat awdarıń, sońǵı operaсiya jaylastırılǵan lawazım dizimin keńeytedi - sebebi lawazım dizimi onı qamtıytuǵın sózlikten bólek yadta saqlanadı, ol erkin túrde ósip hám kishireye aladı (obyekt yadınıń dúzilisi haqqında kitaptıń keyingi bólimlerinde tolıǵıraq talqılanadı).
Bul mısaldı kórsetiwdiń haqıyqıy sebebi - Pythonnıń tiykarǵı maǵlıwmat tipleriniń iykemliligin kórsetiw. Kórip turǵanıńızday, jaylastırıw bizge quramalı maǵlıwmat strukturaların tikkeley hám ańsat qurıwǵa múmkinshilik beredi. C sıyaqlı tómen dárejeli tilde uqsas strukturanı qurıw qıyın hám kóbirek kod talap eter edi: bizge strukturalardı hám massivlerdi jobalastırıw hám járiyalaw, mánislerdi toltırıw, hámmesin bir-birine baylanıstırıw hám t.b. kerek bolar edi. Pythonda bulardıń hámmesi avtomatik túrde orınlanadı - ańlatpanı orınlaw biziń ushın pútkil jaylastırılǵan obyekt strukturasın dúzedi. Haqıyqatında, bul Python sıyaqlı skript tilleriniń tiykarǵı artıqmashılıqlarınıń biri.
Sonıń menen birge, tómen dárejeli tilde bizge obyekttiń ornın oǵan endi mútáj bolmaǵanımızda dıqqat penen tazalaw kerek bolar edi. Pythonda, obyektke bolǵan sońǵı siltemeni joǵaltqanımızda - mısalı, onıń ózgermelisine basqa nárse tayınlaw arqalı - sol obyekttiń strukturası iyelegen barlıq yadtıń ornı avtomatik túrde biziń ushın tazalanadı:
>>> rec = 0 # Endi obyekttiń ornı qaytarıp alınadı
Texnikalıq jaqtan aytqanda, Pythonda "shıǵındı jıynaw" dep atalatuǵın ózgeshelik bar, ol baǵdarlamańız jumıs islep atırǵanda paydalanılmaytuǵın yadtı tazalaydı hám sizdi kodıńızda usınday waqıyalardı basqarıwdan azat etedi. Pythonda orın dárhal, obyektke bolǵan sońǵı silteme alıp taslanǵannan keyin birden qaytarıp alınadı. Bunıń qalay isleytuǵının kitaptıń keyingi bólimlerinde úyrenemiz; házirshe, obyektlerdi erkin qollanıwıńız múmkin ekenin, olardıń ornın jaratıw yamasa jumıs barısında tazalaw haqqında qayǵırmay-aq qoyatuǵınıńızdı biliw jetkilikli.
Giltlerdi sáykeslestiriw: for ciklı
Sáykeslestiriwler sıpatında, burın kórgenimizdey, sózlikler tek ǵana elementlerge gilt arqalı kiriwdi qollaydı. Biraq, olar sonday-aq kóp sanlı ulıwma qollanıw jaǵdaylarında paydalı bolǵan metod shaqırıwları menen túrge tán operaсiyalardı da qollaydı.
Burın aytılǵanınday, sózlikler izbe-izlik bolmaǵanlıqtan, olar hesh qanday isenimli shepten ońǵa tártipti saqlamaydı. Bul, eger biz sózlik jasap, onı qaytadan basıp shıǵarsaq, onıń giltleri biziń olardı teriwimizden basqasha tártipte qaytıwı múmkin degendi ańlatadı:
>>> D = {'a': 1, 'b': 2, 'c': 3}
>>> D
{'a': 1, 'c': 3, 'b': 2}
Biraq, eger bizge sózliktiń elementlerine tártip beriw kerek bolsa, ne isleymiz? Bir ulıwma sheshim - sózliktiń keys metodı menen giltler dizimin alıw, onı dizimniń sort metodı menen sáykeslestiriw, hám sońınan nátiyje boyınsha Python for ciklı menen júriw (tómendegi for ciklın kodlaǵannan keyin Enter túymesin eki ret basıwdı umıtpań - 3-bapta túsindirilgendey, bos qatar interaktiv kórsetkishte "bar" degendi ańlatadı, hám geybir interfeyslerde kórsetkish "..." ǵa ózgeredi):
>>> Ks = list(D.keys()) # Tártipsiz giltler dizimi
>>> Ks # 2.6 da dizim, 3.0 da "kórinisi": list() qollanıń
['a', 'c', 'b']
>>> Ks.sort() # Sáykeslestirilgen giltler dizimi
>>> Ks
['a', 'b', 'c']
>>> for key in Ks: # Sáykeslestirilgen giltler boyınsha aylanıw
print(key, '=>', D[key]) # 1
b => 2
c => 3
Bul úsh basqıshlı proсess, biraq, keyingi baplarda kóretuǵınımızday, Python nıń jańa versiyalarında bunı jańa sorted vstroennıy funkсiyası menen bir basqıshta islewge boladı. sorted shaqırıwı nátiyjeni qaytaradı hám hár túrli obyekt túrlerin sáykeslestiredi, bul jaǵdayda sózlik giltlerin avtomatik túrde sáykeslestiredi:
>>> D
{'a': 1, 'c': 3, 'b': 2}
>>> for key in sorted(D):
print(key, '=>', D[key])
a => 1
b => 2
c => 3
Sózliklerdi kórsetiwden tısqarı, bul qollanıw jaǵdayı Python for ciklın tanıstırıwǵa xızmet etedi. for ciklı - bul izbe-izliktegi barlıq elementler arqalı ótiw hám hár bir element ushın kod blogın orınlawdıń ápiwayı hám nátiyjeli usılı. Paydalanıwshı tárepinen anıqlanǵan cikl ózgeriwshisi (bul jerde key) hár ótiwde aǵımdaǵı elementke silteme jasaw ushın qollanıladı. Biziń mısalımızda ulıwma nátiyje - tártipsiz sózliktiń giltleri hám mánislerin sáykeslestirilgen gilt tártibinde basıp shıǵarıw.
for ciklı hám onıń ulıwmalıq tuwısqanı while ciklı - biziń skriptlerimizde qaytalanıwshı tapsırmalardı operatorlar sıpatında kodlawdıń tiykarǵı usılları. Shınında da, for ciklı (burın tanıs bolǵan onıń tuwısqanı list comprehension sıyaqlı) izbe-izlik operaсiyası bolıp tabıladı. Ol hár qanday izbe-izlik obyektinde isleydi hám, list comprehension sıyaqlı, hátte izbe-izlik bolmaǵan nárselerde de isleydi. Mısalı, bul jerde ol qatardaǵı háripler boyınsha júrip, hár biriniń bas hárip versiyasın basıp shıǵaradı:
>>> for c in 'spam':
print(c.upper())
S
P
A
M
Python nıń while ciklı - bul ulıwmalıraq cikl quralı, ol tek izbe-izlikler boyınsha júriw menen sheklenbeydi:
>>> x = 4
>>> while x > 0:
print('spam!' * x)
x -= 1
spam!spam!spam!spam!
spam!spam!spam!
spam!spam!
spam!
Biz cikl operatorları, sintaksis hám qurallardı kitaptıń keyingi bólimlerinde tolıǵıraq talqılaymız.
Iteraсiya hám optimizaсiya
Eger sońǵı bólimdegi for ciklı aldın tanıstırılǵan list comprehension ańlatpasına uqsas kórinse, bul durıs: ekewi de ulıwma iteraсiya quralları bolıp tabıladı. Shınında da, ekewi de iteraсiya protokolın qollaytuǵın hár qanday obyektte isleydi - bul Pythondaǵı keń tarqalǵan ideya, ol tiykarınan yadta fizikalıq saqlanǵan izbe-izlikti yamasa iteraсiya operaсiyası kontekstinde bir waqıtta bir element jaratıwshı obyektti ańlatadı. Eger obyekt iter vstroennıy funkсiyasına next ke juwap beretuǵın obyekt penen juwap berse, ol sońǵı kategoriyaǵa kiredi. Burın kórgen generator comprehension ańlatpası usınday obyekt bolıp tabıladı.
Men bul kitapta iteraсiya protokolı haqqında kóbirek aytaman. Házirshe esińizde bolsın, obyektti shepten ońǵa qaray skanerleytuǵın hár bir Python quralı iteraсiya protokolın qollanadı. Usı sebepli aldıńǵı bólimde qollanılǵan sorted shaqırıwı sózlikte tikkeley isleydi - bizge izbe-izlik alıw ushın keys metodın shaqırıwdıń keregi joq, sebebi sózlikler iteraсiyalanatuǵın obyektler bolıp, olardıń next i izbe-iz giltlerdi qaytaradı.
Bul sonday-aq hár qanday list comprehension ańlatpasın, mısalı, sanlar diziminiń kvadratların esaplaytuǵın mına ańlatpanı:
>>> squares = [x ** 2 for x in [1, 2, 3, 4, 5]]
>>> squares
[1, 4, 9, 16, 25]
bárqulla nátiyje dizimin qol menen qurastıratuǵın, ekvivalent for ciklı túrinde kodlawǵa bolatuǵının ańlatadı:
>>> squares = []
>>> for x in [1, 2, 3, 4, 5]: # Bul list comprehension ne isleytuǵının kórsetedi
squares.append(x ** 2) # Ekewi de ishki iteraсiya protokolın orınlaydı
>>> squares
[1, 4, 9, 16, 25]
Degen menen, list comprehension hám oǵan baylanıslı map hám filter sıyaqlı funkсionallıq programmalastırıw quralları, búgingi kúnde for ciklına qaraǵanda tezirek jumıs isleydi (hátte eki ese tezirek bolıwı múmkin) - bul qásiyet úlken maǵlıwmatlar toplamları ushın siziń programmalarıńızda áhmiyetli bolıwı múmkin. Soǵan qaramastan, Python da ónimlilik ólshemleri qıyın másele ekenin atap ótiwim kerek, sebebi ol kóp nárseni optimizaсiyalaydı hám ónimlilik hár bir relizde ózgeriwi múmkin.
Python da tiykarǵı qaǵıyda - dáslep ápiwayılıq hám oqıwǵa qolaylılıq ushın kod jazıw, al ónimlilik haqqında keyinirek, programmańız islep atırǵanda hám haqıyqıy ónimlilik máselesi bar ekenin dálillegennen keyin oylanıw. Kóbinese, siziń kodıńız sol halında jetkilikli dárejede tez boladı. Eger sizge ónimlilik ushın kodtı optimallastırıw kerek bolsa, Python sizge járdem beriw ushın qurallar usınadı, sonıń ishinde time hám timeit modulleri hám profile moduli bar. Bular haqqında usı kitaptıń keyingi bólimlerinde hám Python qollanbalarında kóbirek maǵlıwmat tabasız.
Joq giltler: if tekseriwleri
Alǵa jıljıwdan aldın sózlikler haqqında jáne bir eskertpe. Biz jańa gilt arqalı sózlikti keńeyte alsaq ta, joq giltti alıw ele de qáte bolıp esaplanadı:
>>> D
{'a': 1, 'c': 3, 'b': 2}
>>> D['e'] = 99 # Jańa giltlerdi tayınlaw sózlikti keńeytedi
>>> D
{'a': 1, 'c': 3, 'b': 2, 'e': 99}
>>> D['f'] # Joq giltke múrájat etiw qáte
...qáte tekst ótkizip jiberildi...
KeyError: 'f'
Bul bizge kerek nárse - ádette, haqıyqatında joq nárseni alıwǵa urınıw programmalastırıw qátesi bolıp esaplanadı. Biraq ayırım ulıwma programmalarda, kodımızdı jazǵan waqıtta qaysı giltlerdiń bar bolatuǵının bárqulla bile almaymız. Bunday jaǵdaylardı qalay sheship, qátelerden qalay qashamız? Bir usıl - aldın ala tekseriw. Sózliktegi aǵzalıq ańlatpası bizge gilttiń bar-joqlıǵın soraw hám nátiyjege qarap Python if bildiriwi menen tarmaqlanıwǵa múmkinshilik beredi (for sıyaqlı, interaktiv rejimde if di orınlaw ushın Enter di eki ret basıwdı umıtpań):
>>> 'f' in D
False
>>> if not 'f' in D:
print('joq')
joq
Men if bildiriwi hám ulıwma bildiriw sintaksisi haqqında usı kitapta keyinirek kóbirek aytaman, biraq biziń bul jerde qollanıp atırǵan formamız ápiwayı: ol if sózinen, keyin haqıyqıy yamasa jalǵan nátiyje sıpatında túsindiriletuǵın ańlatpadan hám tekseriw haqıyqıy bolsa orınlanatuǵın kod blogınan ibarat. Tolıq formasında, if bildiriwinde sonday-aq standart jaǵday ushın else bólimi hám basqa tekseriwler ushın bir yamasa birneshe elif (else if) bólimleri bolıwı múmkin. Bul Python daǵı tiykarǵı tańlaw quralı hám biziń skriptlerimizde logikanı kodlaw usılı.
Soǵan qaramastan, sózliklerdi jaratıwdıń hám joq giltlerge kiriwden qashıwdıń basqa da usılları bar: get metodı (standart mánisi bar shártli indeks); Python 2.X daǵı has_key metodı (3.0 da endi joq); try bildiriwi (10-bapta birinshi ret ushırasatuǵın, pútkilley qátelerdi uslap alatuǵın hám ońlaytuǵın qural); hám if/else ańlatpası (ámelde, bir qatarǵa qısılǵan if bildiriwi). Mine birneshe mısallar:
>>> value = D.get('x', 0) # Indekslew, biraq standart mánisi menen
>>> value
0
>>> value = D['x'] if 'x' in D else 0 # if/else ańlatpası forması
>>> value
0
Bunday alternativalardıń tápsilatların keyingi bapqa qaldıramız. Házirshe, kortejlerge óteyik.
Kortejler
Kortej obyekti (kimnen sorasańız, "tupl" yamasa "tapl" dep aytıladı) shama menen ózgertilmeytuǵın dizimge uqsaydı - kortejler dizimler sıyaqlı izbe-izlik bolıp tabıladı, biraq qatarlar sıyaqlı ózgermeytuǵın. Sintaksis jaǵınan olar kvadrat qawsırmalar ornına dóńgelek qawsırmalarda jazıladı hám qálegen tiplerdi, qálegen uyalasıwdı hám ádettegi izbe-izlik operaсiyaların qollaydı:
>>> T = (1, 2, 3, 4) # 4 elementli kortej
>>> len(T) # Uzınlıǵı
4
>>> T + (5, 6) # Biriktiriw
(1, 2, 3, 4, 5, 6)
>>> T[0] # Indekslew, kesiw hám basqalar
1
Kortejlerdiń sonday-aq Python 3.0 da eki tipke tán shaqırılatuǵın metodı bar, biraq dizimlerdegidey kóp emes:
>>> T.index(4) # Kortej metodları: 4 sanı 3-orında jaylasqan
3
>>> T.count(4) # 4 sanı bir ret kezdesedi
1
Kortejlerdiń tiykarǵı ózgesheligi - olar dúzilgennen keyin ózgertilmeydi. Yaǵnıy, olar ózgermeytuǵın izbe-izlikler:
>>> T[0] = 2 # Kortejler ózgermeytuǵın
...qáte tekst jiberildi...
TypeError: 'tuple' obyekti element tayınlawdı qollap-quwatlamaydı
Dizimler hám sózlikler sıyaqlı, kortejler aralas tiplerdi hám uyalasıwdı qollap-quwatlaydı, biraq olar ózgermeytuǵın bolǵanlıqtan, ósip yamasa kishireymeydi:
>>> T = ('spam', 3.0, [11, 22, 33])
>>> T[1]
3.0
>>> T[2][1]
22
>>> T.append(4)
AttributeError: 'tuple' obyektinde 'append' atributı joq
Kortejler ne ushın kerek?
Solay etip, nege dizimge uqsas, biraq az operaсiyalardı qollap-quwatlaytuǵın tip kerek? Ashıǵın aytqanda, kortejler ámeliyatta dizimlerge qaraǵanda siyrek qollanıladı, biraq olardıń ózgermeytuǵınlıǵı - bul olardıń tiykarǵı maqseti. Eger siz obyektler toplamın baǵdarlamańız boyınsha dizim sıpatında jiberseńiz, ol hár jerde ózgertiliwi múmkin; eger kortej qollansańız, ol ózgertilmeydi. Yaǵnıy, kortejler biziń bul jerde jazatuǵınımızdan úlkenirek baǵdarlamalarda qolaylı bolǵan bir túrli pútinlik sheklewin támiyinleydi. Biz kortejler haqqında kitaptıń keyingi bólimlerinde kóbirek sóylesemiz. Házirshe bolsa, sońǵı tiykarǵı ózek tipimizge - faylǵa óteyik.
Fayllar
Fayl obyektleri - bul Python kodınıń siziń kompyuterińizdegi sırtqı fayllar menen baylanısıwınıń tiykarǵı interfeysi. Fayllar - bul tiykarǵı tip, biraq olar biraz ózgeshe - olardı jaratıw ushın arnawlı literal sintaksis joq. Onıń ornına, fayl obyektin jaratıw ushın, siz built-in open funkсiyasın shaqırıp, oǵan sırtqı fayl atın hám proсess rejimin qatar retinde beresiz. Mısalı, tekst shıǵarıw faylın jaratıw ushın, siz onıń atın hám maǵlıwmat jazıw ushın 'w' proсess rejimi qatarın beriwińiz kerek:
>>> f = open('data.txt', 'w') # Shıǵarıw rejiminde jańa fayl jaratıw
>>> f.write('Hello\n') # Oǵan bayt qatarların jazıw
6
>>> f.write('world\n') # Python 3.0-de jazılǵan baytlar sanın qaytaradı
6
>>> f.close() # Shıǵarıw buferlerin diskke jazıw ushın jabıw
Bul aǵımdaǵı papkada fayl jaratadı hám oǵan tekst jazadı (eger sizge kompyuterińizdiń basqa jerinde faylǵa kiriw kerek bolsa, fayl atı tolıq papka jolı bolıwı múmkin). Jańa ǵana jazǵanıńızdı qayta oqıw ushın, fayldı 'r' proсess rejiminde qayta ashıń, bul tekst kirisi ushın - eger shaqırıwda rejimdi kórsetpeseńiz, bul ádepki rejim. Sońınan fayl mazmunın qatarǵa oqıń hám kórsetiń. Fayl mazmunı bárqulla siziń skriptińizde qatar boladı, fayldaǵı maǵlıwmatlar tipine qaramastan:
>>> f = open('data.txt') # 'r' ádepki proсess rejimi
>>> text = f.read() # Pútkil fayldı qatarǵa oqıw
>>> text
'Hello\nworld\n'
>>> print(text) # print basqarıw belgilerin interpretaсiyalaydı
Hello
world
>>> text.split() # Fayl mazmunı bárqulla qatar
['Hello', 'world']
Fayl obyektleriniń basqa metodları bizge bul jerde qarap shıǵıwǵa waqtımız jetpeytuǵın qosımsha múmkinshiliklerdi qollaydı. Mısalı, fayl obyektleri oqıw hám jazıwdıń kóbirek usılların usınadı (read opсiyalıq bayt ólshemin qabıl etedi, readline bir waqıtta bir qatardı oqıydı hám t.b.), sonday-aq basqa qurallar da bar (seek jańa fayl poziсiyasına ótedi). Biraq, keyinirek kóretuǵınımızday, búgingi kúnde fayldı oqıwdıń eń jaqsı usılı - onı hesh oqımaw. Fayllar for cikllarında hám basqa kontekstlerde avtomat túrde qatarma-qatar oqıytuǵın iterator beredi.
Biz fayl metodlarınıń tolıq jıynaǵın bul kitaptıń keyingi bólimlerinde kóremiz, biraq eger siz házir tez kóz juwırtıp shıqqıńız kelse, ashıq faylǵa dir shaqırıwın orınlań hám qaytıp kelgen metod atlarınıń hár qaysısına help shaqırıwın orınlań:
>>> dir(f)
[ ...kóp atlar ótkizip jiberildi...
'buffer', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty',
'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline',
'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write',
'writelines']
>>> help(f.seek)
...sınap kóriń hám nátiyjesin kóriń...
Kitaptıń keyingi bólimlerinde, Python 3.0-de fayllardıń tekst hám binar maǵlıwmatlar arasında ayqın ayırmashılıq jasaytuǵının kóremiz. Tekst faylları mazmundı qatarlar túrinde kórsetedi hám Unicode kodlaw hám dekodlawdı avtomat túrde orınlaydı, al binar fayllar mazmundı arnawlı bytes qatar túri sıpatında kórsetedi hám fayl mazmunına ózgertiwsiz kiriwge múmkinshilik beredi:
>>> data = open('data.bin', 'rb').read() # Binar fayldı ashıw
>>> data # bytes qatarı binar maǵlıwmatlardı saqlaydı
b'\x00\x00\x00\x07spam\x00\x08'
>>> data[4:8]
b'spam'
Eger siz tek ASCII tekst penen islesetuǵın bolsańız, bul ayırmashılıqqa ulıwma itibar beriwińiz kerek emes, biraq Python 3.0-dıń qatarları hám faylları xalıqaralıq qollanbalar yamasa baytqa baǵdarlanǵan maǵlıwmatlar menen islesetuǵın bolsańız paydalı boladı.
Basqa faylǵa uqsas qurallar
Open funkсiyası Python-da orınlaytuǵın kópshilik fayl qayta islew ushın tiykarǵı qural bolıp tabıladı. Biraq quramalıraq tapsırmalar ushın Python qosımsha faylǵa uqsas qurallar menen keledi: pipes, FIFO-lar, soketler, giltli kiriw faylları, turaqlı obyekt sóreleri, deskriptorǵa tiykarlanǵan fayllar, relyaсiyalıq hám obyektke baǵdarlanǵan maǵlıwmatlar bazası interfeysleri hám taǵı basqalar. Mısalı, deskriptor faylları fayldı qulıplaw hám basqa tómen dárejeli qurallardı qollaydı, al soketler tarmaqlaw hám proсessler aralıq baylanıs ushın interfeys beredi. Biz bul kitapta bul temalardıń kópshiligin qamtıp ótpeymiz, biraq siz Python-da shın mánisinde programmalastırıwdı baslaǵanıńızda olardı paydalı dep tabasız.
Basqa tiykarǵı tipler
Usı 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 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(type(L)) # Hátte tipler de obyektler
# Python 3.0 da:
>>> type(L) # 3.0: tipler klasslar, hám kerisinshe
>>> type(type(L)) # Klass tipleri haqqında kóbirek maǵlıwmat ushın 31-baptı qarań
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.
Izbe-izlik operaсiyaları hám dizim metodlarınan tısqarı, Python dizimdi túsiniw ańlatpası (list comprehension expression) dep atalatuǵın qosımsha rawajlanǵan operaсiyanı qamtıydı, bul bolsa matriсamız sıyaqlı strukturalardı qayta islewdiń kúshli usılı bolıp shıǵadı. Mısalı, bizge úlgi matriсamızdıń ekinshi baǵanasın alıw kerek bolsın. Matriсa qatarlar boyınsha saqlanǵanlıqtan, ápiwayı indekslew arqalı qatarlardı alıw ańsat, biraq dizimdi túsiniw arqalı baǵananı alıw da sonday ańsat:
>>> col2 = [row[1] for row in M] # 2-baǵanadaǵı elementlerdi jıynaw
>>> col2
[2, 5, 8]
>>> M # Matriсa ózgerissiz qaladı
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Dizimdi túsiniw ańlatpaları kóplik belgilewinen kelip shıqqan; olar izbe-izliktegi hár bir elementke ańlatpanı bir waqıtta, shepten ońǵa qaray orınlaw arqalı jańa dizim qurıwdıń usılı. Dizimdi túsiniw ańlatpaları kvadrat qawsırmalarda jazıladı (bul olardıń dizim jasaytuǵının bildiredi) hám ańlatpa hám aynımalı atın bólisetuǵın qaytalaw konstrukсiyasınan turadı (bul jerde row). Joqarıdaǵı dizimdi túsiniw ańlatpası tiykarınan mınanı ańlatadı: "M matriсasındaǵı hár bir qatar ushın row[1] di jańa dizimde ber". Nátiyje matriсanıń 2-baǵanasın qamtıytuǵın jańa dizim boladı.
Dizimdi túsiniw ańlatpaları ámeliyatta quramalıraq bolıwı múmkin:
>>> [row[1] + 1 for row in M] # 2-baǵanadaǵı hár bir elementke 1 qosıw
[3, 6, 9]
>>> [row[1] for row in M if row[1] % 2 == 0] # Taq sanlardı súzip taslaw
[2, 8]
Mısalı, birinshi operaсiya hár bir elementti jıynaǵanda oǵan 1 qosadı, al ekinshisi if shártin qollanıp, % modul ańlatpası (bóliwden qalǵan qaldıq) arqalı nátiyjeden taq sanlardı súzip taslaydı. Dizimdi túsiniw ańlatpaları jańa nátiyjeler dizimin jasaydı, biraq olar hár qanday iteraсiyalanatuǵın obyekt boyınsha iteraсiya jasaw ushın qollanılıwı múmkin. Mısalı, bul jerde biz dizimdi túsiniw ańlatpaların aldın ala belgilengen koordinatalar dizimi hám qatar boyınsha júriw ushın qollanamız:
>>> diag = [M[i][i] for i in [0, 1, 2]] # Matriсadan diagonaldı jıynaw
>>> diag
[1, 5, 9]
>>> doubles = [c * 2 for c in 'spam'] # Qatardaǵı háriplerdi eki ret qaytalaw
>>> doubles
['ss', 'pp', 'aa', 'mm']
Dizimdi túsiniw ańlatpaları hám olarǵa uqsas map hám filter sıyaqlı qurılǵan funkсiyalar haqqında bul jerde kóbirek aytıw ushın biraz quramalı. Bul qısqasha kirisiwdiń tiykarǵı maqseti - Pythonnıń óz qurallarında ápiwayı hám quramalı qurallardı qamtıytuǵının kórsetiw. Dizimdi túsiniw ańlatpaları qosımsha múmkinshilik, biraq olar ámeliyatta paydalı bolıwǵa beyim hám kóbinese ádewir qayta islew tezligin beredi. Olar sonday-aq Pythondaǵı hár qanday izbe-izlik tipinde, sonday-aq izbe-izlik bolmaǵan bazı bir tiplerde de isleydi. Bul kitapta keyinirek olar haqqında kóbirek esitesiz.
Aldın ala kóriw retinde, jaqında shıqqan Python versiyalarında qawsırmalar ishindegi túsiniw sintaksisin talap boyınsha nátiyjeler beriwshi generatorlardı jasaw ushın da qollanıwǵa boladı (mısalı, sum funkсiyası izbe-izliktegi elementlerdi qosadı):
>>> G = (sum(row) for row in M) # Qatar jıyındılarınıń generatorın jasaw
>>> next(G)
6
>>> next(G) # Iteraсiya protokolın iske qosıw
15
Map funkсiyası da usıǵan uqsas jumıstı isley aladı, elementlerdi funkсiya arqalı ótkizip nátiyjeler beredi. Onı list funkсiyasına orap, Python 3.0-de barlıq mánislerin qaytarıwǵa májbúrleymiz:
>>> list(map(sum, M)) # M-degi elementler boyınsha sum funkсiyasın qollanıw
[6, 15, 24]
Python 3.0-de túsiniw sintaksisin jıyındı hám sózlikler jasaw ushın da qollanıwǵa boladı:
>>> {sum(row) for row in M} # Qatar jıyındılarınıń jıyındısın jasaw
{24, 6, 15}
>>> {i : sum(M[i]) for i in range(3)} # Qatar jıyındılarınıń gilt/mánis kestesin jasaw
{0: 6, 1: 15, 2: 24}
Haqıyqatında, Python 3.0-de dizimler, jıyındılar hám sózliklerdi túsiniw ańlatpaları menen qurıwǵa boladı:
>>> [ord(x) for x in 'spaam'] # Háriplerdiń kod sanlarınıń dizimi
[115, 112, 97, 97, 109]
>>> {ord(x) for x in 'spaam'} # Jıyındılar qaytalanıwlardı alıp taslaydı
{112, 97, 115, 109}
>>> {x: ord(x) for x in 'spaam'} # Sózlik giltleri unikal boladı
{'a': 97, 'p': 112, 's': 115, 'm': 109}
Biraq generatorlar, jıyındılar hám sózlikler sıyaqlı obyektlerdi túsiniw ushın bizge alǵa jıljıwımız kerek.
Sózlikler
Python sózlikleri pútkilley basqa nárse (Monty Python-ǵa silteme etilgen)—olar hesh qanday izbe-izlikler emes, al kartaǵa túsiriw (mapping) dep ataladı. Kartaǵa túsiriwler de basqa obyektlerdiń jıynaǵı bolıp tabıladı, biraq olar obyektlerdi salıstırmalı ornı boyınsha emes, al gilt arqalı saqlaydı. Shınında da, kartaǵa túsiriwler hesh qanday isenimli shepten ońǵa tártipti saqlamaydı; olar tek giltlerdi baylanıslı mánislerge sáykeslendiredi. Sózlikler, Python-nıń tiykarǵı obyektler toplamındaǵı jalǵız kartaǵa túsiriw túri, sonday-aq ózgermeli: olardı ornında ózgertiwge boladı hám olar dizimler sıyaqlı talap boyınsha ósip hám kishireye aladı.
Kartaǵa túsiriw operaсiyaları
Literallar túrinde jazılǵanda, sózlikler figuralı qawsırmalarda kodlanadı hám "gilt: mánis" jublarınıń qatarınan turadı. Sózlikler giltler menen mánisler toplamın baylanıstırıw kerek bolǵan hár qanday jaǵdayda paydalı—mısalı, bir nárseniń qásiyetlerin súwretlew ushın. Mısal retinde, tómendegi úsh elementli sózlikti qarań (giltleri "food", "quantity" hám "color"):
>>> D = {'food': 'Spam', 'quantity': 4, 'color': 'pink'}
Biz bul sózlikti gilt arqalı indekslep, giltlerdiń baylanıslı mánislerin alıw hám ózgertiw ushın paydalana alamız. Sózlik indekslew operaсiyası izbe-izlikler ushın qollanılatuǵın sintaksisti paydalanadı, biraq kvadrat qawsırmalar ishindegi element salıstırmalı orın emes, al gilt bolıp tabıladı:
>>> D['food'] # 'food' giltiniń mánisin alıw
'Spam'
>>> D['quantity'] += 1 # 'quantity' mánisine 1 qosıw
>>> D
{'food': 'Spam', 'color': 'pink', 'quantity': 5}
Figuralı qawsırmalı literal forması qollanılsa da, sózliklerdi basqa jollar menen qurıw kóbirek tarqalǵan. Mısalı, tómendegi kod bos sózlikten baslanıp, onı bir waqıtta bir gilt penen toltıradı. Dizimlerdegi shegaradan tıs tayınlawlardan ayırmashılıǵı, jańa sózlik giltlerine tayınlawlar sol giltlerdi jaratadı:
>>> D = {}
>>> D['name'] = 'Bob' # Tayınlaw arqalı giltlerdi jaratıw
>>> D['job'] = 'dev'
>>> D['age'] = 40
>>> D
{'age': 40, 'job': 'dev', 'name': 'Bob'}
>>> print(D['name'])
Bob
Bul jerde biz sózlik giltlerin birewdi súwretleytuǵın jazbadaǵı ańlatpa atları sıpatında paydalanıp atırmız. Basqa qollanıwlarda, sózlikler izlew operaсiyaların almastırıw ushın da qollanılıwı múmkin—gilt boyınsha sózlikti indekslew kóbinese Python-da izlewdi kodlawdıń eń tez usılı bolıp tabıladı.
Qayta qaralǵan jaylastırıw
Aldıńǵı mısalda biz úsh giltli sózlikti gipotetikalıq adamdı súwretlew ushın paydalandıq. Biraq, maǵlıwmat bunnan da quramalıraq bolıwı múmkin dep kóz aldıńızǵa keltiriń. Mısalı, bizge atı hám familiyasın, sonday-aq birneshe lawazımın jazıp alıw kerek bolıwı múmkin. Bul Python obyektlerin jaylastırıwdıń jáne bir qollanılıwına alıp keledi. Tómendegi sózlik, bir waqıtta literal sıpatında kodlanǵan, quramalıraq maǵlıwmattı qamtıydı:
>>> rec = {'name': {'first': 'Bob', 'last': 'Smith'},
'job': ['dev', 'mgr'],
'age': 40.5}
Bul jerde biz jáne úsh giltli sózlikke iyemiz (giltler "name", "job" hám "age"), biraq mánisler quramalıraq bolǵan: attı qollap-quwatlaw ushın jaylastırılǵan sózlik birneshe bólimlerge iye, al lawazım ushın jaylastırılǵan dizim birneshe wazıypalardı hám keleshekte keńeytiwdi qollap-quwatlaydı. Biz bul strukturanıń komponentlerine aldıńǵı matriсamız ushın islegenimizdey kirise alamız, biraq bul jolı indekslerimizdiń geyparaları dizim jıljıwları emes, al sózlik giltleri:
>>> rec['name'] # 'name' jaylastırılǵan sózlik
{'last': 'Smith', 'first': 'Bob'}
>>> rec['name']['last'] # Jaylastırılǵan sózlikti indekslew
'Smith'
>>> rec['job'] # 'job' jaylastırılǵan dizim
['dev', 'mgr']
>>> rec['job'][-1] # Jaylastırılǵan dizimdi indekslew
'mgr'
>>> rec['job'].append('janitor') # Bobtıń lawazım súwretlemesin ornında keńeytiw
>>> rec
{'age': 40.5, 'job': ['dev', 'mgr', 'janitor'], 'name': {'last': 'Smith',
'first': 'Bob'}}
Dıqqat awdarıń, sońǵı operaсiya jaylastırılǵan lawazım dizimin keńeytedi - sebebi lawazım dizimi onı qamtıytuǵın sózlikten bólek yadta saqlanadı, ol erkin túrde ósip hám kishireye aladı (obyekt yadınıń dúzilisi haqqında kitaptıń keyingi bólimlerinde tolıǵıraq talqılanadı).
Bul mısaldı kórsetiwdiń haqıyqıy sebebi - Pythonnıń tiykarǵı maǵlıwmat tipleriniń iykemliligin kórsetiw. Kórip turǵanıńızday, jaylastırıw bizge quramalı maǵlıwmat strukturaların tikkeley hám ańsat qurıwǵa múmkinshilik beredi. C sıyaqlı tómen dárejeli tilde uqsas strukturanı qurıw qıyın hám kóbirek kod talap eter edi: bizge strukturalardı hám massivlerdi jobalastırıw hám járiyalaw, mánislerdi toltırıw, hámmesin bir-birine baylanıstırıw hám t.b. kerek bolar edi. Pythonda bulardıń hámmesi avtomatik túrde orınlanadı - ańlatpanı orınlaw biziń ushın pútkil jaylastırılǵan obyekt strukturasın dúzedi. Haqıyqatında, bul Python sıyaqlı skript tilleriniń tiykarǵı artıqmashılıqlarınıń biri.
Sonıń menen birge, tómen dárejeli tilde bizge obyekttiń ornın oǵan endi mútáj bolmaǵanımızda dıqqat penen tazalaw kerek bolar edi. Pythonda, obyektke bolǵan sońǵı siltemeni joǵaltqanımızda - mısalı, onıń ózgermelisine basqa nárse tayınlaw arqalı - sol obyekttiń strukturası iyelegen barlıq yadtıń ornı avtomatik túrde biziń ushın tazalanadı:
>>> rec = 0 # Endi obyekttiń ornı qaytarıp alınadı
Texnikalıq jaqtan aytqanda, Pythonda "shıǵındı jıynaw" dep atalatuǵın ózgeshelik bar, ol baǵdarlamańız jumıs islep atırǵanda paydalanılmaytuǵın yadtı tazalaydı hám sizdi kodıńızda usınday waqıyalardı basqarıwdan azat etedi. Pythonda orın dárhal, obyektke bolǵan sońǵı silteme alıp taslanǵannan keyin birden qaytarıp alınadı. Bunıń qalay isleytuǵının kitaptıń keyingi bólimlerinde úyrenemiz; házirshe, obyektlerdi erkin qollanıwıńız múmkin ekenin, olardıń ornın jaratıw yamasa jumıs barısında tazalaw haqqında qayǵırmay-aq qoyatuǵınıńızdı biliw jetkilikli.
Giltlerdi sáykeslestiriw: for ciklı
Sáykeslestiriwler sıpatında, burın kórgenimizdey, sózlikler tek ǵana elementlerge gilt arqalı kiriwdi qollaydı. Biraq, olar sonday-aq kóp sanlı ulıwma qollanıw jaǵdaylarında paydalı bolǵan metod shaqırıwları menen túrge tán operaсiyalardı da qollaydı.
Burın aytılǵanınday, sózlikler izbe-izlik bolmaǵanlıqtan, olar hesh qanday isenimli shepten ońǵa tártipti saqlamaydı. Bul, eger biz sózlik jasap, onı qaytadan basıp shıǵarsaq, onıń giltleri biziń olardı teriwimizden basqasha tártipte qaytıwı múmkin degendi ańlatadı:
>>> D = {'a': 1, 'b': 2, 'c': 3}
>>> D
{'a': 1, 'c': 3, 'b': 2}
Biraq, eger bizge sózliktiń elementlerine tártip beriw kerek bolsa, ne isleymiz? Bir ulıwma sheshim - sózliktiń keys metodı menen giltler dizimin alıw, onı dizimniń sort metodı menen sáykeslestiriw, hám sońınan nátiyje boyınsha Python for ciklı menen júriw (tómendegi for ciklın kodlaǵannan keyin Enter túymesin eki ret basıwdı umıtpań - 3-bapta túsindirilgendey, bos qatar interaktiv kórsetkishte "bar" degendi ańlatadı, hám geybir interfeyslerde kórsetkish "..." ǵa ózgeredi):
>>> Ks = list(D.keys()) # Tártipsiz giltler dizimi
>>> Ks # 2.6 da dizim, 3.0 da "kórinisi": list() qollanıń
['a', 'c', 'b']
>>> Ks.sort() # Sáykeslestirilgen giltler dizimi
>>> Ks
['a', 'b', 'c']
>>> for key in Ks: # Sáykeslestirilgen giltler boyınsha aylanıw
print(key, '=>', D[key]) # 1
b => 2
c => 3
Bul úsh basqıshlı proсess, biraq, keyingi baplarda kóretuǵınımızday, Python nıń jańa versiyalarında bunı jańa sorted vstroennıy funkсiyası menen bir basqıshta islewge boladı. sorted shaqırıwı nátiyjeni qaytaradı hám hár túrli obyekt túrlerin sáykeslestiredi, bul jaǵdayda sózlik giltlerin avtomatik túrde sáykeslestiredi:
>>> D
{'a': 1, 'c': 3, 'b': 2}
>>> for key in sorted(D):
print(key, '=>', D[key])
a => 1
b => 2
c => 3
Sózliklerdi kórsetiwden tısqarı, bul qollanıw jaǵdayı Python for ciklın tanıstırıwǵa xızmet etedi. for ciklı - bul izbe-izliktegi barlıq elementler arqalı ótiw hám hár bir element ushın kod blogın orınlawdıń ápiwayı hám nátiyjeli usılı. Paydalanıwshı tárepinen anıqlanǵan cikl ózgeriwshisi (bul jerde key) hár ótiwde aǵımdaǵı elementke silteme jasaw ushın qollanıladı. Biziń mısalımızda ulıwma nátiyje - tártipsiz sózliktiń giltleri hám mánislerin sáykeslestirilgen gilt tártibinde basıp shıǵarıw.
for ciklı hám onıń ulıwmalıq tuwısqanı while ciklı - biziń skriptlerimizde qaytalanıwshı tapsırmalardı operatorlar sıpatında kodlawdıń tiykarǵı usılları. Shınında da, for ciklı (burın tanıs bolǵan onıń tuwısqanı list comprehension sıyaqlı) izbe-izlik operaсiyası bolıp tabıladı. Ol hár qanday izbe-izlik obyektinde isleydi hám, list comprehension sıyaqlı, hátte izbe-izlik bolmaǵan nárselerde de isleydi. Mısalı, bul jerde ol qatardaǵı háripler boyınsha júrip, hár biriniń bas hárip versiyasın basıp shıǵaradı:
>>> for c in 'spam':
print(c.upper())
S
P
A
M
Python nıń while ciklı - bul ulıwmalıraq cikl quralı, ol tek izbe-izlikler boyınsha júriw menen sheklenbeydi:
>>> x = 4
>>> while x > 0:
print('spam!' * x)
x -= 1
spam!spam!spam!spam!
spam!spam!spam!
spam!spam!
spam!
Biz cikl operatorları, sintaksis hám qurallardı kitaptıń keyingi bólimlerinde tolıǵıraq talqılaymız.
Iteraсiya hám optimizaсiya
Eger sońǵı bólimdegi for ciklı aldın tanıstırılǵan list comprehension ańlatpasına uqsas kórinse, bul durıs: ekewi de ulıwma iteraсiya quralları bolıp tabıladı. Shınında da, ekewi de iteraсiya protokolın qollaytuǵın hár qanday obyektte isleydi - bul Pythondaǵı keń tarqalǵan ideya, ol tiykarınan yadta fizikalıq saqlanǵan izbe-izlikti yamasa iteraсiya operaсiyası kontekstinde bir waqıtta bir element jaratıwshı obyektti ańlatadı. Eger obyekt iter vstroennıy funkсiyasına next ke juwap beretuǵın obyekt penen juwap berse, ol sońǵı kategoriyaǵa kiredi. Burın kórgen generator comprehension ańlatpası usınday obyekt bolıp tabıladı.
Men bul kitapta iteraсiya protokolı haqqında kóbirek aytaman. Házirshe esińizde bolsın, obyektti shepten ońǵa qaray skanerleytuǵın hár bir Python quralı iteraсiya protokolın qollanadı. Usı sebepli aldıńǵı bólimde qollanılǵan sorted shaqırıwı sózlikte tikkeley isleydi - bizge izbe-izlik alıw ushın keys metodın shaqırıwdıń keregi joq, sebebi sózlikler iteraсiyalanatuǵın obyektler bolıp, olardıń next i izbe-iz giltlerdi qaytaradı.
Bul sonday-aq hár qanday list comprehension ańlatpasın, mısalı, sanlar diziminiń kvadratların esaplaytuǵın mına ańlatpanı:
>>> squares = [x ** 2 for x in [1, 2, 3, 4, 5]]
>>> squares
[1, 4, 9, 16, 25]
bárqulla nátiyje dizimin qol menen qurastıratuǵın, ekvivalent for ciklı túrinde kodlawǵa bolatuǵının ańlatadı:
>>> squares = []
>>> for x in [1, 2, 3, 4, 5]: # Bul list comprehension ne isleytuǵının kórsetedi
squares.append(x ** 2) # Ekewi de ishki iteraсiya protokolın orınlaydı
>>> squares
[1, 4, 9, 16, 25]
Degen menen, list comprehension hám oǵan baylanıslı map hám filter sıyaqlı funkсionallıq programmalastırıw quralları, búgingi kúnde for ciklına qaraǵanda tezirek jumıs isleydi (hátte eki ese tezirek bolıwı múmkin) - bul qásiyet úlken maǵlıwmatlar toplamları ushın siziń programmalarıńızda áhmiyetli bolıwı múmkin. Soǵan qaramastan, Python da ónimlilik ólshemleri qıyın másele ekenin atap ótiwim kerek, sebebi ol kóp nárseni optimizaсiyalaydı hám ónimlilik hár bir relizde ózgeriwi múmkin.
Python da tiykarǵı qaǵıyda - dáslep ápiwayılıq hám oqıwǵa qolaylılıq ushın kod jazıw, al ónimlilik haqqında keyinirek, programmańız islep atırǵanda hám haqıyqıy ónimlilik máselesi bar ekenin dálillegennen keyin oylanıw. Kóbinese, siziń kodıńız sol halında jetkilikli dárejede tez boladı. Eger sizge ónimlilik ushın kodtı optimallastırıw kerek bolsa, Python sizge járdem beriw ushın qurallar usınadı, sonıń ishinde time hám timeit modulleri hám profile moduli bar. Bular haqqında usı kitaptıń keyingi bólimlerinde hám Python qollanbalarında kóbirek maǵlıwmat tabasız.
Joq giltler: if tekseriwleri
Alǵa jıljıwdan aldın sózlikler haqqında jáne bir eskertpe. Biz jańa gilt arqalı sózlikti keńeyte alsaq ta, joq giltti alıw ele de qáte bolıp esaplanadı:
>>> D
{'a': 1, 'c': 3, 'b': 2}
>>> D['e'] = 99 # Jańa giltlerdi tayınlaw sózlikti keńeytedi
>>> D
{'a': 1, 'c': 3, 'b': 2, 'e': 99}
>>> D['f'] # Joq giltke múrájat etiw qáte
...qáte tekst ótkizip jiberildi...
KeyError: 'f'
Bul bizge kerek nárse - ádette, haqıyqatında joq nárseni alıwǵa urınıw programmalastırıw qátesi bolıp esaplanadı. Biraq ayırım ulıwma programmalarda, kodımızdı jazǵan waqıtta qaysı giltlerdiń bar bolatuǵının bárqulla bile almaymız. Bunday jaǵdaylardı qalay sheship, qátelerden qalay qashamız? Bir usıl - aldın ala tekseriw. Sózliktegi aǵzalıq ańlatpası bizge gilttiń bar-joqlıǵın soraw hám nátiyjege qarap Python if bildiriwi menen tarmaqlanıwǵa múmkinshilik beredi (for sıyaqlı, interaktiv rejimde if di orınlaw ushın Enter di eki ret basıwdı umıtpań):
>>> 'f' in D
False
>>> if not 'f' in D:
print('joq')
joq
Men if bildiriwi hám ulıwma bildiriw sintaksisi haqqında usı kitapta keyinirek kóbirek aytaman, biraq biziń bul jerde qollanıp atırǵan formamız ápiwayı: ol if sózinen, keyin haqıyqıy yamasa jalǵan nátiyje sıpatında túsindiriletuǵın ańlatpadan hám tekseriw haqıyqıy bolsa orınlanatuǵın kod blogınan ibarat. Tolıq formasında, if bildiriwinde sonday-aq standart jaǵday ushın else bólimi hám basqa tekseriwler ushın bir yamasa birneshe elif (else if) bólimleri bolıwı múmkin. Bul Python daǵı tiykarǵı tańlaw quralı hám biziń skriptlerimizde logikanı kodlaw usılı.
Soǵan qaramastan, sózliklerdi jaratıwdıń hám joq giltlerge kiriwden qashıwdıń basqa da usılları bar: get metodı (standart mánisi bar shártli indeks); Python 2.X daǵı has_key metodı (3.0 da endi joq); try bildiriwi (10-bapta birinshi ret ushırasatuǵın, pútkilley qátelerdi uslap alatuǵın hám ońlaytuǵın qural); hám if/else ańlatpası (ámelde, bir qatarǵa qısılǵan if bildiriwi). Mine birneshe mısallar:
>>> value = D.get('x', 0) # Indekslew, biraq standart mánisi menen
>>> value
0
>>> value = D['x'] if 'x' in D else 0 # if/else ańlatpası forması
>>> value
0
Bunday alternativalardıń tápsilatların keyingi bapqa qaldıramız. Házirshe, kortejlerge óteyik.
Kortejler
Kortej obyekti (kimnen sorasańız, "tupl" yamasa "tapl" dep aytıladı) shama menen ózgertilmeytuǵın dizimge uqsaydı - kortejler dizimler sıyaqlı izbe-izlik bolıp tabıladı, biraq qatarlar sıyaqlı ózgermeytuǵın. Sintaksis jaǵınan olar kvadrat qawsırmalar ornına dóńgelek qawsırmalarda jazıladı hám qálegen tiplerdi, qálegen uyalasıwdı hám ádettegi izbe-izlik operaсiyaların qollaydı:
>>> T = (1, 2, 3, 4) # 4 elementli kortej
>>> len(T) # Uzınlıǵı
4
>>> T + (5, 6) # Biriktiriw
(1, 2, 3, 4, 5, 6)
>>> T[0] # Indekslew, kesiw hám basqalar
1
Kortejlerdiń sonday-aq Python 3.0 da eki tipke tán shaqırılatuǵın metodı bar, biraq dizimlerdegidey kóp emes:
>>> T.index(4) # Kortej metodları: 4 sanı 3-orında jaylasqan
3
>>> T.count(4) # 4 sanı bir ret kezdesedi
1
Kortejlerdiń tiykarǵı ózgesheligi - olar dúzilgennen keyin ózgertilmeydi. Yaǵnıy, olar ózgermeytuǵın izbe-izlikler:
>>> T[0] = 2 # Kortejler ózgermeytuǵın
...qáte tekst jiberildi...
TypeError: 'tuple' obyekti element tayınlawdı qollap-quwatlamaydı
Dizimler hám sózlikler sıyaqlı, kortejler aralas tiplerdi hám uyalasıwdı qollap-quwatlaydı, biraq olar ózgermeytuǵın bolǵanlıqtan, ósip yamasa kishireymeydi:
>>> T = ('spam', 3.0, [11, 22, 33])
>>> T[1]
3.0
>>> T[2][1]
22
>>> T.append(4)
AttributeError: 'tuple' obyektinde 'append' atributı joq
Kortejler ne ushın kerek?
Solay etip, nege dizimge uqsas, biraq az operaсiyalardı qollap-quwatlaytuǵın tip kerek? Ashıǵın aytqanda, kortejler ámeliyatta dizimlerge qaraǵanda siyrek qollanıladı, biraq olardıń ózgermeytuǵınlıǵı - bul olardıń tiykarǵı maqseti. Eger siz obyektler toplamın baǵdarlamańız boyınsha dizim sıpatında jiberseńiz, ol hár jerde ózgertiliwi múmkin; eger kortej qollansańız, ol ózgertilmeydi. Yaǵnıy, kortejler biziń bul jerde jazatuǵınımızdan úlkenirek baǵdarlamalarda qolaylı bolǵan bir túrli pútinlik sheklewin támiyinleydi. Biz kortejler haqqında kitaptıń keyingi bólimlerinde kóbirek sóylesemiz. Házirshe bolsa, sońǵı tiykarǵı ózek tipimizge - faylǵa óteyik.
Fayllar
Fayl obyektleri - bul Python kodınıń siziń kompyuterińizdegi sırtqı fayllar menen baylanısıwınıń tiykarǵı interfeysi. Fayllar - bul tiykarǵı tip, biraq olar biraz ózgeshe - olardı jaratıw ushın arnawlı literal sintaksis joq. Onıń ornına, fayl obyektin jaratıw ushın, siz built-in open funkсiyasın shaqırıp, oǵan sırtqı fayl atın hám proсess rejimin qatar retinde beresiz. Mısalı, tekst shıǵarıw faylın jaratıw ushın, siz onıń atın hám maǵlıwmat jazıw ushın 'w' proсess rejimi qatarın beriwińiz kerek:
>>> f = open('data.txt', 'w') # Shıǵarıw rejiminde jańa fayl jaratıw
>>> f.write('Hello\n') # Oǵan bayt qatarların jazıw
6
>>> f.write('world\n') # Python 3.0-de jazılǵan baytlar sanın qaytaradı
6
>>> f.close() # Shıǵarıw buferlerin diskke jazıw ushın jabıw
Bul aǵımdaǵı papkada fayl jaratadı hám oǵan tekst jazadı (eger sizge kompyuterińizdiń basqa jerinde faylǵa kiriw kerek bolsa, fayl atı tolıq papka jolı bolıwı múmkin). Jańa ǵana jazǵanıńızdı qayta oqıw ushın, fayldı 'r' proсess rejiminde qayta ashıń, bul tekst kirisi ushın - eger shaqırıwda rejimdi kórsetpeseńiz, bul ádepki rejim. Sońınan fayl mazmunın qatarǵa oqıń hám kórsetiń. Fayl mazmunı bárqulla siziń skriptińizde qatar boladı, fayldaǵı maǵlıwmatlar tipine qaramastan:
>>> f = open('data.txt') # 'r' ádepki proсess rejimi
>>> text = f.read() # Pútkil fayldı qatarǵa oqıw
>>> text
'Hello\nworld\n'
>>> print(text) # print basqarıw belgilerin interpretaсiyalaydı
Hello
world
>>> text.split() # Fayl mazmunı bárqulla qatar
['Hello', 'world']
Fayl obyektleriniń basqa metodları bizge bul jerde qarap shıǵıwǵa waqtımız jetpeytuǵın qosımsha múmkinshiliklerdi qollaydı. Mısalı, fayl obyektleri oqıw hám jazıwdıń kóbirek usılların usınadı (read opсiyalıq bayt ólshemin qabıl etedi, readline bir waqıtta bir qatardı oqıydı hám t.b.), sonday-aq basqa qurallar da bar (seek jańa fayl poziсiyasına ótedi). Biraq, keyinirek kóretuǵınımızday, búgingi kúnde fayldı oqıwdıń eń jaqsı usılı - onı hesh oqımaw. Fayllar for cikllarında hám basqa kontekstlerde avtomat túrde qatarma-qatar oqıytuǵın iterator beredi.
Biz fayl metodlarınıń tolıq jıynaǵın bul kitaptıń keyingi bólimlerinde kóremiz, biraq eger siz házir tez kóz juwırtıp shıqqıńız kelse, ashıq faylǵa dir shaqırıwın orınlań hám qaytıp kelgen metod atlarınıń hár qaysısına help shaqırıwın orınlań:
>>> dir(f)
[ ...kóp atlar ótkizip jiberildi...
'buffer', 'close', 'closed', 'encoding', 'errors', 'fileno', 'flush', 'isatty',
'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline',
'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write',
'writelines']
>>> help(f.seek)
...sınap kóriń hám nátiyjesin kóriń...
Kitaptıń keyingi bólimlerinde, Python 3.0-de fayllardıń tekst hám binar maǵlıwmatlar arasında ayqın ayırmashılıq jasaytuǵının kóremiz. Tekst faylları mazmundı qatarlar túrinde kórsetedi hám Unicode kodlaw hám dekodlawdı avtomat túrde orınlaydı, al binar fayllar mazmundı arnawlı bytes qatar túri sıpatında kórsetedi hám fayl mazmunına ózgertiwsiz kiriwge múmkinshilik beredi:
>>> data = open('data.bin', 'rb').read() # Binar fayldı ashıw
>>> data # bytes qatarı binar maǵlıwmatlardı saqlaydı
b'\x00\x00\x00\x07spam\x00\x08'
>>> data[4:8]
b'spam'
Eger siz tek ASCII tekst penen islesetuǵın bolsańız, bul ayırmashılıqqa ulıwma itibar beriwińiz kerek emes, biraq Python 3.0-dıń qatarları hám faylları xalıqaralıq qollanbalar yamasa baytqa baǵdarlanǵan maǵlıwmatlar menen islesetuǵın bolsańız paydalı boladı.
Basqa faylǵa uqsas qurallar
Open funkсiyası Python-da orınlaytuǵın kópshilik fayl qayta islew ushın tiykarǵı qural bolıp tabıladı. Biraq quramalıraq tapsırmalar ushın Python qosımsha faylǵa uqsas qurallar menen keledi: pipes, FIFO-lar, soketler, giltli kiriw faylları, turaqlı obyekt sóreleri, deskriptorǵa tiykarlanǵan fayllar, relyaсiyalıq hám obyektke baǵdarlanǵan maǵlıwmatlar bazası interfeysleri hám taǵı basqalar. Mısalı, deskriptor faylları fayldı qulıplaw hám basqa tómen dárejeli qurallardı qollaydı, al soketler tarmaqlaw hám proсessler aralıq baylanıs ushın interfeys beredi. Biz bul kitapta bul temalardıń kópshiligin qamtıp ótpeymiz, biraq siz Python-da shın mánisinde programmalastırıwdı baslaǵanıńızda olardı paydalı dep tabasız.
Basqa tiykarǵı tipler
Usı 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 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(type(L)) # Hátte tipler de obyektler
# Python 3.0 da:
>>> type(L) # 3.0: tipler klasslar, hám kerisinshe
>>> type(type(L)) # Klass tipleri haqqında kóbirek maǵlıwmat ushın 31-baptı qarań
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.