Knyga/Integruotosios funkcijos

Iš Pitonas.

Integruotosios funkcijos

Integruotosios funkcijos, plačiau žinomos kaip built-in functions, yra pitono interpretatoriuje apibrėžtos funkcijos. Tai yra globaliai prieinamos funkcijos, kurias gali naudoti bet kurioje kodo vietoje, priklausomai nuo tavo poreikių. Šios funkcijos atlieka konkrečius, dažnai naudojamus veiksmus, pvz., tam tikrus aritmetinius veiksmus:

  1. Skaičių sumos suradimą - sum(),
  2. Mažiausios arba didžiausios reikšmės suradimą - min()/max(),
  3. Vidurkio apskaičiavimą - avg().


Šiuo metu pitonas turi 71 integruotąją funkciją, visą jų sąrašą galima rasti čia. Integruotųjų funkcijų sąrašas plečiasi su kiekviena nauja kalbos versija, įtraukiant naujas funkcijas, ir tokiu būdu palengvina programuotojo darbą. Funkcijų yra labai daug ir visų jų nenagrinėsime, tačiau aptarkime jau paminėtas integruotąsias funkcijas.

Skaičių sekos sumos suradimui skirta integruotoji funkcija - sum()

Programuotojui neretai tenka surasti skaičių sekos/pateiktų kintamųjų sumą, tad pitonas pateikia itin paprastą integruotąją funkciją sum(). Ši funkcija atlieka vieną darbą - suskaičiuoja jai paduotų kintamųjų sumą. Funkcija priima du kintamuosius:

  1. Iteruojamo tipo kintamuosius (sąrašai, kolekcijos) kurie savyje saugo skaičius (number tipo kintamuosius).
  2. Pradinį skaičių, t. y. skaičių, prie kurio reikia pridėti sąraše esančių skaičių sumą. Šio skaičiaus reikšmė visada yra 0 (default = 0), jeigu funkcijai nėra paduotas konkretus skaičius, tad jis nėra privalomas kintamasis.
skaičių_sąrašas = [5, 6, 10]

print(sum(skaičių_sąrašas))

Šis kodas į konsolę išves skaičių, esančių skaičių_sąrašas kintamajame, sumą - 21.

skaičių_sąrašas = [5, 6, 10]
pradinis_skaičius = 9

print(sum(skaičių_sąrašas, pradinis_skaičius))

Šis kodas į konsolę išves skaičių, esančių skaičių_sąrašas kintamajame, bei pradinis_skaičius sumą - 30.

Kaip matome, pirmuoju atveju, pradinis_skaičius nebuvo paduotas sum() funkcijai, bet dėl to nekilo problemų, nes nepadavus šio kintamojo, funkcija jį traktuoja kaip 0 ir galutiniame rezultate gauna 0 + 21 = 21.

sum() funkcija veikia tiek su sveikaisiais skaičiais (teigiami, neigiami skaičiai ir nulis), tiek su skaičiais su kableliu:

skaičių_sąrašas = [5, 6, 10.5]

print(sum(skaičių_sąrašas))

Šis kodas į konsolę išves skaičių, esančių skaičių_sąrašas kintamajame, sumą - 21,5. Atkreipk dėmesį, kad dešimtainis skaičius yra su tašku ".", o ne kaip mums įprasta su kableliu ",". Panaudojus kablelį, sąrašas jį supras kaip dar vieną sąrašo elementą, o ne kaip dešimtainį skaičių.

Mažiausios/didžiausios reikšmės suradimas - min()/max() funkcijos

min()/max() funkcijos iš esmės yra vienodos, priima vienodus funkcijos parametrus, skiriasi tik jų grąžinama reikšmė - arba mažiausia, arba didžiausia iš pateiktų kintamųjų. Funkcijos priima skirtigų tipų parametrus:

  1. Iteruojamo tipo kintamuosius - sąrašai, kolekcijos,
  2. Skaičiaus tipo kintamuosius,
  3. Tekstinės eilutės tipo kintamuosius.

Taip pat, funkcijos priima papildomus parametrus, skirtus modifikuoti algoritmą, pagal kurį yra grąžinamos min ir max reikšmės, bet jie nėra būtini. Kaip jau pastebėjote, šios funkcijos priima ir skaičiaus ir tekstinės eilutės tipo kintamuosius ir išveda jų min/max reikšmes.

Skaičių min/max verčių suradimas

Norint surasti skaičiaus min/max vertę min()/max() funkcijoms reikia paduoti kelis kintamuosius su skaičiais arba paduoti sąrašą, kuriame saugomi skaičiai. Skaičiai nėra svarbūs - gali būti ir sveikieji, ir realieji skaičiai.

Pavyzdys su sąrašu:

skaičių_sąrašas = [5, 6, 10]

print(min(skaičių_sąrašas))
print(max(skaičių_sąrašas))

Abi šios funkcijos patikrins sąraše esančius skaičius, juos palygins tarpusavyje ir funkcija min() grąžins mažiausią skaičių - 5, o max() funkcija grąžins didžiausią - 10. min() ir max() funkcijos priima ne tik sąrašus, bet ir pavienius kintamuosius:

skaičius_vienas = 5
skaičius_du = 7.7
skaičius_trys  = -2

print(min(skaičius_vienas, skaičius_du, skaičius_trys))
print(max(skaičius_vienas, skaičius_du, skaičius_trys))

