|
Pitonas, kandantis sau uodegą Įvadas Python kalbos idėja kilo 9-ojo dešimtmečio pabaigoje (kaip ABC kalbos įpėdinį) ir jos
realizaciją 1989 m. gruodį Nyderlanduose pradėjo Guido van Rossum. Pats kalbos branduolys
Skelbiama, kad sukūrimo tikslu buvo kodo skaitomumas (gražu geriau nei bjauru; aiškiau nei neaiškiau
ir kitos tezės). Kadangi kodo atitraukimai yra privaloma programos struktūros dalis, tai verčia programas rašyti vieninteliu būdu. Python 2.0 versija pasirodė 2000 m. spalį, o 3.0 2008 m. gruodį. Kalbos struktūra Pabandysime Python kalbą pristatyti keliais labai paprastais pavyzdžiais. Iš jų pajusite pačius kalbos pagrindus, o jau tada galėsime pereiti ir prie sudėtingesnių klausimų. PyPy Pavyzdžių patikrinimui Windows terpėje naudojau PyPy interpretatorių (http://pypy.org). Tai greitas alternatyvus Python interpretatorius (2.7 ir 3.2 versijoms). Jis yra sukurtas naudojant pačią Python kalbą. Jo panaudojimui, pavyzdžių tekstą įrašykite į failą (pvz., labas.py), o tada iškvieskite pypy nurodydami tą failą, pvz.,
Labas, pasauli! Kaip įprasta, kalbos pristatymą pradedame pirmąja programėle, išvedančia pranešimą Labas, pasauli!:
Pastaba: eilutės, prasidedančios diezo ženklu (#), yra komentarai Kintamieji ir operatoriai Kiekvienos kalbos pagrindas yra kintamieji. Python kintamieji aprašomi, kai jiems priskiriamos reikšmės. Pvz. (kabliataškis skiria sakinius),
Atsakymas bus toks, kokio ir tikėjotės: 11 O jei abiem kintamiesiems priskirsime eilutes? Pvz.,
Aišku gausime 56
O jei vienas skaičius, o kitas eilutė? Klaida Python nemoka
automatiškai konvertuoti skirtingų tipų reikšmių! Reikia naudoti tipų konversijos funkcijas, pvz.: Gausime: Jau panaudojoe vieną (sudėties) operatorių. Aritmetiniams veiksmams skirti operatoriai: išves: 3 Pastaba: Priskyrimo operatoriai (=) gali būti išplėsti veiksmo operatoriais (įgaunant prasmę
savo paties su ...: Pvz., ir rezultatas: Veiksmų sekos valdymas Sudėtiniuose sakiniuose vykdomi blokai nurodomi atitraukimais nuo krašto. Tad kitame pavyzdyje (kaip ir tolimesniuose), atitraukimas nėra vien dėl grožio, o yra sudėtinė Python kalbos sintaksės dalis. Sąlygos patikrinimas a = 20
if a > 30:
print("per didelis");
elif a < 0:
print("neigiamas");
else:
print("0..30")
Iteracinis ciklas for a in range(1,3):
print ("a: "+str(a))
rezultatas: Sąlyginis ciklas a = 1
while a < 4:
print ("a: "+str(a))
a += 1
Kaip ir numanote, rezultatas bus identiškas ankstesniam pavyzdžiui. Funkcijos Pasikartojančių veiksmų iškėlimas į atskirus programinius vienetus (funkcijas, procedūras) yra būdingas visoms kalboms. Pademontruosime paprastos funkcijos, išvedančios pasisveikinimo tekstą, pavyzdį: def Pasisveikinimas (vardas):
print("Labas, " + vardas + "!")
Pasisveikinimas ("pasauli")
Eilutės Teksto eilutės yra vienas svarbiausių Python elementų. Su eilutėmis (arba jų
kintamaisiais) galima visa eilė funkcijų: Naudinga yra funkcija len(), gražinanti eilutės ilgį. Taip pat galima nurodyti išpjautą eilutės dalį [p:g], nurodant pradžios ir pabaigos pozicijas (-1 reiškia be paskutinio). Minėtas galimybės iliustruosime šiuo pavyzdžiu: sEilute = "Labas, Pasauli!"
c = sEilute.count("a")
f = sEilute.find ("P")
print (sEilute.lower())
print (sEilute.upper())
print (c, f)
L = len(sEilute)
print (L)
sVardas = sEilute[7:-1]
print (sVardas)
sVardas = sEilute[7:L-1]
print (sVardas)
Rezultatas:
Duomenų tipai Python kalboje baziniai tipai yra loginis, sveikas skaičius, dešimtainis skaičius ir teksto eilutė. Joje viskas (ne tik šie tipai, bet ir didelės duomenų struktūros, funkcijos ar programos) yra tarsi objektai. Objektas tarsi plastikinis dėžė, kurioje laikomi duomenys. Objektas yra tipas, kuris nusako, ką galima daryti su duomenimis, pvz., kokius veikmus, ar tie duomenys gali kisti. Vis tik Python tipai yra griežti, tai reiškia, kad objekto tipas negali būti keičiamas, net jei objekto reikšmė kinta. Norėdami sužinoti objekto tipą, naudokite print (type(produktas)) print (type(555)) Gausime <class 'str'> <class 'int'> class yra objekto aprašas. Skaičiams galima nurodyti skaičiavimo pagrindą: 0b dvejetainį, 0o aštuntainį, 0x šešioliktainį; pvz., dešimtainė reikšmė 18 gali būti užrašyta taip: 0b1010, 0o22, 0x12 Pastaba: skaičių negalima pradėti 0, pvz., 0555 yra klaidinga reikšmė. Taip pat su skaičiais
yra dvi dalybos operacijos: Reikšmės tipo pakeitimui reikia naudoti tipo konvertorių: bool, int, float, str. Pvz., Kas tai yra programavimas? Pradėkime nuo trupučio mistikos ir ją išspręskime. Kaip manote, ką reiškia šios dvi eilutės? Atrodo panašu į kažką techniško, tarsi kokia programa. Iš tikro, tai mezgimo schema (žr. >>>>>), aprašanti, kaip pasukti mezgant kojinės kulną. Daugumai tai visiška mistika, tačiau kai kurioms moterims (ir mezgantiems) aiškiau nei dieną. O dabar paimkite kitą pavyzdį šįkart jo paskirtį atpažinsite iškart: Agrastai, 2,5 kilogramo; medus, 250 gramų; vanduo, šaltinio, 10 litrų; razinos, neplautos, 30 gramų Agrastus sumaigyti, užpilti vandeniu ir užvirinti. Kai atauš, perkošti, įmaišyti medų, įberti razinų ir pastatyti šiltoje vietoje, kad įrūgtų. Kai gira suputos, supilstyti į mažesnius indus, laikyti šaltoje vietoje. Raudonų agrastų gira gausis rausva, geltonų - gelsva, žalių žalsva. Taip tai receptas: produkto sudedamosios dalys ir tada jo paruošimo taisyklės. Mūsų pavyzdyje produktas yra agrastų gira. Tačiau ką šiedu abu pavyzdžiai turi bendra? Visus šiuos dalykus rasite kompiuterinėje programoje. Šį samprotavimą pateikiau tam, kad parodyčiau, kad programavimas nėra kažkas iš kojų verčiančio tereikia išmokti žodžius ir jų naudojimo taisykles. Bet palikime šiuos filosofinius išvedžiojimus ir paimkime tikrąją programą mūsų atveju Python kalba: for atgal in 5, 4, 3, 2, 1, "nulis!":
print(atgal)
Jūs greičiausiai supratote, kad ji pateiks skaičiavimo atgal rezultatus:
5 4 3 2 1 nulis! O dabar pažvelkime į kitą pavyzdį ingredientai = [
"vanduo",
"medus",
"agrastai",
"razinos",
]
print (ingredientai[2])
Galime įsivaizduoti, kad turime recepto ingredientų sąrašą, iš kurio pateikiame vieną pagal jo vietą
masyve. Kadangi numeruoti pradedama 0 (ach taip, žmonės paprastai pradeda skaičiuoti nuo 1, tačiau
kompiuteriai nėra žmonės), tai rezultatas bus Tačiau recepte ingredientai nurodyti kitaip. Tad bandome dar vieną programą:
kiekiai = {
"vanduo" : "10 litrų (šaltinio)",
"medus" : "250 g",
"agrastai" : "2,5 kg",
"razinos": "30 g (neplautos)",
}
produktas = "gira"
print (produktas, " : ", kiekiai[produktas])
Joje Python realiame pasaulyje Bet Python kalba yra tik žaisliukas ar naudingas įrankis? Jis gyvuoja nuo 1991 m. ir yra tarp 10-ies populiariausių kalbų. Ją sutiksite naudojamą
Taigi, tai puiki universalaus naudojimo kalba, leidžianti tą patį sprendimą realizuoti mažesniu eilučių kiekiu. Bet tai nėra panacėja visose situacijose. Ji nebūtinai įdiegta visose aplinkose. Ji pakankamai greita, tačiau gali būti nepakankamai greita ten, kur reikalauja ypatingų greičių. Kalbų palyginimas Parašysime programėlę įvairiomis kalbomis, kuri išveda skaičių ir kažką pasako apie save. Galėsite patys palyginti... Apvalkalo kalbos. #!/bin/sh nulis=0 echo "Skelbiu: $nulis. Aš SH skriptas tik tiek." Jos rezultatas: Senieji kietuoliai C ir C++ yra gana žemo lygio kalbos, naudojamos, kai reikia didelių greičių. Jas
sunkiau išmokti, programos jose linkę smigti, o to priežastį sunku surasti. C kalbos pavyzdys: #include C++ išlaiko C kalbų šeimų panašumą: #include Java ir C# yra C ir C++ išvystymai, siekiant pašalinti kai kuriuos šių trūkumus, tačiau kažkiek
daugžodžiauja ir riboja. Štai Java pavyzdys: public class Overlord {
public static void main (String[] args) {
int nulis = 0;
System.out.format("Skelbiu : %d. Esu Java baisesnė už C!\n", nulis);
}
}
Išskyrus apvalkalo kalbas, kitos minėtos yra vadinamos statinėmis kalbomis, nes reikia nurodyti kai kurias kompiuterio lygio charakteristikas (pvz., duomenų tipus, kurių negalime pakeisti). Jomis parašytas programas speciali kompiliatoriaus programa verčia į mašininę kalbą. Nuo jų skiriasi dinaminės kalbos, kurių programos dažnai vadinamos skriptais - jos nėra kompiliuojamos, o vykdomos interpretatorių (specialių programų). Viena tokių kalbų (nuo senų laikų yra Perl labai galinga ir turinti daugybę bibliotekų, tačiau jos sintaksė kartais gali pasirodyti siaubinga
(gal dėl to kai kurias turėtas nišas ima perleisti Ruby ir Python). Štai pavyzdys: my $nulis = 0; print "Skelbiu : $nulis. Aš Perl, visų kalbų tėvas.\n"; Ruby yra naujesnė kalba, ypač išpopuliarėjusi dėl Ruby on Rails antstato, skirto intraneto
sprendimams. Štai pavyzdys: nulis = 0
puts "Skelbiu : #{nulis}: Ruby, pasirengęs ir įkaitęs."
PHP išpopuliarėjo interneto sprendimuose ir leidžia jungti HTML ir kodą. Tačiau turi daugybę
povandeninių akmenų ir netapo universalia kalba. Štai pavyzdys: <BODY><P>Skelbiu : <?PHP $nulis = 0; echo " $nulis. Aš PHP, ir aš užėmiau internetą.\n"; ?> </P></BODY> Ir pabaigoje Python pavyzdys: nulis = 0
print("Skelbiu : %s. Aš Python ir kaip? % nulis)
Įdomybė racionalūs skaičiai Netikėta, kad Python be sveikųjų, slankiojo kablelio bei kompleksinių skaičių ir turi ir racionaliuosius bei dešimtainius skaičius, palaikomus kaip moduliai. Racionalusis tipas naudoja Bignum aritmetiką, kad išplėstų skaičiavimus su nenurodyto tikslumo trupmenomis aišku, jei jos nekonvertuojamos į realius (t.y slankaus kablelio) skaičius. Racionalų skaičių galima sukurti naudojant konstruktorių: from fractions import Fraction r = Fraction(1, 2) Racionalaus skaičiaus skaitiklį ir vardiklį galite pasiekti naudodami print(r) print ( r.numerator,"/",r.denominator) Abiem atvejais atspausdins 1/2. Tiesa, antruoju atveju atspausdinti elementai atskiriami tarpu, tad norint vienodo rezultato, reikia papildomų pastangų print ( str(r.numerator)+"/"+str(r.denominator)) # arba
print (f"{r.numerator}/{r.denominator}" ) # formatuotas spausdinimas
Išraiška, kurioje yra racionalusis skaičius, skaičiavimas atliekamas kaip su trupmenomis, pvz., rez = r*r print(rez) # atspausdins 1/4 O dabar paimkime gerai žinomą, nors ir neefektyvų p paskaičiavimą naudojant eilutę 4*(1-1/3+1/5-1/7 ... ) ir parašykime programą jos reikšmės spausdinimui (matome, kad konvengyija tikrai lėtai, tik prieš 1000-ąją iteraciją pasiekia 3,14...) pi = 0
k = 1
while k < 1000: # ribojama 1000 iteracijomis
pi += 4 * (-1)**(k+1) * 1 / (2*k-1)
k = k+1
print(k, pi)
Ji parodo priartėjimus slankaus skaičiaus formatu. Ir ją lengva paversti į variantą su trupmeninėmis alternatyvomis: from fractions import Fraction
pi = 0
k = 1
while k < 1000: # ribojama 1000 iteracijomis
pi += 4 * (-1)**(k+1) * Fraction(1 , (2*k-1))
k = k+1
print(k, pi)
Gaila, bet tarp rezultattų nepamatysime gerai žinomos aproksimacijos 22/7 - bet programos tikslas ir nėra
surasti artimas aproksimacijas,,, Tad, jei norite artimos racionalios aproksimacijos, galite panaudoti print(k, pi.limit_denominator(10)) Tačiau ir šiuo atveju teks laukti labai ilgai kitos geros 355/113 aproksimacijos. Dešimtainis skaičių modulis yra standartinės bibliotekos dalis ir ryškus Python skaitinių skaičiavimų gebėjimų išplėtimas, kuris leidžia atlikti slankiojo kablelio aritmetinius veiksmus dešimtainėje sistemoje su reikiamu skaitmenų kiekiu. Tai ypač naudinga finansuose. Trūkumas tik tas, kad jis yra lėtesnis slankiojo kablelio aritmetika. Tačiau jį naudojant, svarbu nesugadinti reikalų dvejetainio slankiojo kablelio problema. Pvz., from decimal import Decimal print(Decimal(1/10)+ Decimal(1/10) + Decimal(1/10)) atspausdina 0.3000000000000000166533453694, kadangi 1/10 prieš tai konvertuojama į slankaus kablelio formatą, o tik po to iš jo verčiama dešimtainiu formatu. Todėl geriau naudoti print(Decimal(1)/Decimal(10) +
Decimal(1)/Decimal(10) +
Decimal(1)/Decimal(10)) # spausdina 0.3
Be to dešimtainio skaičiaus sukūrimui galima naudoti ir print(Decimal("0.1") + Decimal("0.1") + Decimal("0.1")) # spausdina 0.3
Taip pat galima nustatyti ir skaitmenų po kablelio kiekį (o taip pat ir kitus skaičiavimo aspektus) naudojant kontekstą. Nutylint yra 28 skaitmenys, tačiau šį tikslumą galima pakeisti, pvz., į 50: import decimal
ctx = decimal.getcontext()
ctx.prec = 50
arba tiesiog
decimal.getcontext().prec = 50
Python apibrėžia keletą abstrakčių bazinių klasių (ABC), kurias jis vadina skaičių bokštu, kad išreikštų ryšį tarp skirtingų skaičių tipų. Hierarchijos viršuje yra integralinis tipas, kuris iš esmės yra integruotas sveikųjų skaičių tipas. Toliau turime racionalųjį tipą, kuris yra racionaliojo tipo modelis, nors jis nėra integruotas tipas. Tada ateina realusis tipas, kuris iš esmės yra integruotas slankiojo tipo tipas, ir galiausiai kompleksinis tipas, kuris yra integruotas kompleksinis tipas. Kiekviena iš jų yra virtualios klasės, skirtos nurodyto tipo skaičių įgyvendinimui. Dažniausiai šias klases galite ignoruoti, nebent norite sukurti naują skaitinį tipą kažkur tarp jų. Tačiau dabar ties tuo neapsistosime... Darbas su bitais Pitone Python neturi fiksuoto ilgio sveikų skaičių, išskyrus atminties išskyrimą sveiko skaičiaus saugojimui vadinamą bignum, reiškiantį, kad jam skiriama tiek atminties, kiek reikia jo reikšmės saugojimui. Tad su sveikais skaičiais galite atlikti bet kokias operacijas, nesirūpindami, kokio dydžio jie yra (ir kad viršysite leistiną skaičiaus dydį). Kartu tai reiškia, kad turime ir neriboto ilgio bitų sekas, ribojamas tik turimos atminties kiekiu. Pvz., b = 0x123456789ABCD0 print(b) print(hex(b)) print(bin(b)) pateiks 5124095576030416 0x123456789abcd0 0b10010001101000101011001111000100110101011110011010000 Python turi ir 4-ias operacijas darbui su bitais: & (and), | (or), ^ (xor) ir ~ (not). Pvz., a = 0x012345678 b = 0xAAAAAAAAA print(a) print(bin(a&b)) print(bin(a|b)) print(bin(a^b)) print(bin(~a)) print(~a) pateiks 305419896 0b10001000000000001000101000 0b101010111010101111101111111011111010 0b101010111000100111101111110011010010 -0b10010001101000101011001111001 -305419897 Tokia trumpa ši Python kalbos iliustracija. Tikruosi, ji leidžia pajausti šios kalbos pagrindus.... O nuo jų bus galima keliauti ir toliau... Ankstesnės "Advanced HTML" skyrelio temos: | |