Kaip matome, abi šios funkcijos gali priimti kelis kintamuosius ir lyginti juos tarpusavyje. Kad būtų įdomiau, šį kartą nadojame realiuosius skaičius - neigiamus skaičius bei skaičius su kableliu. Šis kodas, patikrinęs duotus skaičius, min() ir max() funkcijose grąžins atitinkamai mažiausią skaičių - -2 ir didžiausią skaičių - 7.7.

Tekstinės eilutės min/max verčių suradimas

Su skaičių lyginimu, klausimų kaip ir nekyla, bet kaip yra lyginami tekstinės eilutės tipo kintamieji? Teksto eilutės tipo kintamieji lyginami leksikografiškai pagal jų Unikodo (Unikodas (angl. Unicode) – standartas, apibrėžiantis beveik visų kalbų abėcėlių bei papildomų rašto ženklų kodavimą kompiuteriuose) koduotę, t. y. teksto eilutės paverčiamos jų Unikodo išraiška ir lyginamos tarpusavyje.

Teksto eilutės yra lyginamos po vieną simbolį - lyginant "obuolys" ir "bananas" pirmiausia lygina "o" ir "b", tada "b" ir "a" ir t. t. Pirmas unikodo išraiškos nesutapimas nusprendžia, kuri tekstinė eilutė bus "mažesnė" ar "didesnė". Pavyzdžiui, palyginkime žodžius "adata" ir "adyti".

Išsiskaidykime abu žodžius po vieną raidę ir suraskime jų unikodo atitikmenis:

a - 97, a - 97

d - 100, d - 100

a - 97, y - 121

t - 116, t - 116

a - 97, i - 105

Kaip matome, pirmos dvi raidės ("a" ir "d") sutampa abiejuose žodžiuose, analogiškai ir jų unikodo išraiška sutampa. Trečioji raidė jau nebesutampa - "a" ir "y". Raidės "a" unikodo išraiška yra 97, "y" unkodo išraiška - 121. Šis nesutapimas ir nurodo, kad adata, leksikografiniu požiūriu yra "mažesnis" žodis negu adyti - 97 < 121. Verta paminėti ir tai, kad raidžių "A" ir "a" unikodo išraiška skiriasi - lyginat žodžius "Adata" ir "adata", žodis "Adata" būtų "mažesnis" negu "adata", kadangi raidės "A" unikodas yra 65, o raidės "a" - 97.

Analogiškai kaip ir skaičių atveju kintamieji gali būti paduodami kaip tekstinių eilučių sąrašas, arba kaip atskiri kintamieji.

vaisiai = ["obuolys", "bananas", "ananasas"]

print(min(vaisiai))
print(max(vaisiai))

Šiuo atveju sąrašo elementai yra lyginami tarpusavyje ir kodas gražintų mažiausią tekstinę eilutę - "ananasas"(kadangi nesutampa pirmoji visų trijų žodžių raidė, ir raidė "a", turi mažiausią unikodo reikšmę), o didžiausią - "obuolys" (analogiškai raidė "o" turi didžiausią unikodo reikšmę iš trijų).

vaisius_1 = "obuolys"
vaisius_2 = "bananas"
vaisius_3 = "ananasas"

print(min(vaisius_1, vaisius_2, vaisius_3))
print(max(vaisius_1, vaisius_2, vaisius_3))

Šis kodas grąžins analogiškas reikšmes kaip ir aukščiau pateiktas kodas su sąrašu, tiesiog vietoje sąrašo, min() ir max() funkcijoms yra paduodami atskiri kintamieji su tekstinėmis eilutėmis.

Papildomi parametrai

Kadangi aptarėme min() ir max() funkcijas su tekstine eilute, galime gana nesunkiai pasižiūrėti, kaip galime modifikuoti min() ir max() funkcijų algoritmą, pagal kurį yra išvedams mažiausia ar didžiausia vertė. Norėdami modifikuoti algoritmą, turime paduoti funkcijai kintamąjį "key", pagal šį kintamąjį, funkcija nusprendžia pagal kokį algoritmą vertinti pateiktus kintamuosius. Jeigu mes į min() ar max() funkciją paduosime kintamąjį "key = len", mes nurodome funkcijoms, kad pateiktos tekstinės eilutės būtų vertinamos ne pagal jų unikodo išraišką, o pagal jų ilgį:

puodo_formos = ["puodas", "puodelis"]

print(min(puodo_formos, key=len))
print(max(puodo_formos, key=len))

Šiuo atveju kodas nebežiūrės į raidžių unikodo reikšmes, tiesiog skaičiuos, kiek žodžiai turi raidžių - mažiausiai turintis raidžių žodis bus "puodas", daugiausiai - "puodelis". Tačiau yra išimtis, pvz.:

puodo_formos = ["puodas", "puodelis", "puodukas"]

print(min(puodo_formos, key=len))
print(max(puodo_formos, key=len))

Min() atveju kodas grąžins tą patį "puodas", bet kaip bus max() atveju? Tiek "puodelis", tiek "puodukas" turi vienodą raidžių skaičių - 8, tad šiuo atveju kodas grąžina tą teksto eilutę, kuri sąraše yra anksčiausiai. Šiam veikimui neturi įtakos tai, ar paduodamas sąrašas su teksto eilutėmis, ar teksto eilutės paduodamos kaip atskiri kintamieji - tuo atveju, jeigu dvi teksto eilutės yra vienodo ilgio, grąžinama ta, kuri buvo pirmesnė sekoje.