33 0 4MB
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Introducere in Programare cu Python
_____________________________________________________________________ 2
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
© Copyright 2021 Ramon Nastase – Toate drepturile rezervate. Continutul acestei carti nu poate fi reprodus, duplicat sau transmis fara permisiunea directa, scrisa din partea autorului. In nici un caz nu va fi suportata raspunderea juridica sau vina de catre editor pentru orice reparare, dauna sau pierderi financiare datorate informatiilor din aceasta carte, direct sau indirect.
Aviz juridic Aceasta carte este protejată prin drepturi de autor. Acest lucru este numai pentru uz personal. Nu puteti modifica, distribui, vinde, utiliza, cita sau parafraza orice parte sau continutul acestei carti fara consimtamantul autorului.
Notificare privind renuntarea la raspundere Retineti ca informatiile continute in acest document sunt numai pentru scopuri educationale si divertisment. Au fost facute toate incercarile de a furniza informații exacte, actualizate si fiabile. Nu sunt exprimate sau implicate garantii de niciun fel. Cititorii recunosc ca autorul nu se angajeaza in furnizarea de consultanta juridica, financiara, medicala sau profesionala. Continutul acestei carti a fost derivat din diverse surse. Prin citirea acestui document, cititorul este de acord ca in nici un caz autorul nu este responsabil pentru orice pierderi, directe sau indirecte, care apar ca urmare a utilizarii informatiilor continute in acest document, inclusiv, dar fara a se limita la omisiuni sau inexactitati.
_____________________________________________________________________ 3
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Cuprins Introducere Cateva cuvinte despre Ramon Nastase, autorul cartii Cateva cuvinte despre Gabriel Grecu, contribuitor al cartii Ce vei obtine de la aceasta carte Cum sa parcurgi aceasta carte Cum sa abordezi partea practica Capitolul 0 - Despre IT si Programare De ce sa inveti programare? Ce oportunitati de angajare ai ca programator? Ce salarii sunt in IT? Cine castiga cele mai mari salarii din IT? “Ce limbaje de programare poti sa inveti pentru a deveni programator?” De ce sa incepi cu programarea in Python? Ce poti face cu limbajul Python? Cum sa aprofundezi programarea folosindu-te de Google? Capitolul 1 - Introducere in Python Cum incepi sa programezi in Python? I. Folosirea unui IDE Online - Repl.it II. Folosirea unei aplicatii IDE - PyCharm III. Folosirea unui interpretor din Windows IV. Folosirea unui interpretor din Linux sau macOS Codul scris in Python vs. alte limbaje de programare Exercitii
12 12 13 13 14 14 17 17 17 18 21 22 24 24 27 29 29 29 33 44 46 51 53
_____________________________________________________________________ 4
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Capitolul 2 - Variabile in Python
Variabile de tip numere (intregi, reale) Operatori in Programare Variabile de tip String (siruri de caractere) in Python Comentarea codului in Python Citirea datelor de la tastatura in Python Capitolul 3 - Instructiuni conditionale (if, for, while) 1) Instructiunea if 2) Instructiunea for 3) Instructiunea while Exercitii Capitolul 4 - Functii in Python
55
55 58 61 68 69 72 72 78 82 84 86
Ce este o Functie? 1) Functii care nu intorc un rezultat 2) Functii care intorc un rezultat 3) Functii recursive 4) Functia main() Exercitii
86 87 89 93 95 97
Capitolul 5 - Structuri de Date in Python
98
Ce sunt structurile de date? 1) Liste 2) Tupluri (Tuples) 3) Multumi (Set) in Python 4) Dictionare
98 100 105 109 114
_____________________________________________________________________ 5
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Capitolul 6 - Programare Orientata pe Obiecte in Python
124
1) Concepte teoretice despre POO 2) Clase in Python 3) Constructori si Destructori 4) Encapsularea elementelor dintr-o clasa in Python 5) Mostenirea (Inheritance) unei clase in Python
124 128 131 135 142
Capitolul 7 - Exceptii si Operatii cu Fisiere in Python I. Exceptii in Python II. Operatii cu Fisiere in Python Chapter 8 - Module in Python Ce sunt modulele si de ce le folosim Exemple de module folosite cu Python a) Modulul “random” (have fun with random numbers) b) Modulul “pillow” pentru procesarea de imagini c) Folosire modul sys & argumentele unui program in Python d) Alte exemple de folosire a modulelor in Python Trimiterea unui mail cu Python Descarcarea unei pagini web cu Python - urllib2 Folosirea unor module precum turtle sau calendar
149 149 158 167 167 167 167 171 175 178 178 180 180
Capitolul 9 - Versionarea codului cu Git si GitHub
184
Ce este Git si GitHub? Cum folosim Git pentru versionarea codului? Cum urcam codul pe GitHub?
184 185 186
_____________________________________________________________________ 6
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Introducere In primul rand vreau sa te felicit si sa iti multumesc pentru faptul ca ai luat decizia de a investi in tine si de a deveni mai bun. Vreau sa iti spun ca acest ghid te va lua de la 0 (in domeniul programarii in Python) si te va duce la un nivel de baza astfel incat sa fii constient de modul in care functioneaza programarea si mai ales modul in care poti crea aceste programe. Am conceput aceasta carte pentru a te ajuta sa inveti programare. Merita sa-i acorzi timpul necesar? Daca tinem cont de noile abilitati pe care le vei avea pe termen lung si de cresterea stimei de sine, atunci acesta unul dintre eforturile pe care merita sa le faci.
Cateva cuvinte despre Ramon Nastase, autorul cartii Ma consider a fi un IT-ist Optimist, pasionat de Educatie. Cred in tehnologie, cred in educatie si in puterea lor de a ne oferi Libertatea, Progresul si Bucuria de a face lucrurile in fiecare zi, de care fiecare dintre noi avem nevoie. Acesta este motivul pentru care eu am ales sa dau o forma simpla si clara, cunostintelor pe care le-am obtinut in ultimii 10 ani si sa le pun intr-un format care sa-i ajute pe cei care doresc o cariera in IT, sa inceapa si sa reuseasca. Sunt trainer, autor si co-fondatorul platformei educationale TeachBit care se axeaza pe formarea si training-ul persoanelor care vor sa-si inceapa o cariera in domeniul IT & Digital. Imi place sa fac IT-ul pe intelesul tuturor. Am fost trainer in corporatie si cunosc cat de important e sa se explice conceptele complicate intr-un mod cat mai simplu si clar. In ultimii 10 ani de cand fac IT am avut ocazia sa: - am instruit personal peste 300 de persoane - sustinut peste 1.000 de ore de training - instruiesc peste 5.000 de cursanti online - particip si sa vorbesc la zeci de conferinte in domeniu - dezvolt o comunitate online de peste 100.000 de oameni
_____________________________________________________________________ 7
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Tot in aceasta perioada mi-am focusat atentia in a obtine cateva certificari de renume din domeniu: Cisco CCNP, CCNA R&S, CCNA Voice, CCNA Security, CompTIA Security+, Linux LPIC-102
Cateva cuvinte despre Gabriel Grecu, contribuitor al cartii Salutare! Gabriel aici, pasionat despre stiinta, despre modul in care lucrurile sunt facute si cum ele functioneaza, cu o gandire analitica si algoritmica cu scopul de a dezvolta, aplica si evolua prin intermediul tehnologiei. Ma poti gasi pe LinkedIn aici. Ne propunem ca acest material sa te ajute in a dobandi cunostintele de start in lumea programarii (cu Python), astfel incat sa ajungi sa realizezi ceea ce ti-ai propus. Mult succes iti dorim!
Ce vei obtine de la aceasta carte Odata ce vei parcurge aceasta carte, vei putea sa intelegi elementele de baza si cele medii care tin de programarea in Python. Practic vei fi capabil sa-ti creezi propriile programe si vei fi pregatit sa incepi sa aprofundezi conceptele de programare. Dupa terminarea cartii iti recomand sa te apuci de rezolvarea problemelor, cu scopul de a te ajuta pe tine sa devii un programator si mai bun astfel incat sa obtii oricand doresti un job in IT (in tara sau in strainatate). Hai sa-ti arat cateva dintre lucrurile pe care le vei invata aici: • Cum arata domeniul IT si care sunt trendurile • Ce poti sa faci cu Python • Cum sa incepi programarea in Python in doar 10 de minute (instalare si crearea primului program) • Elemente de sintaxa si programare in Python • Folosirea instructiunilor conditionale (if, for, while, switch) • Concepte fundamentale despre POO • Lucrul cu fisiere si cu exceptii in Python • Structuri de date folosite pentru crearea diferitilor algoritmi • Si multe altele :)
_____________________________________________________________________ 8
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Un lucru pe care vreau sa-l stii este: daca acum incepi pentru prima oara in IT, aceasta carte este un start destul de bun, oferindu-ti tot ce ai nevoie cand vine vorba de elementele de baza.
Cum sa parcurgi aceasta carte Aceasta carte este structurata pe 9 capitole cu teorie si cu exemple care cuprind diferite teme, apartinand conceptelor de baza din Programare in Python. La finalul fiecarui capitol gasesti un set de exercitii care au scopul de a sprijini abilitatile tale de a scrie cod. Ca sa ramai cu toate informatiile care tin de programare, iti recomand sa parcurgi capitolele pe rand, fara sa sari peste punctele care iti par cunoscute. Spun asta pentru ca am intalnit persoane care intai citeau intreaga carte, iar abia apoi treceau la exercitii. Nu spun ca ar fi o abordare gresita, insa te sfatuiesc sa parcurgi un capitol. Atunci cand intalnesti exemple sau exerciitii, le practici si tu la tine pe PC. Scriind linie cu linie codul de la un exemplu din aceasta carte, vei intelege cat de importanta este atentia la detaliu. Iti propun sa nu treci mai departe pana nu ai inteles complet acel cod si pana nu-l stii scrie si tu fara ajutor. (Atentie, daca doresti sa faci Copy-Paste din carte la cod si doresti sa ii dai direct Run, sunt mari sanse sa nu functioneze. Am facut asta intentionat spentru a incuraja sa scrii codul intreg chiar tu.) Stiu ca vor fi cateva momente in care va trebui sa depui efort in a intelege un concept, de aceea te incurajez ca atunci cand te blochezi, sa folosesti Google Search si sa insisti pe gasirea unei solutii. Stiu ca la scoala nu se incuraja asta, insa aici suntem niste oameni maturi din viata reala si avem nevoie de informatii si de sfaturi folositoare.
Cum sa abordezi partea practica Ti-am explicat deja cum sa treci prin exemplele care vor aparea dupa explicarea unui concept din teorie. Acum hai sa vedem cum sa abordezi partea practica in care tu trebuie sa vii 100% cu rezolvarea: exercitiile de la finalul capitolelor si trei proiecte mari. Le-am ales pentru a te ajuta sa iti exersezi noile cunostinte dupa parcurgerea activa a unui capitol. Ele sunt un punct de plecare prin care iti poti masura progresul pe masura ce parcurgi aceasta carte. Unele dintre ele posibil sa fie putin mai grele fata de ce asteptarile initiale, tocmai pentru a-ti demonstra ca ai o logica pe care o poti dezvolta, ca poti evolua si ca ai inteles cele explicate anterior in capitolul curent.
_____________________________________________________________________ 9
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Ce urmeaza Dupa ce ai terminat aceasta carte, te sfatuiesc sa revii la primul capitol si sa iti alegi o arie pe care vrei sa excelezi. Pe masura ce evoluezi, fii pregatit mereu de un nou upgrade a cunosctintelor tale pentru ca IT-ul este un domeniu in continua evolutie. Tot ce ai tu de facut este sa urmezi pas cu pas informatiile si sfaturile si sa depui efortul necesar pentru a ajunge acolo unde iti doresti. Iti doresc mult succes si spor la treaba! Ramon, cel care te sustine in procesul tau de crestere. PS: Daca ai intrebari nu ezita sa ma contactezi pe email, Facebook sau YouTube.
_____________________________________________________________________ 10
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Capitolul 0 - Despre IT si Programare De ce sa inveti programare? Probabil, aceasta intrebare are deja un raspuns in mintea ta. Fie ca motivul pentru care iti doresti sa inveti programare este un salariu mai bun sau cunostinte noi pe care vrei sa le dobandesti, iti apreciez initiativa. Vreau sa iti doresc mult succes si multa rabdare, pentru ca drumul spre devenirea unui programator bun va fi greu, dar nu imposibil. Iti zic aceste lucruri pentru ca vreau sa fii constient de la inceput ca vei avea anumite obstacole pe care va trebui sa le depasesti. In acest sens vreau sa stii ca voi incerca sa fac tot ce imi sta in putinta ca sa te ajut sa-ti implinesti visul de a avea o cariera de succes in IT. La momentul actual, programarea este unul dintre domenii de activitate cu cea mai rapida rata de dezvoltare. Pentru anul 2011, de exemplu, in Romania activau 9,823 de companii de IT, iar la finele anului 2017 au fost inregistrate peste 17.000 de companii. Privind din perspectiva start-up-urilor, numarul acestora s-a dublat. De la 1.806 de start-up-uri pentru anul 2011, la 3.795 pentru anul 2016. Fie ca iti doresti o cariera intr-o companie multinationala de IT sau start-up, piata din Romania este in continua crestere, iar posibilitatile in domeniul IT sunt nelimitate. Si nici posibilitatea de a lucra in calitate de freelancer nu trebuie exclusa. In mediul online gasesti o multime de site-uri ce fac conexiunea intre cererea de munca (adica proiectele) cu oferta si potentialul de munca a freelancerilor.
Ce oportunitati de angajare ai ca programator? Dupa cum am mentionat si mai sus, totul depinde de ceea ce iti doresti. Fie ca visezi la un job cu program fix sau la un program flexibil de munca din interiorul unei cafenele, oportunitatile sunt nenumarate. Ca sa te fac sa intelegi mai bine despre ce vorbesc, hai sa intram in detalii cu fiecare dintre cele trei optiuni de a-ti exercita activitatea de IT-st. O sa incepem cu multinationalele. O companie multinationala, de regula, este inregistrata in mai multe tari fiind structurata in filiale localizate pe mai multe teritorii nationale sau chiar la nivel global. In continuare iti prezint top-ul multinationalelor in domeniul IT din Romania:
_____________________________________________________________________ 11
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
1. 2. 3. 4. 5.
Adobe - Specializarea: Servicii Software, Web Development. Localitate: Bucuresti. Endava - Specializare: Servicii IT. Localitate: Bucuresti, Iasi, Cluj-Napoca, Pitesti. Luxoft - Specializare: Servicii IT. Localitate: Bucuresti. Atos - Specializare: Servicii IT. Localitate: Bucuresti, Iasi, Timisoara, Brasov. Microsoft - Specializare: Software. Localitate: Bucuresti, Cluj-Napoca, Brasov, Timisoara. 6. Fortech - Specializare: Servicii IT. Localitate: Cluj-Napoca. 7. Ubisoft - Specializare: Gaming. Localitate: Bucuresti. 8. Deutsche Bank - Servicii IT (banking). Localitate: Bucuresti. 9. Ixia - Specializare: Computer & Wireless Networking. Localitate: Bucuresti. 10. 1&1 - Specializare: Servicii Web. Localitate: Bucuresti. 11. eMag - Specializare: E-commerce. Localitate: Bucuresti, Craiova, Iasi. 12. Avira - Specializare: Securitate IT, Localitate: Bucuresti. 13. Intel - Specializare: Servicii Software. Localitate: Bucuresti, galati, Cluj-Napoca. 14. EBS - Specializare: Servicii IT. Localizare: Cluj-Napoca. 15. Oracle - Specializare: Servicii Software. Localizare: Bucuresti. 16. Cegeka - Specializare: Servicii Software. Localizare: Bucuresti. 17. Continental - Specializare: Servicii Software. Localizare: Timisoara, Sibiu, Iasi. 18. Bosch: Specializare: Servicii Software. Localizare: Timisoara, Cluj-Napoca. 19. SAP - Specializare: Servicii Software. Localizare: Bucuresti, Cluj-Napoca, Timisoara. 20. Zitec - Specializare: Aplicatii Online. Localizare: Bucuresti.
Daca privim din perspectiva start-up-urilor, in Romania, exista o multitudine de centre pentru dezvoltare. Ca sa facem lucrurile clare de la inceput, vreau clarificam ce inseamna conceptul de start-up. Cu toate ca exista o multime de definitii, atat tehnice, cat si abstracte ale conceptului de start-up, nu exista o definitie unanima si complet acceptata. Termenul de start-up a luat amploare abia in ultimii ani, cu toate ca este o forma de afacere ce exista de mai multe decenii.
Ce salarii sunt in IT? Fiind intr-o crestere continua, piata de IT din Romania inregistreaza peste 100.000 de angajati pentru anul 2018, de 4 ori mai mult in comparatie cu anul 2008. Salariul de pornire pentru un programator junior intr-o companie mare este circa 3.000 RON/luna. Un programator senior poate avea intre 9.000 - 13.000 RON/luna, designerii intre 4.000 _____________________________________________________________________ 12
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
si 9.000 RON/luna, iar programatorii arhitecti pot castiga intre 13.000 - 20.000 RON/luna. In general cand vine vorba de domeniul IT din Romania salariile se impart pe 3 categorii de nivele profesionale: 1) Junior 2) Middle 3) Senior Daca vrei sa devii un specialist in domeniul IT, un aspect important care iti recomand sa-l ai in vedere este ca in IT se fac bani multi, dar acesti bani se afla in a 3-a categorie. Cand zic “bani multi” ma refer la un salariu de peste 10.000 RON / luna (adica peste 2000 EURO). Odata ce atingi acest nivel salarial poti spune ca ai un trai foarte bun, unul mult peste medie si poti incepe sa-ti folosesti banii pentru a trai viata care ti-o doresti. Avand in vedere cele 3 categorii (de experienta din domeniul IT), iata cam cat poti castiga pentru fiecare nivel in parte: 1) Junior – salariu de 2500 – 4000 RON pe luna cu o experienta de 0 – 2 ani 2) Middle – salariu de 5000 – 8000 RON pe luna cu o experienta de 3 – 5 ani 3) Senior – salariu incepand de la 9000 RON pe luna cu o experienta de peste 6 ani Acestea sunt doar anumite borne orientative, dar te asigur ca sunt oameni care castiga un salariu cu mult peste 20.000 RON (in ROMANIA!) din domeniul IT. De ce? Pentru ca au un nivel de expertiza si experienta foarte ridicat si aduc foarte multa valoare organizatiei. Acum urmeaza sa iti descriu pe scurt care e procesul prin care trece in general o persoana de lever Junior, atunci cand doreste sa se angajeze. Acesti pasi au un scop orientativ, insa stiu ca e foarte probabil sa auzi anumite lucruri pentru prima data. O mare parte dintre persoanele care imi scriu se afla in aceatsa categorie junior (cu experienta mica, intre 0-2 ani). De aceea am decis ca le-ar fi folositor sa detaliez ma jos in cateva punctele cheie pasii prin care vor trece in cazul in care opteaza sa se angajeze:
1. Aplicarea CV-ului - Primul pas este desigur sa iti depui CV-ul prin mediul online, la targurile de job-uri sau chiar printr-o cunostinta care lucreaza deja acolo. Nu uita sa te informezi despre firma cu care urmeaza sa iei contactul. Pregateste si o scrisoare de intentie in care subliniezi de ce doresti sa te angajezi la ei, pe un ton formal.
_____________________________________________________________________ 13
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
2. Testul de logica - Daca esti selectat dupa criteriile folosite de firma, esti contactat pentru un scurt interviu telefonic, urmat de anumite teste de logica la firma. Aici de obicei se pune accentul pe modul de gandire al candidatului. Scopul acestor teste este ca recruiterul sa observe daca ai o baza logica. Unii folosesc chiar anumite jocuri de puzzle, betisoare de plastic sau obiecte de diferite forme care trebuie sa fie aranjate dupa un anumit fel. 3. Testul de personalitate - Daca ai trecut de acestea (poate fi tot si in aceasi zi) are loc un test de personalitate. In acest context cel care te evalueaza este atent la soft-skill-urile pe care le ai. Unele dintre acestea pot fi: atentia la detaliu, rabdarea, perseverenta in gasirea unei solutii, modul de reactie la o situatie descrisa. Pana in acest punct nu se deschide subiectul despre salariul de programator. 4. Proba practica / tehnica - In penultima etapa are loc interviul tehnic, cel de hard-skills. Aici esti testat in adevaratul sens al cuvantului: treci prin testele tehnice (practice) de programare. Problemele primite la acest test au rolul de a verifica daca esti pregatit in zona IT, pentru a ocupa viitorul tau post. 5. Aspectul financiar – viitorul tau salar! - Daca ai ajuns pana aici, esti chemat la ultimul interviu de recrutare: cel in care are loc discutia despre salar si despre beneficiile oferite. Tot aici poti deschide subiectul si despre asteptarile tale. De exemplu poti intreba daca exista optiunea de home office (HO) de cateva ori pe luna, poti afla cum te poti dezvolta mai departe in cadrul firmei si ce career-path (traseu de cariera) poti urma pentru a ajunge pe un post superior.
Iata mai jos o lista cu salarii din domeniul IT pentru anul 2019:
I. II.
http://www.cashit.ro/ https://www.paylab.ro/
_____________________________________________________________________ 14
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Cine castiga cele mai mari salarii din IT? Acum probabil ca te gandesti ca oricine poate castiga un salariu de peste 10.000 RON, in domeniul IT, dar din pacate nu este neaparat asa. Exista anumite job-uri cu specializari care sunt platite mai mult, iar altele care sunt platite mai putin. Pe langa asta, companiile mereu au nevoie de oameni care sunt la curent cu cele mai populare limbaje si cu schimbarile care apar la acestea. Asta inseamna ca dupa ce esti acceptat la o firma de IT si tii pasul cu cererea de pe rolul pe care il ocupi, ai si posibilitatea de a-ti dezvolta o cariera spre beneficiul tau. De exemplu un software tester (o persoana care face testeaza software-ul creat de catre echipa de developeri), indiferent de nivelul sau de experienta, va avea un salariu mai mic fata de un software developer (o persoana care dezvolta activ software pentru compania la care este angajat). De aceea, este foarte important sa studiezi trendurile din domeniul IT, sa vezi ce tehnologii (si ce limbaje de programare) sunt in top (sau urmeaza sa fie in urmatorii ani) si sa incepi sa le studiezi. Astfel ajungi sa iti aprofundezi cunostintele si abilitatile in acea directie. Pe terment lung, vei avea beneficii extrem de mari, crede-ma. Iata mai jos un tabel cu salariile din domeniul IT din Bucuresti in functie de nivelul de experienta pentru mai multe posturi in parte. Daca locuiesti in afara Bucurestiului, atunci salarile din IT pot varia cu 10 – 20% in functie de zona in care te afli.
Figura 0.1 _____________________________________________________________________ 15
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
“Ce limbaje de programare poti sa inveti pentru a deveni programator?” Primesc foarte des aceasta intrebare si consider ca si acum e un moment bun pentru a raspunde la ea. Pe scurt raspunsul e … depinde. Depinde de ce iti doresti, depinde de ce anume te pasioneaza atunci cand vine vorba de IT si depinde pe ce ramura vrei tu sa dezvolti mai departe programe si aplicatii. Important de retinut este ca experienta nu consta in numarul de limbaje cunoscute, ci mai de graba in cunostintele acumulate in cadrul fiecarui limbaj de programare cunoscut, in parte. O intrebare des intalnita inainte de inceperea parcurgerii unui limbaj este urmatoarea: “Am nevoie de matematica in programare?”, raspunsul la aceasta intrebare este unul impartit. O intrebare auxiliara care trebuie adresata este, “Ce vrei sa faci cu limbajul pe care urmeaza sa il utilizezi?”. Daca vrei sa lucrezi ca Web Developer si va trebui sa folosesti limbajele din aceasta speta, cel mai probabil nu, dar daca vei lucra pe post de Machine Learning Expert, atunci probabil te vei lovi ceva mai mult de matematica. In orice caz, important este sa nu te lasi descurajat de matematica. Un limbaj de programare poate fi invatat si fara aceasta, iar rolul ei nu este esential, mai ales in primii pasi. Pe langa toate acestea, nu exista un limbaj “nefolositor”. Fiecare limbaj are rolul sau si este adaptat pentru un anumit set de nevoi si cerinte. Acum hai sa vedem ce limbaj de programare poti sa inveti, in functie de ce iti doresti sa faci pe termen lung:
● C / C++ – Limbaje perfecte pentru proiecte low-level, des intalnite in reprogramarea sistemului de operare si utilizate de placutele Arduino, pentru diferite proiecte de automatizare si de robotica. C este un limbaj de programare folosit in proiectele low-level, fiind orientat pe hardware. Este des intalnit in reprogramarea sistemului de operare si utilizate de placutele Arduino (sunt niste placute de dezvoltare bazate pe microcontrolere), pentru diferite proiecte de automatizare / robotica. Avantajul este ca permite gestionarea memoriei la cel mai mic nivel. Daca vrei sa lucrezi in game development sau in programarea sistemelor (systems programming), C este limbajul recomandat. C este limbajul pe care se bazeaza alte zeci de limbaje, fiind folosit in crearea acestora. Chiar si Java, Javascript si multe altele se afla printre ele. Poate ai auzit deja ca limbajul C este un limbaj procedural, versatil si flexibil, mai simplu spus programatorul are prin el control maxim prin comenzi simple. Totusi, daca esti la inceput, o sa ai de lucru daca doresti ca primul tau limbaj invatat sa fie C. _____________________________________________________________________ 16
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
● HTML + CSS + JavaScript – Un combo excelent pentru realizarea de pagini web statice. Cel mai popular framework care include aceste limbaje de marcare este Bootstrap, un framework dezvoltat de catre creatorii platformei Twitter. JavaScript introduce un element de dinamica si varietate intr-o pagina web care (in momentul incarcarii) este rulata direct de catre browser. Il poti folosi pentru a contrui site-uri interactive, mai ales daca ti-ai propus sa intri pe web development. Ca sa fiu mai precis, JavaScript e folosit de obicei pentru front-end development, fiind usor de invatat de catre incepatori. Aceste cunostinte se imbina cu cele de HTML si CSS, pentru un site functional si complet. Daca te-ai gandit ca ai invata JavaScript, am o veste buna. Este usor de folosit, codul il poti schimba usor, rezultatele codului se vad imediat, iar aici nu e necesar sa instalezi ceva in plus pe laptopul tau, ajunge un web browser. ● PHP – Realizarea Backend-ului pentru o pagina web interactiva, limbaj intalnit si in inlocuirea Shell Script-ului pe Linux. Doua dintre framework-urile populare pentru acest limbaj sunt Laravel si Symfony, de asemenea PHP-ul este adesea folosit impreauna cu SQL-ul, limbaj folosit in programarea bazelor de date. ● Java / C# / Swift – Limbaje destinate aplicatiilor mobile pentru Android, Microsoft sau Apple. De exemplu Java este un limbaj de programare foarte cunoscut si des utilizat, fiind un limbaj orientat pe obiecte. Daca ai auzit despre Android, atunci trebuie sa stii ca acest sistem de operare este construit in Java. Astfel, aplicatiile mobile si diferite programe (pentru continutul web) sunt create in Java. Mai exact, aplicatiile enterprise, interfetele si platformele web pot fi construite folosind acest limbaj de programare. ● Python, Perl, Ruby – Aceste trei limbaje, sunt catalogate ca limbaje de scripting, deoarece sunt cel mai des intalnite in automatizari. Ultimul dintre acestea, Ruby, poate fi folosit ca inlocuitor al PHP-ului, prin framework-ul Ruby on Rails, destinat Web Developing-ului. Python - Acest limbaj de programare este catalogat ca fiind un limbaj de scripting, deoarece este foarte des intalnit in automatizari. Asta explica de ce este unul dintre cele mai cautate si cele mai utilizate limbaje de programare, care inca este in trend ascendent. Cu Python mai poti programa roboti, poate au auzit deja ca in ultima vreme e tot mai cunoscut, fiind folosit si in inteligenta artificiala (AI). Il mai poti folosi pentru a construi platforme web, dar si pentru a construi interfete grafice (GUI). Python este un limbaj usor de folosit si de invatat, avand putine particularitati, iar flexibilitatea de a scrie codul cu el il face extrem de popular. _____________________________________________________________________ 17
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Cele de mai sus sunt cele mai populare din sutele de limbaje de programare existente. Unele din aceste limbaje sunt compilate (C/C++/C#). La acestea este nevoie de un compilator. Altele sunt interpretate (Python, PHP, Perl), unde sistemul citeste linie cu linie cdul, pentru a pune in aplicare instructiunile. Cel mai important este sa iti alegi un limbaj care se potriveste cu nevoile tale, apoi sa incepi sa il practici si sa il cunosti cat mai bine. In cele ce urmeaza vom studia in detaliu limbajul Python si iti voi explica pas cu pas cum sa-l setezi la tine pe laptop si cum sa te apuci in doar cateva minute de programare.
De ce sa incepi cu programarea in Python? Avantajul limbajului Python este ca ea ofera foarte multa flexibilitate din partea programatorului. In comparatie cu C++, care necesita multe linii de cod pentru a executa o singura comanda, Python necesita o singura linie. De asemenea, programare in Python se face la fel, indiferent de sistemul de operare (Windows, Linux). Toate acestea te ajuta sa te axezi pe logica problemei, pe algoritmul construit de tine, scazand sansele de a face greseli de sintaxa. Recomand ca acest limbaj sa fie printre primele limbaje de programare pe care tu le inveti, tocmai pentru ca face trecerea de la teorie la practica fara a te obliga sa insisti pe primul element (teoria :D). Odata ce ai scris un program in Python, atunci cand il recitesti, iti dai imediat seama despre ce a fost vorba in problema, ceea ce e vital atunci cand inveti bazele programarii. Te vei putea axa pe logica solutiei, evitand analiza complexitatii codului in sine. Studiind intens acest limbaj intuitiv si usor de inteles, poti ajunge programator in Python.
Ce poti face cu limbajul Python? Ca sa incepem cu ce este mai simplu, vom vorbi despre un limbaj de programare pe cat de popular, pe atat de simplu. Si anume, Python. Apropo, stiai ca pana si Netflix sau Instagram foloseste limbajul de programare in Python? Nu glumesc. Compania Netflix a detaliat ca foloseste acest limbaj de programare de la operatiunile de management si analiza, pana la securitate si retea. Python este un limbaj excelent pentru cei care sunt la inceput cu programarea si vor sa faca primii pasi. Dar te rog sa nu subestimezi puterea si utilitatea acestui limbaj. El este extrem de folosit in zilele noastre, cu o sintaxa usoara si cu o flexibilitate in a scrie codul, cu mult peste fata de alte limbaje cunoscute (Java, C++, JavaScript, etc). Marea intrebare este ce poti face cu acest limbaj de programare? Python, fiind un limbaj interpretat, are un avantajul fata de limbajele compilate, tip C/C++, deoarece necesita mai putin cod _____________________________________________________________________ 18
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
pentru a realiza anumite instructiuni. Python este un limbaj de programare cheie atunci cand vine vorba de dezvoltarea si testarea sistemelor automotive (ex: parcare inteligenta, scaderea riscului de accidente la depasiri, semnalarea si evitarea obstacolelor pe timp de noapte). Urmand explicatiile din aceasta carte de Introducere in Python, vei invata sa gandesti cursiv in acest limbaj de programare prin rezolvarea unor probleme intuitive care iti vor dezvolta logica si te vor ajuta sa inveti Python pe parcurs. Google, alaturi de un pix si o foaie sunt cei mai buni prieteni ai unui programator. Asa ca nu trebuie sa iti fie frica sa cauti pe Google moduri de rezolvare, dar nu trebuie sa cauti raspunsul direct, asterne-ti pe o foaie ideile tale de rezolvare, si incearca sa transpui acele idei in cod, vei reusi sa observi problemele mult mai repede in acest fel, si de asemenea, iti vei dezvolta gandirea logica. Totusi, nu uita ca acest limbaj este unul puternic, folosit in multe arii si dispune de numeroase biblioteci. Python este unul dintre cele mai cunoscute si cele mai practice limbaje de programare, fapt care il incadreaza in topul limbajelor de prezent si de viitor. Foarte multe tehnologii folosesc Python tocmai pentru ca e accesibil, lumea intreaga gaseste diferite “inventii” prin care se poate bucura de flexibilitatea lui. Poate ai auzit de testare in general. Acesta este un procedeu de verificare prin care nu doar calitatea produsului software sau hardware poate fi cunoscuta, ci se pot gasi si diferite functii anormale ale unui produs. Un exemplu simplu ar fi apasarea unui buton de pe un aparat de cafea, care, in loc sa iti faca o cafea dubla, face o cafea scurta (asta daca eliminam alte posibilitati a functionalitatii defectuoase). Testarea este atat de vasta, incat fara Python ar fi greu de rulat anumite programe pe un produs ce urmeaza sa fie lansata pe piata. Gandeste-te de exemplu la domeniul automotive. Poate ai stat intr-o masina care are sistem de identificare a imaginilor. Atunci cand acesta detecteaza un obstacol (unul real, de exemplu un om pe carosabil), activeaza sistemul de franare a masinii, astfel evitand producerea unui accident. Sunt mari sanse ca anumite functii cheie ale acelui sistem sa fi fost testate in Python, unele teste au rulat zile intregi, iar altele au fost rulate de zeci de mii de ori. Un alt exemplu, mai simplu decat aceasta este urmatorul, cunoscand Python (si folosind cateva fire si microfon), poti sa analizezi datele captate in urma detectarii sunetelor de catre microfon, poti inregistra datele si apoi le poti cripta intr-un fisier. Despre robotei nici nu mai deschid subiectul, pur si simplu sunt prea multe de spus. Python e ca o usa care iti deschide multe alte usi, atata timp cat inveti bine bazele si continui cu nivelul intermediar. Avantajul tau, cel care inveti programare incepand chiar cu limbajul Python, este ca vei depune mult mai putin efort pentru a invata bazele, in comparatie cu alte limbaje de programare. Fiind un limbaj intuitiv, da impresia
_____________________________________________________________________ 19
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
ca scrii ceea ce logica iti dicteaza, fara a-ti mai face griji pentru spatii, linii, lipsa unei bilbioteci, etc.. Ariile in care limbajul Python este des intalnit sunt cele de:
● Automatizare - Aceasta este des intalnita in partea de retelistica prin scripturi pentru administrarea a mai multe device-uri. ● Cyber-Security - Python ajuta la principiile de Pen-Testing prin realizarea automata de diferite atacuri asupra unui target. ● Web Development - Aici Python poate fi utilizat cu ajutorul framework-urilor precum Pyramid sau Django pentru realizarea Backend-ului unui website. ● Quality Assurance (Controlul Calitatii) - Poate fi realizata testarea modulelor software ce urmeaza sa fie lansate pe piata, in vederea functionarii corecte si a vulnerabilitatii feature-urilor. ● GUI (Graphical User Interface) - In Python pot fi create meniuri interactive pentru diferite programe. Un program foarte cunoscut pentru simularea retelelor creat in Python este GNS3. ● Embedded si Internet of Things - Un bun exemplu sunt placutele de tip Raspberry Pi si programarea senzorilor si sistemelor de securitate din industria automotiva.
In capitolele ce vor urma, iti voi prezenta cat mai multe din aceste arii ca sa le exploram impreuna. Exista numeroase domenii care cer cunostinte de Python. De ce oare? Python are una dintre cele mai mari procente de crestere in ultimii ani. Ca sa iti insir cateva motive bune, cu Python poti face: • Programarea robotilor • Programare in Arduino • Build-uirea unor aplicatii web (pe Django sau Flask) • Creare de web scraper (scripturi care culeg date de pe site-uri, scanand paginile unui site sau mai mai multor site-uri) • Analiza de statistici • Sisteme automate • Manipulare de imagini (folosit mai ales in automotive) • Manipularea de sunete si de texte. _____________________________________________________________________ 20
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Din cate poti vedea, acest limbaj il poti folosi atat daca iti place hardware, cat si software. Multi programatori au inceput initial cu Python pentru ca e un limbaj simplu de invatat, intuitiv, dupa care au ramas pe acesta, l-au studiat intens si s-au specializat pe o nisa bine definita, in domeniul in care ei au lucrat.
Cum sa aprofundezi programarea folosindu-te de Google? In acesta sectiune vom discuta despre Google si cum poate acesta sa te dezvolte pe tine ca si programator. Un skill foarte important pentru majoritatea celor care lucreaza in domeniul IT este sa cunoasca metode de rezolvare a problemelor si cel mai important, sa stie ce sa caute. Este foarte important sa stii ce cauti pentru o rezolvare mai rapida a problemei iar Google este unul dintre cei mai buni prieteni ai omului cand vine vorba de rezolvarea problemei. Nu trebuie sa te temi sa iti cauti problema si sa iti spui ca un "programator adevarat" isi rezolva singur problemele, deoarece aceasta este o conceptie gresita si trebuie eliminata, de ce trebuie sa treci prin aceeasi pasi pentru a rezolva o problema daca un om a facut deja treaba grea pentru tine. Cel mai mare avantaj al Internetului este ca prin el putem afla multe raspunsuri care devin solutii pentru problemele noastre. Google aici face partea “magica” de cautare. Acum e timpul sa iti spun si tie cum abordez eu si cum te sfatuiesc si pe tine sa abordezi o anumita situatie: 1. “Nu stiu ceva?” 2. “Caut pe Google punand intrebarea (keyword-urile corecte) – how to X.” 3. “Gasesc ceea ce ma ajuta. O aplic.” Done
🙂
Frumusetea in cursurile de programare e ca poti invata logic fara a toci si fara a memora exact totul. Ideea principala e ca Google are toate raspunsurile. Aici e fix invers in comparatie cu scoala: daca auzim “nu cautati pe Internet”, aici in programare tocmai acesta e skill-ul necesar. Nu exista programator care sa nu foloseasca Google de zeci si chiar de sute de ori pe zi, nici in firmele mai mici si nici in corporatii. In cazul nostru putem spune ca orice nu cunosti in Python are o solutie pe Internet. El este si un limbaj accesibil, usor de descifrat chiar si la prima vedere si folosit de un numar considerabil de programatori din toate domeniile. Ce se intampla de exemplu daca doresti sa lucrezi cu listele in Python? Sa spunem ca nu cunosti in detaliu proprietatile listelor si cum poti accesa o valoare din ele. Scrii pe Google un “how to access values in lists” (sau ceva relevant pentru problema ta; daca nu stii engleza la acest nivel begginer, nu-i nici o problema, foloseste Google Translate) si iti vor aparea o gramada de solutii. _____________________________________________________________________ 21
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Google constituie o librarie enorma de documentatie pentru limbajele de programare existente si cu siguranta te va ajuta sa te dezvolti pe plan profesional asa cum m-a ajutat si pe mine. Nimic nu trebuie invatat pe de rost, totul merge pe logica in programare, iar astazi ti-am explicat in detaliu ce trebuie sa faci pentru a intelege mai bine acest lucru. Ai vazut si un exemplu despre o cautare bine structurata pe Google si despre ce indicii cheie trebuie sa introduci pentru a reusi sa gasesti ceea ce iti doresti. In continuare iti voi da sfaturi si despre ce platforme de rezolvare a problemelor sa incerci prima oara pentru a gasi o solutie mai rapida si pertinenta impedimentului tau. Important este in ziua de azi sa poti sa fii cat mai independent si sa gasesti singur rezolvare la obstacolele tale fara a astepta ajutor din partea celorlalti. Asta te va ajuta sa te dezvolti pe tine si iti va oferii un avantaj in fata celorlalti competitori din industrie. Sunt multe site-uri care contin si explicatii si chiar exemple de cod. Ce recomand eu personal sunt: • https://stackoverflow.com – un site pentru comunitatea de developeri, care share-uiesc intre ei cunostintele de programare, is gasesc greselile sau chiar optimizarile unei secvente de cod. Practic, unii dintre ei chiar il folosesc 80% din timpul de lucru atunci cand scriu cod la serviciu. Conform surselor din https://insights.stackoverflow.com/survey/2017, peste 40 de milioane de programatori, studenti, angajati si freelanceri, viziteaza aceasta platforma in fiecare luna, iar in 2017 Python a fost cel mai dorit limbaj de catre programatori. • https://www.tutorialspoint.com – e un site care iti arata cum sa programezi unele lucruri de la zero, te ajuta daca esti blocat pe ceva peste care nu stii cum sa treci, explicand in detaliu, teoretic, fiecare notiune dintr-un limbaj de programare. Bineinteles ca exista multe alte site-uri de unde poti gasi raspunsurile. Tot ce trebuie sa faci este sa cauti pe Google, adresand intrebarea corect. Ce iti recomand este sa treci la treaba (asta daca nu ai facut-o deja) si sa incepi sa aplici ceea ce am studiat in acest capitol, rezolvand exercitiile din sectiunile urmatoare.
_____________________________________________________________________ 22
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Capitolul 1 - Introducere in Python In primul capitol mi-am propus sa te ajut sa intelegi din discutiile despre Python de ce inveti acest limbaj. Vei vedea de ce setari ai nevoie pentru a-ti rula primul program scris in Python. Incepand de aici, la finalul fiecarui capitol vei gasi cate un set de exercitii, care te ajuta sa asimilezi si sa iti dezvolti logica si tehnica proprie de “problem-solving”. Prin asta iti vei imbunatati cunostintele practice de programare (pentru ca, probabil stii si tu, teoria poate uneori e greu de invatat, insa la practica se vede intr-adevar cat progresezi). Da, stiu ca tocmai citesti o carte, deci focusul principal este pe teorie, de aceea facand exemplele (chiar in mediul tau din PC) si prin diferite exercitii care vor fi la finalul fiecarui capitol (si pe care te rog sa le parcuri si sa le rezolvi), vei invata si practic bazele limbajului Python. Hai sa trecem la treaba!
Cum incepi sa programezi in Python? Presupun ca esti nerabdator sa incepi sa programezi. Pentru a incepe sa programam in Python, avem nevoie de un program special, denumit IDE (Integrated development environment) care reprezinta un mediu de dezvoltare al programelor. Putem folosi un astfel de IDE in mai multe moduri: • Interpretor - aplicatie instalata pe laptop/PC si folosita printr-un terminal • Online - printr-o aplicatie cloud - exemplu Repl.it • Aplicatie instalat pe PC/laptop - exemplu PyCharm In sectiunile urmatoare iti voi prezenta ambele variante, iar tu decizi cea pe care o vei folosi. Scopul este sa alegi una dintre cele 3 variante de mai sus astfel incat sa faci scrierea codului tau cat mai rapida si mai usoara.
I. Folosirea unui IDE Online - Repl.it Vom incepe cu cea mai simpla si rapida metoda pentru a incepe sa scriem codul in Python, folosind un IDE online. IDE-ul pe care ti-l recomand se numeste Repl.it si il poti accesa apasand AICI (https://replit.com). Iti recomand sa-ti faci un cont pe site-ul lor, dupa care, odata logat la ei in platforma te vei regasi in situatia din figura 1.1:
_____________________________________________________________________ 23
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.1 Apasa pe butonul “new repl.it” din partea de sus (butonul albastru). Creaza-ti un proiect, selectand Python ca limbaj de programare. Ofera un nume proiectului tau si apasa pe butonul de creare. Acum, proiectul fiind creat, ti se va deschide o fereastra unde vei putea scrie codul. Partea din stanga este rezervata ierarhiei de fisiere (in viitor probabil vei avea mai multe fisiere care vor contine cod), la mijloc va fi locul unde vei scrie codul, iar in partea din dreapta va aparea rezultatul odata ce rulezi codul (apasand pe butonul RUN, de sus).
_____________________________________________________________________ 24
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.2
Prima linie de cod in Python Si acum a sosit momentul sa trecem la treaba si sa scriem prima linie de cod in Python. Vom folosi un exemplu clasic, extrem de intalnit in programare, pe care il poti vedea mai jos: print("Hello World")
Click pe run, iar rezultatul afisat va fi: Hello World
Acest lucru poti vedea si in figura 1.3 de mai jos (codul in partea din stanga, iar rezultatul in partea din dreapta):
_____________________________________________________________________ 25
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.3 De acum inainte ai tot ce-ti trebuie sa scrii cod. Folosind acest IDE online iti va fi extrem de usor sa inveti programare rapid si usor. Pe termen lung, cand vei dori sa creezi proiecte mai complexe care implica mai multe fisiere, module si framework-uri, iti recomand sa folosesti varianta #2 despre care vom discuta in sectiunea urmatoare.
_____________________________________________________________________ 26
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
II. Folosirea unei aplicatii IDE - PyCharm In aceasta sectiune iti voi arata cum sa folosesti un IDE (local - pe laptop sau PC) pentru a programare in Python. IDE-ul pe care ti-l recomand eu se numeste PyCharm si il poti descarca de AICI (http://www.jetbrains.com/pycharm). Iti recomand sa alegi varianta Community pentru ca aceea este gratuita.
Cum instalez si cum pornesc PyCharm? Odata ce ai reusit sa descarci PyCharm, te poti apuca de instalare. Incepi prin a da dublu click pe executabilul descarcat, iar apoi treci prin procesul de instalare care este destul de simplu si intuitiv. La pornirea chitului de instalare vei intampina o fereastra similara cu cea din figura de mai jos:
Figura 1.4 Mai departe vei avea de facut cateva setari mici, asadar te invit sa urmaresti figurile 1.3, si 1.4 de mai jos si sa bifezi casutele exact asa cum vezi in imagini:
_____________________________________________________________________ 27
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.5
Figura 1.6
_____________________________________________________________________ 28
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Pe parcurs PyCharm te va intreba daca doresti sa instalezi anumite plugin-uri. Deocamdata poti sa treci peste si poti sa dai skip, deoarece acelea nu sunt necesare in aceasta faza. In figura de mai jos iti poti alege tema pe care o doresti de la IDE-ul tau. Eu personal am mers pe cea inchisa (aka. “Darcula”), dar tu decizi cea pe care o doresti:
Figura 1.7
_____________________________________________________________________ 29
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Cum creezi un proiect in PyCharm? Odata ce instalarea a avut loc este timpul sa pornesti PyCharm si sa iti creezi primul proiect (vezi figura 1.8) astfel incat sa poti coda in Python:
Figura 1.8 Acum urmatorul lucru pe care il vom face este sa cream un proiect nou (sau sa deschidem unul deja existent). Vei merge la “Create New Project”, unde poti vedea ca ai mai multe optiuni. Ceea ce tu vei face este sa creezi un proiect in care vei pune codul tau. Dar nu vei pune acolo cod pur si simplu. Python functioneaza in felul urmator, ai nevoie de un proiect (gandeste-te la acest proiect ca la un folder), dupa care ai module (in acest proiect - aka. fisierele proiectului cu terminatia .py). Acestea contin codul pe care tu il vei scrie pentru ca programul sa indeplineasca scopul dorit.
_____________________________________________________________________ 30
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.9 Creeaza proiectul si ofera-i o denumire specifica cu ce urmeaza sa faci in el. In cazul acesta, eu am ales denumirea “PrimulProiect”. Acum se va deschide fereastra default, a proiectului curent, dupa cum poti vedea in figura de mai jos:
_____________________________________________________________________ 31
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.10 Odata ce am creat primul nostru proiect, urmeaza sa cream fisierul in care vom scrie codul sursa. Acest procedeu il poti vedea in cele doua figuri de mai jos:
_____________________________________________________________________ 32
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.11
Figura 1.12 Acum te afli in locul in care poti incepe sa scrii cod in Python, in IDE-ul PyCharm. Hai sa vedem in sectiunea urmatoare cum arata acest cod si cum il poti executa. _____________________________________________________________________ 33
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Primele linii de cod in PyCharm Odata ce setupul de baza al PyCharm-ului a avut loc, tot ce trebuie sa facem mai departe este sa incepem sa scriem cod. Reluam codul de baza pe care l-am scris si mai devreme. print("Hello World")
Dupa asta trebuie sa apesi din bara meniului de sus “Run”, apoi pe butonul verde de “Run”, care va interpreta si va rula programul pe care l-ai creat (vezi in figura 1.13 de mai jos).
Figura 1.13 Dupa aceea te va pune sa selectezi fisierul pe care doresti sa-l rulezi (figura 1.14). Il selectezi, iar apoi in consola se va afisa rezultatul in urma executarii codului (figura 1.15).
_____________________________________________________________________ 34
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.14
Figura 1.15 In secventa de cod de mai jos am folosit de 3 ori functia print si vreau sa te uiti putin la rezultatul afisat. Dupa cum poti sa vezi textul este afisat de 2 ori, de fiecare data pe un rand nou (vezi figura 1.16). Acest lucru este important pentru ca Python face asta by default prin aceasta functie. Alte limbaje de programare (precum C sau C++) nu fac acest lucru si vor scrie intregul text pe o singura linie. De ce este acest lucru important? Vei vedea in sectiunea cu exercitii. _____________________________________________________________________ 35
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
print("Hello World!") print() print("Text2")
Rezultatul afisat: Hello World Text2
Figura 1.16 Iata mai jos o lista cu beneficiile majore care ti le ofera un astfel de IDE: • Organizeaza mai buna a codului • Are feature de auto-complete si sugestii de utilizare a functiilor si a claselor • Identifica rapid greselile de sintaxa aparute in cod • Usureaza adaugarea de framework-uri si module noi •Are posibilitatea integratii aplicatiei cu Git & GitHub pentru versionarea codului. _____________________________________________________________________ 36
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Totodata, in timp ce ai scris acest cod cu functia print, banuiesc ca ai descoperit si feature-ul de autocomplete al lui PyCharm. Este un feature pe care eu il consider extrem de util si care iti va salva mult timp pe masura ce vei incepe sa-ti creezi propriile programe si proiecte, precum si la job. Vei vedea pe parcurs ce inveti sa programezi mai bine si faci mai mult cat de util iti va fi. Astfel poti programa mult mai usor fara a avea nevoie de cunostinte legate de sintaxa exacta a liniei de cod. Python si PyCharm ne permit sa facem astfel de lucruri.
Figura 1.17
_____________________________________________________________________ 37
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
III. Folosirea unui interpretor din Windows Daca folosesti Windows, iti poti instala Python descarcand de pe python.org (https://www.python.org/downloads/windows/) executabilul cu versiunea 3.6 (sau orice alta versiune mai noua doresti). Urmatorul pas este sa-l instalezi si sa-l pornesti. Python este acum instalat si iti recomand sa folosesti functia Search din Windows si sa-l pornesti pentru a putea incepe sa scrii cod in interpretor:
Figura 1.18 Odata pornita consola, putem scrie mai multe linii de cod care vor fi rulate odata ce apasam Enter. Iata mai jos un exemplu concret care contine si cateva elemente pe care le vom studia in capitolele urmatoare:
_____________________________________________________________________ 38
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.19 Dezvantajul principal in cazul folosirii unui interpretor consta in faptul ca, codul tau nu va fi salvat, ceea ce inseamna ca nu il vei putea refolosi. Aici intervin scripturile (asa cum vei vedea in sectiunea urmatoare), ca o alternativa excelenta si, bineinteles, programele scrise in cadrul unui IDE.
_____________________________________________________________________ 39
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
IV. Folosirea unui interpretor din Linux sau macOS Un alt mod prin care poti face programare in Python este prin folosirea unui terminal (pe Linux sau macOS). In aceasta sectiune iti voi arata cum iti poti folosi terminalul pentru a scrie cod in Python. In cazul in care folosesti Linux sau macOS, cel mai probabil ai Python instalat pe PC-ul tau pentru ca aceste OS-uri folosesc multe aplicatii care au la baza limbajul. In cazul in care nu il ai instalat, foloseste urmatoarea comanda pentru a-l instala: Pe Linux: sudo apt-get install python3.5 Pe macOS: sudo brew install python
Prima interactiune cu Python din terminal Acum iti recomand sa scrii in terminal comanda prin care vei porni interpretorul Python: python3.5 sau python. Acum poti incepe sa scrii linii de cod, iar interpretorul le va executa una dupa alta. Mai multe detalii poti vedea in figura de mai jos. Aici cel mai simplu lucru pe care il poti face sunt operatiile de baza: adunari, scaderi, impartiri, etc. si anumite afisari simple. Dupa cum poti observa in figura urmatoare, pentru a folosi functia print, nu e nevoie de includerea unei biblioteci in mod explicit, pentru ca print este built-in in Python.
_____________________________________________________________________ 40
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.20 Ceva putin mai complex este folosirea anumitor variabile care retin diferite tipuri de date. In figura urmatoare, in a doua parte a imaginii am incercat sa adunam a + b, variabilei a fiind atribuit sirul de caractere Nume, iar b avand valoarea 3. Operatia de adunare nu s-a putut face in acest caz pentru ca sunt doua variabile de tipuri diferite. In ultima parte a figurii, variabilei a i-am atribuit sirul de caractere Ramon, iar %s pana la urma va tine locul pentru acel sir de caractere. Observa ultima linie de print si rezultatul ei final.
_____________________________________________________________________ 41
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 1.21 In continuare iti voi arata in ce sa lucrezi daca ai nevoie de scripturi si de ce iti este folositor tie, ca programator, din punct de vedere al timpului, sa te folosesti de asta script.
De ce avem nevoie de scripturi in Python? Un script te poate ajuta in automatizarea muncii tale, astfel tu nu trebuie sa faci task-uri repetitive si enervante. Sa spunem ca ai un joc in care trebuie sa minezi aur. Daca vrei sa faci si altceva, iar aurul sa se mineze singur pentru tine, poti crea un script care sa te ajute in acest sens. Multi gameri folosesc aceasta metoda care este de fapt un cheat, dar de mare folos cand vrei sa duci gaming-ul la un alt nivel. De asemenea, daca iti doresti o cariera in IT, vei vedea ca nu poti rezista fara script-uri. Pur si simplu de foarte multe ori va fi necesar sa repeti aceleasi activitati, iar acest lucru este imposibil de realizat fara un script. Toti programatorii aleg sa foloseasca script-uri pentru ca astfel nu mai pierd timpul cu lucruri marunte si nu mai scrie din nou 70% dintr-un cod scris ieri.
_____________________________________________________________________ 42
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Cum sa creezi un script in Python (pe Linux sau macOS)? Crearea unui script in Python este adesea extrem de simplu de facut. Creezi un fisier, il salvezi, creezi un executabil si rulezi codul. In cazul nostru, aici, in Python, vom folosi un interpretor, care ia fiecare linie in parte si o executa. Un aspect important in acest caz, (al limbajelor de programare interpretate - adica asa cum este Python) sa zicem ca avem de exemplu un cod de 20 de linii, iar pe linia 13 interpretorul gaseste o eroare. Programul tau va fi executat de la linia 1 pana la linia 12, chiar daca dupa aceea executia se opreste. Vei vedea ca sunt doar cateva linii de cod pe care trebuie sa le scrii si script-ul in sine, pentru ca lucrurile sa mearga exact cum vrei si ca munca ta sa devina mai usoara. Pe Linux, daca vrei sa faci un script si nu ai mai creat asa ceva, iata cum poti face. In linia de comanda, optional, mergi in locatia (exemplu pe Desktop) in care vrei sa ti se salveze scriptul, apoi introduci urmatoarele comenzi pentru crearea fisierului: cd ~/Desktop/ touch scriptul_meu.py Si comanda pentru deschiderea lui cu editorul vim. Daca doresti sa folosesti orice alt editor text (fie el din GUI sau din terminal), feel free to do it: vim scriptul_meu.py Odata deschis fisierul, e timpul sa introduci prima linie de cod care e specifica unui script: #!/usr/bin/python3.8 Aceasta linie de cod se numeste shebang si specifica locatia unde se afla executabilul Python. Tine minte aceste lucruri si exerseaza-le, pentru ca de acum incolo de cate ori vei scrie un nou script, va fi nevoie sa faci acest lucru. Acum tot ce a ramas de facut este sa scrii in script, pentru inceput, o simpla adunare: a = 2 b = 3 print(a + b)
Apoi ca sa rulezi scriptul, foloseste in linia de comanda: python3.8 scriptul_meu.py _____________________________________________________________________ 43
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
NOTA: Daca ai o alta versiune de Python instalata, atunci foloseste comanda cu acea versiune, de exemplu: python3.6 scriptul_meu.py sau aceasta comanda care va apela versiunea default, setata: python scriptul_meu.py Acum vine acel avantaj al Python-ului de care tot ti-am povestit, poti refolosi codul scris anterior. Cum? Scriind in linia de comanda vim scriptul_meu.py (sau folosind orice alt editor text), dupa care poti modifica continutul scriptului. Odata ce vei trece si tu peste acesti pasi pe calculator, de a face fisierul, a scrie in el si a-l executa, poti spune ca ai invatat procesul.
Concluzie Cateva sugestii pentru tine inainte de a merge mai departe:
1. Fiind la inceput iti recomand sa te “joci” cu interpretorul din Windows (sau Linux/macOS) exact asa cum am vorbit in sectiunea III. al acestui capitol 2. Odata ce avansezi si te obisnuiesti cu sintaxa limbajului, poti merge mai departe sa folosesti un IDE (exact asa cum am facut in sectiunea I.) 3. Cand esti pregatit sa faci aplicatii/programe cu o complexitate mai mare, iti recomand sa folosesti un IDE (cum este PyCharm, studiat in sectiunea II.) pentru ca iti va usura mult munca si iti va oferi foarte mare flexibilitate in scrierea aplicatiilor.
_____________________________________________________________________ 44
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Codul scris in Python vs. alte limbaje de programare Ok, acum ca ti-ai facut o mica idee legata de cum arata o secventa de cod scrisa in Python, da-mi voie sa-ti faca o paralela intre acest limbaj si alte limbaje programare pentru a vedea simplitatea si eficienta de a scrie cod. Iar bun exemplu pentru a demonstra cat de simplu este acest limbaj, este numarul de linii necesar pentru a printa o propozitie pe ecran, in C++, Java sau JavaScript este necesar un numar de aproximativ 4 sau 6 linii, Python scurteaza acest proces la doar o linie. Fiecare program in parte face acelasi lucru, dar diferenta o face complexitatea si cantitatea de cod necesara intre fiecare limbaj in parte. Priveste exemplele urmatoare: ~ C++ In C++ secventa de cod arata in felul urmator: #include using namespace std; int main() { cout sau (mai mare) = (mai mare sau egal)
Operatorii logici:
and (SI logic) or (SAU logic) not (NOT –negare logica)
Operatori pe biti:
& (SI), | (SAU), ^ (XOR), ~ (complement) > (right shift), >>> (zero fill right shift)
Operatori combinati: (operatie + atribuire)
+=, -=, /=, *=, %=, &=, |=, ^=, =, >>>=
_____________________________________________________________________ 52
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Deja dupa cum ti-ai dat seama, acesti operatori au rolul de a face operatii matematice. Nu-ti fa griji, nu trebuie sa cunosti matematica la un nivel inalt pentru a intelege aceste elemente de baza. Pentru inceput poti folosi in exercitiile tale operatorii matematici simpli: • + (adunare), 2 + 3 • - (scadere), 2 - 3 • * (inmultire), 2 * 3 • / (impartire), 2 / 3 • (atribuire de valoare), a = 2, b = 3 • == (comparatie), a == b (rezultatul intors va fi de tip boolean - True sau False) ATENTIE: Atribuirea de valoare (=) difera de comparatie (==)! Prima este folosita pentru a asigna valoarea din partea dreapta (mai explicit, daca este cazul, valoarea finala in urma operatiilor din partea dreapta) in variabila din partea stanga. A doua este folosita pentru a verifica daca doua valori sunt sau nu egale. In cazul in care conditia este adevarata (True), deducem ca cele doua valori sunt egale, altfel ele sunt diferite, iar prin verificare se va returna false. Acum ca am invatat operatiile de baza, hai sa ne focusam pe operatia % (pronuntat “mod”). Aici ma voi referi la o operatie matematica. Operatia a % b intoarce valoarea restului impartirii lui a la b. Daca folosim if a % b, se va verifica daca restul impartirii lui a la b este sau nu egala cu 0 (zero). Daca da, valoarea expresiei va fi True, asltfel daca exista un rest diferit de 0, oricare ar fi ea, valoarea va fi False. Iata mai jos o lista mai lunga de exemple: >>> 10 + 1 11 >>> 10 - 9 1 >>> a = 2 >>> b = 3 >>> a * b 6 >>> a / b 0 >>> a % b
_____________________________________________________________________ 53
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
2 >>> b % a 1 >>> a > b False >>> a < b True >>> a == b False >>> a += 2 >>> a 4
O alta expresie pe care o putem face este += sau -=, *=, /= sau %=. Cu varianta += putem face o adunare, in cazul nostru variabilei x i se va o noua valoare rezultata din valoarea lui plus elementul din dreapta, astfel pentru: x = 5 y = 10 suma = x + y print(suma) suma += 2 print("Suma este:", suma)
Se va afisa: 15 Suma este: 17
Iti recomand sa iei acelasi exemplu, dar sa inlocuiesti operatia matematica efectuata pe variabila suma cu ceilalti operatori, pe rand, pentru a vedea rezultatul final: suma -= 2 suma *= 2
_____________________________________________________________________ 54
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
suma /= 2 suma %= 2
Printeaza rezultatul dupa fiecare operatie pentru a vedea si a intelege mai bine procesul care a avut loc.
Variabile de tip String (siruri de caractere) in Python In aceasta sectiune vom vorbi despre siruri de caractere (aka. String-uri), un tip de variabila extrem de des intalnit si folosita in programare. Daca stam sa ne gandim, cand vine vorba de calculatoare cuvintele sunt peste tot, deci implicit si String-urile vor fi peste tot. Google este un motor de cautare care se bazeaza exclusiv de cuvintele care sunt introduse de catre un utilizator pentru a oferi cele mai buna rezultate (in urma unei analize semantice si a unui algoritm extrem de sofisticat). trei_litere = "Abc" print(trei_litere)
Daca rulam tot ceea ce am scris pana acum in program, va aparea pe ecran: Abc
Daca ar fi sa scriem: trei_litere = trei_litere + 'a' print(trei_litere)
vom vedea pe ecran ca lui Abc i se va mai adauga inca o litera, inca un string care va fi a. Astfel, ceea ce va aparea printat pe ecran va fi: Abca NOTA: in Python toate variabilele (int, float, string, obiecte) sunt scrise cu litere mici String-urile ne ajuta foarte mult sa operam cu date de tip text. In cadrul acestora exista numeroase functii built-in pe care le putem folosi pentru a ne face viata mai usoara. Una _____________________________________________________________________ 55
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
dintre acestea este functia len() care ne ofera numarul de litere din cadrului unui string. Iata mai jos un exemplu de folosire a acesteia: print(len(trei_litere))
si vom primi numarul de caractere din acest sir trei_litere. In final pentru codul (atentie, ultimul print se intinde pe doua linii): trei_litere = "Abc" print(trei_litere) trei_litere = trei_litere + 'a' print(trei_litere) print(len(trei_litere)) print("String-ul nostru este", trei_litere, "si are lungimea de", len(trei_litere))
Rezultatul afisat va fi: Abc Abca 4 String-ul nostru este Abca si are lungimea de 4
String-urile pot fi foarte utile in comunicarea dintre program si utilizator pentru ca sunt constituite din caractere si pot forma propozitii. Chiar si un simpu “Yes” sau “No” pot face schimbari radicale intr-un program. Elementele primare din string-uri sunt caracterele, iar acestea pot forma siruri de caractere, de exemplu in momentul in care sunt organizate in cuvinte si propozitii. Iata mai jos modul in care creeam o variabila de tipul String. sirA = "Dimineata am baut" sirB = 'cafea' sirC = 'ceai'
_____________________________________________________________________ 56
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Ele pot fi asignate unei variabile utilizand si ghilimele, dar si apostroafe. Avand o astfel de variabila String, poti avea acces la fiecare caracter dintr-un sir de caractere cu ajutorul unui index (care este folosit pentru a identifica valoarea unui caracter dintr-un sir aflat la o anumita pozitie - index). Primul caracter (deci si prima pozitie din sir) va avea intotdeauna valoarea 0, urmatorul caracter va avea pozitia 1, apoi pozitia 2 si asa mai departe. Pentru a lucra cu caracterele dintr-un String, vom folosi aceste paranteze [ ] si valoarea indexului, dupa cum urmeaza: print("sirA[0] este ", sirA[0])
Care ne va afisa: sirA[0] este D
Observa cum dupa apelarea de print se va afisa ceea ce exista in ghilimele (care contin si un spatiu imediat dupa cuvantul este), dupa care afiseaza litera D, fiind primul caracter pozitionat pe indexul 0. Pentru a afisa ultimul caracter din sirul sirA, va fi nevoie sa accesam ultima pozitie din sir. Putem face asta prin mai multe metode, cea mai simpla fiind: print(sirA[16])
care va afisa: t Daca dorim ca doar cuvantul neata sa fie afisat putem folosi parantezele patrate impreuna cu doua punte in felul urmator: print(sirA[4:9])
Partea interesanta este ca nu apare eroare (poate la asta te-ai asteptat) atunci cand scrii print(sirA[-4:-1])
Ce sa va intampla? Ce se va afisa? Se va afisa al 4-lea element numarand de la capatul cu indexul maxim (din dreapta), catre stanga (catre indexul 0). Se va afisa bau, unde b se afla pe pozitia -4, a se afla pe pozitia -3, u se afla pe pozitia -2, iar la -1 se incheie afisarea _____________________________________________________________________ 57
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
caracterelor din sir (fara a lua in calcul litera t). Daca vrem sa cream un al patrulea sir de caractere denumit propozitie care sa fie o propozitie compusa, iar rezultatul dorit sa fie Dimineata am baut cafea, putem incerca urmatoarea secventa de cod: sirA = "Dimineata am baut" sirB = "cafea" propozitie = sirA + sirB print(propozitie)
Ce se va afisa mai exact? Dimineata am bautcafea
Pentru a adauga un spatiu poti sa pui cu plus in felul urmator: propozitie = sirA + ' ' + sirB
Incearca si tu pe propriul PC. Ce va afisa secventa urmatoare? print("Ieri" + " d" + sirA[1:] + ' ' + sirB)
De asemenea, daca doresti ca afisarea sa aibe o anumita vizualizare, poti afisa cu aceeasi functie print pe mai multe linii folosindu-te de ‘\n’. trei_litere = "Abc\n" print(trei_litere)
Se va afisa: Abc
Alte utilitati ale functiei print Poate ca se ruleaza un program, iar pana cand se ajunge acolo vrei sa folosesti un mesaj intermediar: _____________________________________________________________________ 58
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
mesaj="Please wait while the program is loading” print(mesaj)
Legat de concatenarea sirurilor de caractere, trebuie specificat faptul ca acestea trebuie sa fie de acelasi timp, mai multe detalii in exemplul ce urmeaza a=42 print(‘My age is’ + a)
acest program urmand sa semnaleze o eroare de tipul Traceback (most recent call last): File “”, line 1, in ‘My age is ‘ + a TypeError: can only concatenate str(not “int”) to str
Iar dupa cum observi, daca citesti cu atentie eroarea, iti poti da seama foarte usor care este problema codului. Aceasta regula nu se aplica pentru orice eroare, uneori nu iti poti da seama exact care este greseala, dar este un prim pas important in depanarea posibilelor erori. Iar pentru a depana aceasta eroare te poti folosi de urmatorul format: a=42 print(‘My age is’+str(a))
Poti folosi si separator, ca in exemplul de mai jos print(‘My age’,’ is 21’, sep=’\n’)
Cu rezultatul: hello world
La fel cum este utilizatorul sep, la fel se poate face si cu cel de tip end: print(‘Prima propozitie’, end=’.’)
_____________________________________________________________________ 59
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
print(‘A doua propozitie’, end=’.’) print(‘A treia propozitie.’)
Afisandu-se: Prima propozitie.A doua propozitie.A treia propozitie
Poti folosi si o combinatie intre aceste separatoare, precum: print(‘A’,’B’,’C’, sep=’, ‘, end=’.’)
cu rezultatul: A,B,C
Exerseaza si vezi cat de multe poti face cu lucruri atat de simple. String-urile, deci atribuirea de caractere unei variabile, sunt folosite in toate limbajele de programare. Daca vei invata totul despre cum functioneaza ele specific in Python, iti va fi mult mai usor sa le folosesti in Java, C++ sau alte limbaje. Nu uita ca programarea se invata numai prin practica, iar exercitiile pe care le-am pregatit pentru tine iti pot fi foarte utile.
Exemplu #2 Si acum hai sa iti explic ceea ce ziceam capitolul anterior, si anume, de ce Python este un limbaj accesibil si usor de scris. Atunci cand creezi o variabila in Python, nu e nevoie sa specifici explicit rezervarea unei spatii de memorie sau tipul ei. Nu trebuie sa te complici sa “ii spui codului” ca variabilele nume si prenume vor contine cate un sir de caractere, in variabila varsta va fi un numar intreg, iar variabila salariu va contine un numar real, ci pur si simplu aloci valorile. Iata exemplul descris: nume = "Pop" prenume = "Mihaela" varsta = 23 salariu = 3800.98
Daca vrei de asemenea sa afisezi aceste variabile, in print-ul lor nu trebuie sa precizezi care este tipul de variabila care urmeaza sa fie afisata, ci doar variabila: _____________________________________________________________________ 60
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
print(nume) print(prenume) print(varsta) print(salariu)
Dupa asta se va afisa: Pop Mihaela 23 3800.9
Vezi cum, desi numele si prenumele au fost alocate in varibile cu ajutorul ghilimelelor, la afisare ghilimelele au lipsit, iar pentru Python cu versiunea 3.5 s-au afisat numele si prenumele cu apostroafe. Reamintesc, modul de memorare a unor siruri de caractere intr-o variabila se face folosind ghilimele, iar daca e vorba de un numar (intreg, real, etc) atunci doar se specifica valoarea. Un alt aspect important de mentionat aici este ca variabilele isi pot schimba valoarea. Exemplu concret: Daca in cazul nostru personajul Mihaela se casatoreste si isi schimba numele din Pop de exemplu in Stan, in cod vom putea introduce o noua linie in care alocam numelui o noua valoare: nume = "Stan". Daca trece un an, Mihaela Stan implineste 24 de ani. Cum ii adaugam in plus un an? varsta = varsta + 1 sau o alta metoda simpla ar fi: varsta += 1 sau si mai simplu, schimbam direct 23 in 24: varsta = 24 Continuand pe acest exemplu: Daca vrem sa aflam restul impartirii salarului (care in cazul nostru este de tip float, fiind numar real) la 1000, scriem salariu % 1000, iar asta ne va afisa: 800.98. Asta facem prin operatie MOD (%). Acum poti trece si tu prin acesti pasi pentru a exersa. Te poti juca in foarte multe moduri pentru a “testa” limitele. Vor urma alte exercitii mai complexe. Pana atunci, poti incerca sa faci alte lucruri: adaugare de elemente, scaderi, diferite operati, etc. Tine minte, valoarea variabilelor se poate schimba in functie de conditiile si informatia introdusa in programul la care lucrezi. Practic, orice program are in spate multe variabile ce lucreaza intre ele sa faca posibila functionarea. Odata ce vei invata sa lucrezi cu variabile, logica din spatele programarii ti se va parea destul de simpla si mai ales interesanta.
_____________________________________________________________________ 61
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Comentarea codului in Python In Python, precum si in marea majoritate a limbajelor de programare, avem la dispozitie sa comentam diverse aspecte ale codului. Aceste comentarii pot fi extrem de benefice din mai multe puncte de vedere: • unul dintre ele ar fi faptul ca poti lasa comentarii despre ce face o secventa de cod - o functie, o clasa, etc (astfel documentezi codul, iar tu sau alte persoane veti intelege ceea ce face acesta chiar si dupa cativa ani). • un alt motiv ar fi sa invalidezi o secventa de cod deja existenta (adica vei face ca acea secventa sa nu fie compilata si executata). Acum propun sa iti arat 2 exemple astfel incat tu sa intelegi mult mai bine la ce ma refer: # Linie cu comentariu print("Se va afisa acest text") # afisare """ print (Nu se vor afisa aceste linii) Bla-bla """
Dupa cum poti vedea in cele 2 exemple de mai sus, avem 2 moduri prin care putem lasa un comentariu: primul fiind cel cu # (diez), iar cel al 2-lea fiind cel cu ””” (3 ghilimele pentru a incepe sectiunea comentata si alte 3 ghilimele pentru a indica finalizarea sectiunii comentate). Ambele variante sunt folosite, doar ca varianta a doua ne permite sa comentam secvente mult mai lungi (care se intind pe mai multe randuri) de text.
Citirea datelor de la tastatura in Python Inainte de a incepe sa citim datele dintr-un fisier, vreau sa-ti arat cum o poti face de la tastatura. Probabil ca ai mai interactionat cu citirea datelor de la tastatura in capitolul 2, in sectiunea de exercitii, iar daca nu ai reusit sa faci acel exercitiu, nici o problema pentru ca iti voi explica in cele ce urmeaza ce inseamna si cum o poti face. Citirea datelor de la tastatura (aka. Citirea datelor scrise de catre utilizator direct prin consola) inseamna sa rulezi un program, iar aceasta sa-ti ceara introducerea datelor direct de la tastatura. Este o metoda foarte buna de antrenament si de verificare a faptului ca programul tau functioneaza corect. In aplicatii reale nu vei interactiona foarte mult cu acest mod, decat _____________________________________________________________________ 62
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
atunci cand ii ceri utilizatorului sa o faca (in rest vei opera cu fisere sau date transferate prin retea). Iata mai jos un exemplu de citire a datelor de la tastatura pe care te incurajez sa-l exersezi si sa-l adopti in programele tale pentru ca poate fi o metoda foarte buna de testare a programelor lor. Modul prin care putem citi dintr-un program in Python datele user-ului este prin folosirea functiei input()in felul urmator: question = input ("Salut! Cum te simti astazi? ") print("Raspunsul user-ului este:",question)
In urma folosirii codului input(), programul va stoca in variabila question prima linie de text care va fi introdusa in consola. Un aspect important consta in faptul ca liniile citite sunt de tipul String, iar asta iti ofera multa flexibilitate pentru ca astfel le poti interpreta si modifica asa cum doresti tu. Functia input() o poti folosi si fara sa scrii un mesaj intre paranteze.
_____________________________________________________________________ 63
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Exercitii Felicitari pentru faptul ca ai ajuns la sectiunea de exercitii din acest capitol. Iata programele pe care te rog sa le creezi: 1) Creeaza cate o variabila de tipul: string, int si float, dupa cum urmeaza:
Variabila de tip int va retine valoarea 20
Variabila de tip int va retine valoarea -5
Variabila de tip double va retine valoarea 8.73
Variabila de tip string retine valoarea “Python”
Variabila de tip string retine valoarea “Imi place programarea in ”
Variabila de tip string retine valoarea “ pentru ca suma acestor 2 numere este: ”
Avand aceste variabile, afiseaza pe ecran un mesaj (care sa aiba cat de cat sens :D ) cu acestea. 2) Scrie un program care calculeaza valoarea pentru urmatoarele variabile de tip double: x = -7 + 4/3*5 y = -7 + 4/(3*5) z = (-7 + 4/3)*5 Afiseaza aceste valori in felul urmator pe ecran: x = …valoare care se va calcula pentru x… y = …valoare care se va calcula pentru y… z = …valoare care se va calcula pentru z… Observa care sunt diferentele dintre cele trei valori afisate.
_____________________________________________________________________ 64
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Capitolul 3 - Instructiuni conditionale (if, for, while) In acest capitol vom discuta despre elementele de baza din programare care dau logica programelor noastre. Aceste instructiuni ne contureaza programele si le ofera logica, pe baza careia sa iau decizii cu privire la rezultatul pe care il vor genera. Cand vorbim despre instructiunile conditionale ale limbajelor de programare, avem la dispozitie urmatoarele: • Instructiunea if - daca se respecta conditia X, atunci se intampla Y • Instructiunea for - pentru o anumita conditie X, cat timp aceasta este respectata se intampla Y • Instructiunea while - cat timp se respecta conditia X, se intampla Y
1) Instructiunea if Daca ai mai avut de-a face cu programarea, atunci cel mai probabil te-ai intalnit cu aceasta instructiune if. Ea este una dintre cele mai folosite si cunoscute instructiuni si este intalnita in marea majoritate a limbajelor de programare (C/C++, Java, Python, PHP, Ruby, Bash, etc). Scopul ei: sa verifice valoarea de adevar a unei expresii (ex: “5 > 3?”, aceasta expresie este adevarata). In cazul in care expresia este adevarata se va merge mai departe cu executarea instructiunilor din blocul IF, iar daca este falsa, se sare peste tot ce apare in acel bloc. Asadar, sintaxa de cod arata in felul urmator: if conditie: instructiune_1 instructiune_2 if conditie_2: instructiune_3 instructiune_4
La nivel de baza asa se foloseste instructiunea if. Va exista o conditie care va rezulta o valoare de adevar (fie ea adevarata sau falsa). In cazul in care aceasta valoare este adevarata (ex: 5 > 3), se vor executa instructiunea 1, instructiunea 2 (si celelalte daca exista in bloc). Altfel, in cazul in care nu este adevarata conditia (de exemplu pentru 5 > 8), programul va trece de blocul de date if si nu se vor executa cele 2 instructiuni. Poate _____________________________________________________________________ 65
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
te intrebi ce reprezinta aceste conditii. Ei bine, conditiile din instructiunea IF pot fi operatii (comparatii) matematice, precum cele de mai jos: • • • • • •
A > B - se verifica daca A este mai mare ca B A < B - se verifica daca A este mai mic ca B A >= B - se verifica daca A este mai mare SAU egal ca B A 3: res = a + 1 print(res)
Acum, care crezi ca va fi rezultatul afisat al secventei de cod de mai sus? Dupa cum probabil ai intuit, rezultatul este 6. Iar acum haide sa vedem de ce. Initial am declarat doua variabile (a si res), dupa care am creat un bloc de instructiuni folosind if. Prin el am testat (am verificat) daca valoarea lui a este mai mare decat numarul 3. Expresia aceasta este adevarata pentru propozitia “5 este mai mare decat 3”, ceea ce inseamna ca programul nostru merge mai departe si intra in blocul de date if, unde are loc acea operatie matematica. Acolo se atribuie lui res rezultatul adunarii lui 1 cu 5, adica 6. Astfel, in momentul afisarii, rezultatul res va fi 6. NOTA: Un aspect foarte important la codul precedent consta in : (semnul doua puncte) aflate dupa expresia logica din cadrul if si spatiul (echivalentul unui TAB) din fata instructiunilor 1, respectiv 2. In programarea “clasica” se folosesc acolade { } pentru a indica continutul unui bloc de instructiuni. In Python, pentru a pastra lucrurile cat mai simple cu putinta, se foloseste acest spatiu la inceputul fiecarei instructiuni din cadrul unui bloc de date. Daca nu apare spatiu la inceputul instructiunii dintr-un bloc conditional _____________________________________________________________________ 66
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
(if, for, while), atunci se va considera faptul ca acea instructiune nu apartine blocului. In exemplul de mai jos voi modifica conditia din cadrul instructiunii if, iar rezultatul va fi unul diferit: a = 5 res = 0 if a > 8: res = a + 1 print(res)
Atunci rezultatul ar fi fost total diferit: valoarea afisata a lui res, in acest caz, este 0. De ce? Pentru ca aici a (care are valoarea 5) este mai mic fata de 8, iar expresia a > 8 devine falsa, deci programul nu va mai executa codul dintre acolade dupa cele doua puncte, aliniate corespunzator, ci va merge mai departe la afisarea valorii lui res. La executare se va afisa 0. In sectiunea de exercitii de la sfarsitul acestui capitol vei avea ocazia sa practici mai mult instructiunea if pentru ca vei avea mai multe programe pe care sa le creezi.
Instructiunea else Instructiunea if este extrem de benefica in programare pentru ca ne permite sa comparam sau sa luam anumite decizii logice pe baza rezultatului conditiei (adevarat sau fals). De multe ori in programare vor exista situatii in care trebuie sa verificam mai multe conditii si sa luam decizii pe baza lor. Unele conditii sunt adevarate intr-o anumita situatie, iar altele nu. Forma generala a acestor conditii alternative poate arata in felul urmator: if conditie: instructiune_1 .... else: instructiune_2 ...
_____________________________________________________________________ 67
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Dupa cum poti sa vezi, avem if cu prima conditie (care daca este adevarata va fi executata instructiunea 1), iar in cazul in care aceasta conditie nu este adevarata se ajunge la executarea instructiunii 2 din else. Hai sa luam un exemplu prin care sa intelegi mult mai bine ce vreau sa spun: a = 2 res = 0 if a > 3: res = a - 1 else: res = a + 1 print(res)
In acest exemplu poti sa vezi ca in cazul in care a este mai mare decat 3, atunci res va avea valoarea a - 1. Daca aceasta conditie este falsa (a nu este mai mic decat 3, ceea ce in acest exemplu asa este), programul va trece de instructiunile din blocul if si va merge mai departe in blocul else. Aici va executa instructiunea de adunare res = a + 1, iar apoi va afisa rezultatul 3. Orice valoarea a lui a care nu respecta a > 3, va ajunge sa execute instructiunea din blocul else. Daca ar fi sa mergem mai departe si sa fim si mai specifici in alegerea rezultatului dorit, putem structura if in formatul urmator: if conditie_1: instructiune 1 ... elif conditie_2: instructiune_2 ... else: instructiune_3 ... ...
_____________________________________________________________________ 68
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Iar mai jos poti sa vezi exemplul: a = 2 res = 0 if a > 3: res = a - 1 elif a == 3: res = a elif a < 3: res = a+1 else: print("Nu exista un rezultat pentru res.") print(res)
In exemplul de mai sus poti sa vezi in detaliu cum poti sa folosesti instructiunea if, combinand si instructiunea else. Indiferent daca este vorba de elif sau pur si simplu else, putem executa instructiuni diferite daca conditia initiala (din primul if) nu a fost indeplinita. Acesta este o metoda foarte buna pe care o putem folosi cand vrem sa rezolvam anumite probleme (cu programul nostru) pentru ca ne va fi mult mai usor sa filtram si sa executam instructiunile corecte. In final se va afisa 3.
Exemplul #2 Inainte de a merge mai departe propun sa mai luam un exemplu. De data aceasta iti vom rezolva o problema de programare care suna cam asa: “Fiind data nota unui elev să se afișeze dacă acesta este corigent, promovat sau premiant.”
Pentru a rezolva aceasta problema trebuie sa ne gandim la toate scenariile posibile: Q1: In ce situatie ramane un elev corigent la o materie? A: In situatia in care media lui este sub 5. Q2: In ce situatie va fi un elev promovat la o materie? A: In situatia in care media lui este o nota mai mare sau egala cu 5. Q3: In ce situatie va fi un elev premiant la o materie? A: In situatia in care media lui este 10 la materia respectiva. _____________________________________________________________________ 69
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Acum ca am spart aceasta problema in mai multe bucati, haide sa le punem cap la cap folosindu-ne de instructiunile invata anterior: notaElev = 10 materie = "Matematica" if notaElev < 5: print("Elevul este corigent la materia: ", materie) elif notaElev >= 5 and notaElev < 10: print("Elevul a promovat materia: ", materie) elif notaElev == 10: print("Elevul este premiant la materia: ", materie) else: print("Nota introdusa nu este corecta")
Care crezi ca va fi mesajul afisat pe ecran? Ai ghicit, este vorba despre mesajul din cel de-al treilea bloc if. Elevul este premiant la materia: Matematica
Daca vei incerca sa modifici notaElev, vei putea vedea cum rezultatul va fi diferit in functie de valoarea pe care o atribui.
_____________________________________________________________________ 70
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
2) Instructiunea for Mergand mai departe cu subiectul legat de instructiunile conditionale din programare, am ajuns la instructiunea for. O instructiune care ne permite sa-i spunem programului nostru sa execute un cod in mod repetat (atat timp cat se respecta o conditie). Gandeste-te in felul urmator: cum ar fi daca am avea 100 operatiuni de verificat, iar in urma fiecareia sa efectuam un anumit calcul sau sa afisam un rezultat. Cu cele invatate pana acum, am vazut ca se poate face asta, doar ca mica problema ar consta in faptul ca ar trebui sa facem totul manual. Practic, pentru fiecare operatiune de verificare (folosind cate un if), ar trebui sa scriem manual fiecare secventa de cod. Problema cu metoda asta e ca necesita mult timp, nu e scalabila, iar in timp va consuma multa memorie. Hai sa-ti dau un exemplu concret. Iata mai jos o secventa de cod scrisa intr-un mod “clasic”: i = 0 suma = 0 a = 5 if i == 0: suma = suma + a i += 1 if i == 1: suma = suma + a + i i += 1 if i == 2: suma += a + i i += 1 if i == 3: suma += a + i i += 1 print("Suma este: ", suma)
In aceasta secventa poti sa vezi ca am calculat o anumita suma in functie de variabila a si i. Rezultatul acestei sume este: 26. In aceasta situatie, a este pur si simplu o variabila int careia i-am asignat o valoare, iar i este un iterator (o variabila care contorizeaza numarul de procesari). Dupa fiecare calculare a sumei, acest iterator i va fi incrementat (prin i+=1), este echivalenta cu i = i + 1 iar valoarea acestuia va creste cu 1. _____________________________________________________________________ 71
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
ATENTIE: In Python nu putem folosi i++. In programarea in Java, C++, expresia i++ este echivalenta aici in Python cu i = i + 1;. Acum hai sa-ti arat aceeasi secventa de cod, dar de data asta scrisa cu for: suma = 0 a = 5 ii = [0, 1, 2, 3] for i in ii: suma += a + i print("Suma este: ", suma)
Dupa cum poti sa vezi in aceasta secventa de cod, lucrurile au fost mult simplificate cu ajutorul lui for specificand urmatoarele: 1. In el am declarat o variabila de tip lista (mai multe detalii in capitolul 5) denumit ii care contine valori de la 0 la 3. 2. In cadrul instructiunii for, cu ajutorul keywordului in, am specificat faptul ca variabilei nou create i se vor aloca (pe rand) fiecare valoare in parte existenta in lista. 3. Aceasta bucla se va executa pana cand variabila i a parcurs fiecare element din lista ii. Dupa cum poti sa vezi, in aceasta situatie for face diferenta dpvd. al codului, al executiei acestuia si al memorie consumate. Ideea aici consta in task-uri repetitive. Prin for putem crea bucle (loops) care sa verifice/opereze diferite secvente de cod, in mod repetat. Vei vedea putin mai tarziu in aceasta carte, cum putem folosi for atunci cand vine vorba de structuri de date (parcurgerea, modificarea, verificarea lor), de clase si obiecte, iar astfel vei avea o idee mult mai buna despre utilizarea acestei instructiuni. Dupa cum am spus si la inceputul acestui capitol, instructiunile conditionale (if, for, while) stau la baza majoritatii limbajelor de programare si este modul prin care noi putem programa calculatorul, astfel incat sa ne folosim intr-un mod cat mai simplu si eficient de resursele acestuia. Mai jos poti sa vezi cum arata secventele de cod exemplificate mai devreme. Pe langa acest exemplu de folosire a unei liste in cadrul for,se mai poate folosi functia range(). Aceasta functie va genera un sir de numere in functie de parametrul acordat. Iata un exemplu din interpretorul Python:
_____________________________________________________________________ 72
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
>>> range(4) [0, 1, 2, 3] >>> range (8) [0, 1, 2, 3, 4, 5, 6, 7]
Asadar, avand acest gand in minte, putem optimiza codul de mai devreme, astfel: suma = 0 a = 5 for i in range(4): suma += a + i print("Suma este: ", suma)
Dupa cum poti sa vezi, am eliminat lista precedenta ii si am folosit functia range() in cadrul for. Rezultatul acestei secvente va fi acelasi: Suma este: 26
Exemplul #2 Acum vom lua in alt exemplu de problema de programare pe care o vom putea rezolva cu ajutorul instructiunii invatate anterior: “Se dau trei numere naturale a b x. Sa se verifice daca numarul x apartine intervalului [a,b].”
In cazul acesta ne vom seta un interval aleator (in exemplul de mai jos am ales de la 3 la 9) si vom parcurge fiecare numar intreg din interval pana in momentul in care il gasim pe x. Daca x apartine intervalului vom afisa un mesaj afirmativ si vom intrerupe parcurgerea buclei mai departe, iar in cazul in care x nu apartine intervalului, atunci vom afisa un mesaj corespunzator. Iata rezolvarea acestei probleme in secventa de cod de mai jos: a = 3 b = 9 x = 4
_____________________________________________________________________ 73
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
for i in range(a,b+1): if x == i: print ("x se afla in intervalul [a,b]") break if i == b: print ("x nu se afla in interval")
Dupa cum poti vedea, am creat o bucla for pe care o iteram de la 4 la 9 prin functia range (care primeste ca argument o valoare de start si una de final). Apoi in interiorul for comparam valoarea lui x cu valoarea lui i din momentul iteratie, iar in cazul in care rezultatul este adevarat (x == i) se va afisa mesajul pe ecran si bucla se va opri (prin instructiunea break). De ce folosim break pentru a opri bucla? Pentru odata gasita valoarea lui x in interval, nu mai are sens sa cautam mai departe (astfel “economisim” consum de memorie si procesare). Rezultatul afisat in acest caz va fi: x se afla in intervalul [a,b]
Mai departe te invit pe tine sa testezi cu valori diferite ale lui x. Incearca cu x = 1, x = 8, x = 10, x = -1, x = 5.6. Ce rezultate ai obtinut si de ce? Noteaza raspunsul in caietul tau de notite.
_____________________________________________________________________ 74
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
3) Instructiunea while Instructiunea while are o functionalitate similara cu cea de for, doar ca se foloseste putin diferit. Cand folosim while putem gandi problema in felul urmator: cat timp se intampla X, executa Y. Pe de alta parte, cand folosim for, gandim problema in urmatorul mod: pentru o anumita conditie X, se intampla Y. Cele 2 abordari seamana, dar sunt usor diferite (sunt folosite in contexte diferite). Buclele for sunt folosite mai des in momentul in care se cunoaste numarul fix de iteratii care trebuie sa aiba loc pe parcursul rularii programului, iar while folosim cand nu cunoastem acest numar. O bucla while se poate folosi cand dorim sa rulam un program la infinit (prin while True). Deci formatul standard pentru aceasta bucla este: contor = 0 while contor < 100: instructiune 1 ... contor += 1
In cazul instructiunii while (sau orice bucla in general) trebuie sa fim atenti sa nu generam o bucla infinita (un program care ruleaza la nesfarsit si consuma resurse fara un scop). In exemplul de mai sus, acest lucru s-ar fi produs daca instructiunea contor += 1 nu ar fi fost introdusa (contor ar fi ramas la valoarea 0 si bucla ar fi rulat in continuu pentru ca valoarea acestei variabile nu se modifica). Sa reluam secventa de cod de mai devreme: suma = 0 a = 5 ii = [0, 1, 2, 3] for i in ii: suma += a + i print("Suma este: ", suma)
Iar acum iata aceeasi varianta, dar cu instructiunea while: suma = 0
_____________________________________________________________________ 75
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
a = 5 i = 0 while i y: return x else: return y res = valoareaMaxima(31, 7) print("Rezultatul final este", res)
Dupa cum poti sa vezi, singura diferenta (semnificativa) intre acest tip de functie si cel precedent are de a face cu keywordul return, care specifica valoarea variabilei care sa fie intoarsa ca rezultat in momentul in care functia este apelata. O functie poate fi folosita _____________________________________________________________________ 82
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
pentru a ne oferi un anumit rezultat (de care noi sa ne folosim ulterior) sau pentru a face anumite modificari in cadrul ei, neavand nevoie de rezultatul specific. In final se va afisa: Rezultatul final este 31
Daca nu am fi folosit secventa res = valoareaMaxima(31, 7) nu am fi putut sa stocam rezultatul si sa ne folosim de el ulterior pentru a face alte operatiuni.
Exemplu #2 Acum ca ai inteles principiile de baza, iti propun sa facem ceva putin mai complex. Vom creea un program care va prelua datele de la utilizator (nume, username, parola) si va cripta (securiza) parola astfel incat ea sa nu poate fi descifrata de catre un hacker. Pentru asta vom avea nevoie de doua functii: una care obtine si stocheaza informatia oferita de catre user si cealalta care securizeaza (cripteaza) parola. Codul nostru pentru prima parte va arata in felul urmator: def getNume(): nume = input("Introdu numele tau:") return nume def getUser(): user = input("Introdu usernamul pe care il doresti:") return user
def getParola(): parola = input("Introdu parola pe care o doresti:") while len(parola) < 5: print("Parola ta e prea scurta. Mai incearca") parola = input("Introdu parola pe care o doresti:") return parola nume = getNume() user = getUser() parola = getParola()
_____________________________________________________________________ 83
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
In secventa de mai sus am creat trei functii, fiecare avand rolul de a obtine datele specifice de la utilizator. Functiei getParola(), i-am adaugat o masura mai mare de securitate in sensul in care nu va permite stocarea parolelor mai mici de 5 caractere (incearca sa introduci o parola de 3 caractere si observa rezultatul :D ). Codul nostru pentru partea de securizarea a parolei va arata in felul urmator: def securizareParola(parola): parolaSecurizata = hash(parola) return parolaSecurizata def getDateUser(nume, user, parola): """Datele user-ului pot fi returnate ca un dictionar si folosite ulterior, dar de dragul exemplului eu le voi afisa in consola""" print("Datele de identificare ale user-ului sunt", nume, user, parola)
In functia de securizarea a parolei folosim o functie built-in in Python care se numeste hash(). Aceasta genereaza o valoarea unica pentru orice sir sau numar pe care il primeste ca argument si este o modalitate extrem de folosita pentru securizarea parolelor stocate in bazele de date. Daca esti interesat de partea de Securitate si vrei sa inveti mai multe iti recomand cartea mea de Introducere in Securitate Cibernetica. Mai multe detalii poti afla aici. Dupa ce este apelata functia hash(), aceasta va genera un rezultat sub forma unui sir de numere, ireversibil (din acest sir nu se poate regenera parola) care va fi intors de catre functia principala. Urmatoarea functie va afisa datele intr-un format simplu si usor de vizualizat. Iar in secventa de mai jos am pus lucrurile cap la cap pentru a ne afisa un rezultat valid: parolaSec = securizareParola(parola) print("Parola", parola, "a fost securizata si este", parolaSec) getDateUser(nume, user, parolaSec)
Si rezultatul afisat va fi: Introdu numele tau: Adi Introdu usernamul pe care il doresti: adiuser Introdu parola pe care o doresti: python2019
_____________________________________________________________________ 84
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Parola python2019 a fost securizata si este 748367380273021697 Datele de identificare ale user-ului sunt: Adi adiuser 748367380273021697
3) Functii recursive Functia recursiva este o functie care se apeleaza pe sine pentru a produce rezultatul dorit. In aceasta sectiune iti voi da doua exemple despre cum poti sa folosesti functiile recursive.
Exemplu #1 - Maximul dintre 3 numere Avem problema cu urmatoarea cerinte care se doreste a fi rezolvata intr-un mod mai eficient: “Scrie un program care sa afiseze numarul maxim dintre trei numere aleatoare.”
Solutia este urmatoarea: def valoareaMaxima( x, y ): if x > y: return x else: return y def numarMax( x, y, z ): return valoareaMaxima( x, valoareaMaxima( y, z ) ) print(numarMax(2, 7, -2))
Dupa cum poti sa vezi am definit doua functii: prima functie (valoareaMaxima) determina valoarea maxima dintr-o doua numere, iar a doua functie (numarMax) se foloseste de prima pentru a determina valoarea cea mai mare dintre cele 3 numere. Cum face asta? Din secventa: valoareaMaxima(x, valoareaMaxima(y,z))mai intai se va determina rezultatul functiei date ca parametru (adica se vor compara valorile lui y si z si se va stabili cea mai mare valoarea - in cazul acesta 7), dupa aceea se va executa
_____________________________________________________________________ 85
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
aceeasi functie, dar folosindu-se de valoarea lui x (in cazul acesta 2), respectiv cea a rezultatului dintre y si z (adica 7 in acest exemplu). Rezultatul acestei secventa va fi: 7
Exemplu #2 - N! (n factorial) Acest exemplu va fi unul putin mai complex dpvd al conotatiei matematice, dar invitatia mea pentru tine este sa dai la o parte ideile si parerile (adesea) negative pe care le-ai putea avea fata de matematica si sa urmezi cu mine exemplul. Iti mai aduci aminte cum erau la matematica operatiile factoriale (studiate la liceu)? Daca nu, iti explic aici. Notatia era aceasta: n! si se citea n factorial. Cat este 5! ? Conform formulei n! = n * (n - 1)! rezultatul pentru 5! va fi: 5 * 4 * 3 * 2 * 1 = 120 Detaliez aici rezolvarea: 5! = 5 * (5 - 1)! = 5 * 4! unde 4! = 4 * (4 - 1)! = 4 * 3! unde 3! = 3 * (3 - 1)! = 3 * 2! unde 2! = 2 * (2 - 1)! = 2 * 1! unde 1! = 1 Acum daca inlocuim: 5! = 5 * (5 - 1) * (4 - 1) * (3 - 1) * (2 - 1) = 5 * 4 * 3 * 2 * 1 De aici ajungem la: 5! = 120 Cum poti face asta in programare? Creand o metoda care este recursiva. O metoda recursiva este o functie care se apeleaza pe ea insasi, adica se autoapeleaza. Atunci cand cream o astfel de metoda, primul lucru de care trebuie sa tinem cont este ca aceasta metoda sa contina cel putin o conditie de oprire. Odata ce se ajunge la indeplinirea conditiei de oprire, metoda nu se va mai apela, astfel se va opri recursivitatea. def fact(n): if n == 1: return 1 else: return (n * fact(n - 1))
_____________________________________________________________________ 86
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
print(fact(5))
Aici in cod am aplicat exact rezolvarea unui factorial. Daca am apela 1!, adica in loc de fact(5) am scrie fact(1) functia recursiva nu ar avea sansa sa se autoapeleze. Daca in schimb am apela 2!, functia s-ar autoapela singura o data (pentru ca prima apelare are loc dupa functia de print). Astfel atunci cand se apeleaza functia pentru 5! pana cand se ajunge la apelarea fact(1), iar aici functia va returna 1.
4) Functia main() Exista mai multe moduri de a rula un program: a) Sub forma unui script - parcurgand secvential: un script in Python este un fisier pe care vrei sa il executi din linia de comanda pentru a realiza o sarcina. Modul in care ii spui calculatorului sa execute cod din linia de comanda este usor diferit in functie de sistemul de operare al fiecaruia. Pe Linux si macOS, linia de comanda arata ca in exemplul de mai jos: user@python:~/Documents$
Partea dinaintea semnului $ poate arata diferit, in functie de numele de utilizator. Comenzile pe care le tastati vor fii dupa $. Pe Windows, linia de comanda arata de obicei ca in exemplul de mai jos: C:\Users\user\Documents>
Partea de dinainte de semnul > poate arata diferit, în functie de numele de utilizator. Comenzile pe care le tastati vor fii după acest semn >. b) Import din module si folosire functii: un modul in Python este un fisier pe care doresti sa il importi intr-un alt modul sau intr-un script. De multe ori, este necesar sa importam module construite deja pentru a ne face munca mai usoara, iar aceasta se face prin cuvantul cheie: import. In timpul procesului de importare, Python executa instructiunile definite in modulul specificat.
_____________________________________________________________________ 87
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
c) Rularea programului printr-un fisier in care exista o ordine specifica a lucrurilor de executie. Acest mod se face prin folosirea functiei main(). Este un fisier care contine cod si are extensia: .py
def main(): print("main code") def func(): print("func") func() if __name__ == "__main__": main()
Python nu atribuie nicio semnificatie unei functii numite “main”, dar tinand cont ca alte limbaje de programare folosesc functia main pentru a defini functia principala, cea mai buna practica este de a defini functia principala din cod: main, iar functia main trebuie sa contina orice cod pe care doresti sa il rulezi, atunci cand Python executa fisierul. Ca idee principala, ar trebui denumita functia principala: “main” pentru a comunica intentia functiei, chiar daca Python nu atribuie vreo semnificatie acestui nume, iar ca structura pentru cod, daca doresti sa refolosesti o anumita functie din cod, ii poti defini logica in afara functiei main, iar apoi sa o apelezi in interiorul functiei main ca in exemplul de mai jos: def produs(): print(2*3) def func(): print("func1") def main(): produs() func() main()
_____________________________________________________________________ 88
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Exercitii Dupa cum te-ai obisnuit pana acum, la fiecare final de capitol iti pun la dispozitie un set de exercitii pe care tu sa le practici. 1) Scrie un program ce foloseste o functie care gaseste cel mai mare numar dintre 3 numere date. 2) Scrie un program ce foloseste o functie cu ajutorul careia putem obtine inversul unui String dat. 3) Scrie un program ce testeaza daca un numar este prim sau nu. Un numar prim este acela care nu se poate imparti exact la niciun numar.
_____________________________________________________________________ 89
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Capitolul 5 - Structuri de Date in Python In acest capitol si in urmatorul vom discuta despre elementele fundamentale din programare care ne fac viata mai usoara atunci cand lucram cu date: structurile de date. La sfarsitul acestui capitol iti va fi mult mai clar ce sunt acestea, unde si cand le poti folosi si mai ales de ce sa le folosesti.
Ce sunt structurile de date? Structurile de date sunt fix ceea ce sugereaza titlul: structuri de date. Sunt anumite tipuri de date speciale care ne ajuta pe noi sa le structuram si sa le manipulam in functie de obiectivul nostru. Mai exact, structurile de date reprezinta o grupare de date care sunt organizate, stocate si manage-uite cu scopul de face accesul si modificarea (datelor) cat mai eficienta si mai usoara. Fiecare structura de date (ex: stive, cozi, vectori etc.) are un comportament, un mod de acces la date si functii specifice. Utilizarea acestora depinde foarte mult de context si, bineinteles, de problema care se doreste a fi rezolvata. In cele ce urmeaza vom discuta mai multe despre acestea, dar mai intai hai sa vedem de cate tipuri pot fi aceste structuri de date.
Tipuri de structuri de date Cand vine vorba de structuri de date, avem mai multe tipuri din care putem alege in functie de nevoie. Iti voi enumera cateva dintre cele mai des folosite, dupa care vom incepe sa discutam (si sa le folosim) pe fiecare in parte: • Listele reprezinta un tip de structuri de date care permit ordonarea si schimbarea elementelor din cadrul ei. In cadrul eipot exista elemente duplicate. • Tuple (perechi) reprezinta un tip de structuri de date ordonata si neschimbabile. In cadrul ei pot exista elemente duplicate. • Dictionarul reprezinta un tip de structuri de date care nu este ordonata, modificabila si indexata. In cadrul ei nu pot exista elemente duplicate. • Set-ul (multimile) reprezinta un tip de structuri de date neordonata si neindexata. In cadrul ei nu pot exista elemente duplicate.
_____________________________________________________________________ 90
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Acestea reprezinta structurile de date existente by default in Python. Pe langa acestea mai exista multe altele care fie au fost implementate deja, fie necesita implementare proprie (cum ar fi grafurile, arborii, cozile si altele). In general vei gasi module existente prin care te poti folosi de implementari eficiente ale acestora. Un aspect important pe care trebuie sa-l avem in considerare este faptul ca fiecare structura de date are rolul sau si utilitatea potrivita in anumite contexte. De exemplu, daca dorim sa stocam mai multe elemente si sa le accesam recurent (prin cautare), ar fi mai util sa utilizam un anumite structuri (dictionare sau multimi), in schimbul altora. De ce? Pentru ca timpii de accesare/cautare sunt mult redusi fata de alte structuri (liste, dictionare, set-uri etc.). Acum haide sa le luam pe rand si sa vorbim despre fiecare in parte.
_____________________________________________________________________ 91
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
1) Liste Lista este o structura de date care poate retine mai multe valori. Spre exemplu, intr-o lista, variabila a poate sa fie un integer, un string, dar nu ambele in acelasi timp. Declararea acestor siruri este foarte simpla, fiind asemanatoare cu declararea unei simple variabile. Deosebirea dintre o variabila si o lista, este ca variabila poate sa aiba alocata o singura valoare pe cand unei liste ii pot fi alocate mai multe valori. Intr-o lista, variabila a poate avea valorile 1, 2, 3, 4 (aka. de tip numeric) si asa mai departe, dar si valoarea “Salut”, “bun venit”, “next level”, (aka. de tip string) etc. Cel mai bun exemplu de lista este feed-ul de Facebook si contactele din dreapta, ce sunt asezate intr-o ierarhie. Mai poti identifica o lista si intr-o baza de date, unde un sir de intrari, fiecare cu elementele lui, este de fapt, o lista. Elementele din cadrul unei liste sunt numerotate de la 0 si pot fi accesta printr-un index (numarul pozitiei pe care acesta se afla). Daca lista are 10 elemente in cadrul ei, atunci acestea vor fi numerotate de la 0 la 9 si vor putea fi accesate in felul urmator:
Figura 5.1
arr = [1,2,3,4,5,6,7,8,9,10] print(arr[0]) print(arr[5]) print(arr[9])
Rezultatul afisat va fi: 1 6 10
NOTA: termenul de arr vine de la array (aka. sir), un tip de structura de date, care in Python este asociata cu listele (practic sunt acelasi lucru in acest limbaj de programare)
_____________________________________________________________________ 92
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Dupa cum am spus si mai devreme, in programare numaratoarea incepe de la 0, astfel prima pozitie a variabilei noastre "arr", declarata cu 10 pozitii este 0, iar ultima este 9. Atribuirea valorilor a unei anumite pozitii se face prin index (ex: [3], [5] ), care este valoarea aflata in parantezele drepte si determina pozitia careia ii va fi atribuita valoarea dorita.
Care sunt functiile unei Liste? Valorile unei liste pot fi modificate (prin adaugarea, actualizarea sau stergerea elementor din cadrul ei). Exista numeroase operatiuni care se pot face cu listele, atat prin operatori cat si prin functii built-in. Iata mai jos o parte dintre ele: .append(value) – adauga un element la sfarsitul listei • .insert(index, value) – adauga un element la indexul specificat • .pop(value) – sterge elementul din lista si il returneaza • .remove(value) – sterge element din lista • .sort() – sorteaza lista crescator, by default • .reverse() - inverseaza ordinea din lista •
Pe langa aceastea mai putem include urmatoarele operatii: • • • • •
Accesarea valorilor Concatenarea Repetitia Iterarea Apartenenta
Cum folosim o lista in Python? In continuare vom vedea cateva moduri de a pune in practica functiile acestei structuri de date. Mai intai sa definim o lista: #Definirea si accesarea valorilor dintr-o lista listX = ['AI&ML', 'TensorFlow', 1991, 2022] listZ = [1, 2, 3, 4, 5, 6, 7] print("listX[0]: ", listX[0]) print("listZ[1:5]: ", listZ[1:5]) print("listX[-1]: ", listX[-1])
_____________________________________________________________________ 93
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Rezultatul va fi: listX[0]: AI&ML listZ[1:5]: [2, 3, 4, 5] listX[-1]: 2022
In continuare vom aborada functiile discutate in sectiunea de mai devreme prin urmatoarea secventa de cod: #Concatenarea listA = [1, 2, 3] listB = [4, 5, 6] print(listA + listB) #Lungimea print("Lungimea tuplului este:",len(listA)) #Repetitia listR = ["RO"] * 3 print(listR) #Iterarea for x_list in [1, 2, 3]: print(x_list) #Apartinerea print(3 in [1, 2, 3]) print(9 in listB) #Folosirea functiilor specifice listelor print("Old:",listX) listX.append("Data Science") print("New:",listX) listX.insert(2, "Test value") print("New 2.0:",listX) ret = listX.pop(3) print("New 3.0:",listX) print("Valoarea returnata si eliminata din lista este", ret)
_____________________________________________________________________ 94
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
newList = listA + listB print("Lista generata ", newList) newList.reverse() print("Lista reversed ",newList) newList.sort() print("Lista sortata ", newList) newList.remove(2) print("New list: ", newList)
Rezultatul rularii secventei de cod de mai sus va fi: [1, 2, 3, 4, 5, 6] Lungimea tuplului este: 3 ['RO', 'RO', 'RO'] 1 2 3 True False Old: ['AI&ML', 'TensorFlow', 1991, 2022] New: ['AI&ML', 'TensorFlow', 1991, 2022, 'Data New 2.0: ['AI&ML', 'TensorFlow', 'Test value', New 3.0: ['AI&ML', 'TensorFlow', 'Test value', Valoarea returnata si eliminata din lista este Lista generata [1, 2, 3, 4, 5, 6] Lista reversed [6, 5, 4, 3, 2, 1] Lista sortata [1, 2, 3, 4, 5, 6] New list: [1, 3, 4, 5, 6]
Science'] 1991, 2022, 'Data Science'] 2022, 'Data Science'] 1991
_____________________________________________________________________ 95
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Exercitii Si acum sa trecem la partea de exercitii in care ne vom "juca" cu listele in Python. 1) Sa spunem aceasta lista salvata intr-o variabila: a = [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]. Scrieti o linie de Python care ia aceasta lista a si face o lista noua care contine doar elementele pare ale acestei liste. Iar acum un exercitiu putin mai complex: 2.1) Creati o lista cu numele a 10 prieteni (numele nu trebuie sa fie distincte). Respectand ordinea, rezolvati urmatoarele cerinte: Sortati lista de nume. • Utilizand o lista auxiliara, determinati numarul de aparitii al fiecarui nume. • Determinati numele care apare de cele mai multe ori in lista initiala. • Determinati numele care apar cel mai putin ori in lista initiala. • Revenind la lista initiala de nume, inversati ordinea elementelor. •
2.2) Formati perechi de cate 2 persoane cu numele din lista initiala si impartiti aceste perechi (in mod egal) in 2 liste. Asigurati-va ca acestor perechi nu li se poate modifica valoarea (hint: tupluri). Avand aceste perechi, calculati numarul total de caractere pentru fiecare pereche in parte si creati o lista noua in care sa le introduceti in ordine descrescatoare. Si putina matematica... 3) Scrieti un script care afiseaza in consola toate numerele pare divizibile cu 7 din intervalul [0, 3463]. Sugestie: folositi functia range(). Ajustati codul astfel incat la aparitia primului multiplu al lui 666, algoritmul sa se opreasca.
_____________________________________________________________________ 96
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
2) Tupluri (Tuples) Acest concept este similar cu cel de liste, dar contine cateva diferente. Din momentul ce listele sunt structuri de date ce pot tine mai multe valori ale integer-urilor si string-urilor, tuplurile fac acelasi lucru, doar ca acestea sunt imutabile. Asta inseamna ca datele din ele nu pot fi modificate/actualizate, ci doar citite. Scopul lor este sa genereze o variabila cu mai multe date care pot fi doar citite (read-only). In cazul tuplurilor, valorile si pozitiile acestora sunt foarte clar definite si nu mai pot fi schimbate (adaugate, modificate sau sterse).
Care sunt functiile unui tuplu in Python? Pe scurt, tuplurile sunt un tip de structura de date care permit multimi de elemente ordonate, care nu se pot modifica si in care pot exista elemente duplicate (spre deosebire de set-uri despre care vom discuta in sectiunea urmatoare). Astfel, tuplurile au cateva functii de baza care permit introducerea datelor, modificare sau stergerea datelor intr-un mod indirect cu ajutorul listelor (vom vedea imediat cum) In continuare, hai sa aruncam o privire peste o parte din functiile disponibile pentru tupluri: •
len() sau .count () – intoarce numarul de elemente existente in tuplu
•
.index (valoare)– intoarce valoarea unui aflata la o pozitie specifica din tuplu
Pe langa aceastea mai putem include urmatoarele operatii: •
Accesarea valorilor
•
Concatenarea
•
Repetitia
•
Iterarea
•
Apartenenta
Cum folosim un tuplu in Python? In continuare vom vedea cateva moduri de a pune in practica functiile acestei structuri de date. Mai intai sa definim un tuplu:
_____________________________________________________________________ 97
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
#Definirea si accesarea valorilor unui tuplu food_tuple = ("Paste", "Banane", "Lava Cake", "Smoothie") print(food_tuple) print("Vreau sa mananc", food_tuple[1])
Rezultatul va fi: ('Paste', 'Banane', 'Lava Cake', 'Smoothie') Vreau sa mananc Banane
Pentru a folosi functiile discutate in sectiunea anterioara vom prelua exemplul de mai sus si il vom rescrie (si dezvolta) astfel: print("\n#Parcurgerea elementelor unui tuplu folosind o bucla for\n") for food in food_tuple: print("Astazi am pofta de:", food) #De asemenea, in cazul tuplurilor exista mai multe operatii care pot avea loc: #Secventierea tupX = ('Python', 'Jupiter', 1999, 2025) tupZ = (1, 2, 3, 4, 5, 6, 7 ) print("tupX[0]: ", tupX[0]) print("tupZ[1:5]: ", tupZ[1:5]) #Concatenarea tupA = (1, 2, 3) tupB = (4, 5, 6) print(tupA + tupB) #Lungimea print("Lungimea tuplului este:",len(tupA)) #Repetitia tupR = ("RO") * 3 print(tupR) #Iterarea for x_tuple in (1, 2, 3): print(x_tuple) #Apartenenta
_____________________________________________________________________ 98
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
print(3 in (1, 2, 3)) print(9 in tupB) #Stergerea del tupR
Rezultatul rularii secventei de cod de mai sus va fi: #Parcurgerea elementelor unui tuplu folosind o bucla for Astazi am pofta de: Paste Astazi am pofta de: Banane Astazi am pofta de: Lava Cake Astazi am pofta de: Smoothie tupX[0]: Python tupZ[1:5]: (2, 3, 4, 5) (1, 2, 3, 4, 5, 6) Lungimea tuplului este: 3 RORORO 1 2 3 True False Traceback (most recent call last): File "main.py", line 386, in print (tupR) NameError: name 'tupR' is not defined
_____________________________________________________________________ 99
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Exercitii Iar acum sa ne reintoarcem la partea practica: 1) Scrie un program care verifica daca un element exista intr-un tuplu. 2) Scrie un program ce sorteaza un tuplu dupa numere reale(cu virgula). 3) Scrie un program ce calculeaza produsul elementelor unui tuplu.
_____________________________________________________________________ 100
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
3) Multumi (Set) in Python Multimile (Set) in Python reprezinta un tip de structura de date care permite organizarea datelor (de orice tip) intr-un format neordonat, nemodificabil si care nu permite valori duplicate. In momentul in care dorim ca fiecare valoarea introdusa in acesta structura de date sa fie unica (si nemodificabila), atunci set-urile pot fi unul dintre instrumentele de care avem nevoie pentru a ne face munca mai usoara. Modul prin care putem defini un set (o multime) in Python este urmatorul: vacation_set = {"Bora Bora", "Las Vegas", "Tenerife"} print (vacation_set)
Cu urmatorul rezultat afisat pe ecran: {'Tenerife', 'Bora Bora', 'Las Vegas'}
Care sunt functiile unei multimi (set) in Python? Set-urile au cateva functii de baza care permit introducerea datelor in acestea, cautarea acestora, stergerea lor etc. In continuare, hai sa aruncam o privire peste o parte din functiile disponibile pentru set-uri: •
.add (valoare)– adauga un element in set
•
.pop ()– sterge un element aleator din set
•
remove (valoare)– sterge un element specific din set
•
.update (set) - actualizeaza set-ul curent cu un alt set (sau cu o lista)
•
.union (set1, set2, ...) - intoarce un set care reprezinta unirea a doua sau mai
multe seturi •
.clear () - sterge toate elementele din set
Pe langa aceste functii, exista multe altele, dar am considerat ca acestea sunt cele de baza cu ajutorul carora vei putea profita de utilitatea acestei structuri de date.
_____________________________________________________________________ 101
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Cum folosim un set in Python? In continuare vom vedea cateva moduri de a pune in practica functiile acestei structuri de date. Dupa cum am spus si mai devreme, set-urile nu permit stocarea de valori duplicate (chiar daca acestea sunt definite): vacation_set = {"Bora Bora", "Las Vegas", "Tenerife", "Las Vegas"} print(vacation_set)
Ele vor fi eliminate din structura: {'Tenerife', 'Bora Bora', 'Las Vegas'}
Pentru a folosi functiile discutate in sectiunea anterioara vom prelua exemplul de mai sus si il vom rescrie (si dezvolta) astfel: print("\n#Adaugarea unui element in set\n") vacation_set.add("San Torini") vacation_set.add("Las Vegas") #incercam sa adaugam un element care exista deja print(vacation_set) print("\n#Stergerea unui element din set\n") vacation_set.remove("Bora Bora") print(vacation_set) print("\n#Actualizarea a unui set cu o lista (se poate aplica si intre doua seturi)\n") lista_vacante = ["Bali", "Monaco", "Fiji", "Australia", "Bali"] print(lista_vacante) vacation_set.update(lista_vacante) print(vacation_set) print("\n#Uniunea a doua set-uri\n") ro_vacations = {"Brasov", "Maramures", "Constanta", "Hateg"} wish_list_vacations = vacation_set.union(ro_vacations) print(wish_list_vacations) print("\n#Parcurgerea elementelor unui set folosind o bucla for\n") current_year = 2021 for loc in wish_list_vacations: print("Am in plan sa calatoresc in " + loc + " in anul " + str(current_year)) current_year = current_year + 1 print("\n#Stergerea valorilor dintr-un set\n")
_____________________________________________________________________ 102
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
wish_list_vacations.clear() print(wish_list_vacations)
Rezultatul afisat in urma rularii secventei de mai sus este urmatorul: #Adaugarea unui element in set {'San Torini', 'Bora Bora', 'Tenerife', 'Las Vegas'} #Stergerea unui element din set {'San Torini', 'Tenerife', 'Las Vegas'} #Actualizarea a unui set cu o lista (se poate aplica si intre doua seturi) ['Bali', 'Monaco', 'Fiji', 'Australia', 'Bali'] {'Monaco', 'Tenerife', 'San Torini', 'Australia', 'Fiji', 'Bali', 'Las Vegas'} #Uniunea a doua set-uri {'Monaco', 'Tenerife', 'Maramures', 'San Torini', 'Australia', 'Hateg', 'Constanta', 'Fiji', 'Brasov', 'Bali', 'Las Vegas'} #Parcurgerea elementelor unui set folosind o bucla for Am Am Am Am Am Am Am Am Am Am Am
in in in in in in in in in in in
plan plan plan plan plan plan plan plan plan plan plan
sa sa sa sa sa sa sa sa sa sa sa
calatoresc calatoresc calatoresc calatoresc calatoresc calatoresc calatoresc calatoresc calatoresc calatoresc calatoresc
in in in in in in in in in in in
Australia in anul 2021 San Torini in anul 2022 Constanta in anul 2023 Tenerife in anul 2024 Brasov in anul 2025 Hateg in anul 2026 Monaco in anul 2027 Maramures in anul 2028 Las Vegas in anul 2029 Fiji in anul 2030 Bali in anul 2031
#Stergerea valorilor dintr-un set set()
_____________________________________________________________________ 103
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Exercitii Si acum sa trecem la partea de exercitii in care ne vom "juca" cu set-urile in Python: 1) Scrie un program in care sa stergi toate elementele dintr-o structura de tip set. 2) Scrie un program care verifica daca 3 structuri de tip set nu au elemente in comun luate fiecare cu fiecare. Daca nu au se afiseaza “TRUE”, altfel “FALSE” 3) Scrie un program ce gaseste elementele dintr-o structura de date de tip set ce nu se gaseste in alta data.
_____________________________________________________________________ 104
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
4) Dictionare Ce este si cum functioneaza un dictionar? In programare dictionarele reprezinta un sir de elemente care stocheaza o pereche de “(cheie, valoare)”. Astfel pentru fiecare cheie (unica) in parte va fi alocata o anumita valoare (care nu trebuie sa fie unica). Cheile trebuie sa fie unice pentru ca dictionarul foloseste o tehnica numita hashing. Hashing-ul este o metoda (un algoritm) prin care se genereaza o valoarea numerica (aka. hash), care identifica in mod unic acea cheie. Aceasta tehnica permite ca accesarea elementelor dintr-un dictionar sa fie facuta extrem de rapid in comparatie cu alte structuri de date. Motivul se datoreaza acestui hash, care permite dictionarului sa acceseze direct (aproape instant) indexul unde se afla perechea de (cheie, valoare) care doreste a fi accesata.
Figura 5.2 In figura 5.2 de mai sus poti sa vezi structura dictionarului (care contine mai multe casute - noduri) si structura fiecarui nod in parte (care este alcatuit dintr-un hash, o cheie, o valoarea si adresa - locul unde se afla in memorie - urmatorului nod). Gasesti in figura de mai jos o ilustratie prin care vei putea intelege mai bine cum are loc maparea perechii cheie - valoarea intr-un dictionar din Python.
_____________________________________________________________________ 105
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 5.3
Care sunt functiile unei dictionar in Python? Dictionarele au cateva functii de baza care permit introducerea perechilor de cheie valoare, cautarea acestora, stergerea lor etc. In Python nu exista o functie specifica pentru adaugarea elementelor intr-un dictionar (vom vedea in detaliu cum putem face asta in sectiunea urmatoare). In continuare, hai sa aruncam o privire peste o parte din functiile disponibile pentru dictionare: •
.pop (cheie)– sterge elementul din dictionar care se afla la si il returneaza.
•
.get (cheie) – intoarce elementul din dictionar care se afla la nodul a
efectua nicio modificare asupra acesteia. •
.items () - intoarce o lista de tupluri (formate din perechea - cheie - valoare) cu
elementele din dictionar •
.len (dictionar) - intoarce dimensiunea dictionarului
•
.clear () - sterge toate elementele din dictionar
Pe langa aceste functii, exista multe altele, dar am considerat ca acestea sunt cele de baza cu ajutorul carora vei putea profita de utilitatea acestei structuri de date.
_____________________________________________________________________ 106
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Cum folosim un dictionar in Python? Haide acum sa cream un dictionar si sa-l folosim intr-un exemplu practic. Sa presupunem ca dictionarul nostru va fi alcatuit dintr-o pereche cheie-valoare de tip string (numele unei persoane), respectiv integer (suma de bani disponibila in contul bancar): dictionarul_meu = { "cheie_1": "valoare_1", "cheie_2": "valoare_2" } print(dictionarul_meu)
Rezultatul codului de mai sus va fi: {cheie_1: valoare_1, cheie_2: valoare_2}
In continuare, vom folosi prin exemple practice functiile discutate in sectiunea de mai devreme: print("#Crearea dictionarului - reprezinta nume si contul bancar in EUR ale unor persoane\n") dictionarul_meu = { "Marius": 4832, "Ionel": 683 } print(dictionarul_meu) print("\n#1 - Adaugarea elementelor in dictionar\n") dictionarul_meu["Adi"] = 2149 print("Dictionarul actualizat 1.0:\n", dictionarul_meu) dictionarul_meu["Ana"] = 3434 dictionarul_meu["Alex"] = 1204 dictionarul_meu["Dan"] = 1378 dictionarul_meu["Ion"] = 932 print("Dictionarul actualizat 2.0:\n", dictionarul_meu)
_____________________________________________________________________ 107
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
print("\n#2 - Obtinerea valorii pe baza unei chei date\n") valoare_exA = dictionarul_meu["Adi"] print("Valoarea din contul lui Adi:", valoare_exA) #aici se foloseste metoda get() valoare_exB = dictionarul_meu.get("Adi") #se obtine acelasi rezultat ca in exemplul de mai sus print("Valoarea din contul lui Adi:", valoare_exB)
print("\n#3 - Modificarea elementelor (existente)\n") print("#Valoarea initiala din contul lui Adi: " + str(dictionarul_meu["Adi"]) + " EUR") dictionarul_meu["Adi"] = 7777 #valoarea initiala find 2149 print("#Valoarea din contul lui Adi: " + str(dictionarul_meu["Adi"]) EUR") print("##Valoarea initiala din str(dictionarul_meu["Ion"]) + " EUR") suma_initiala = dictionarul_meu["Ion"] suma_noua = suma_initiala * 2 dictionarul_meu["Ion"] = suma_noua print("##Valoarea actualizata din str(dictionarul_meu["Ion"]) + " EUR")
contul
contul
lui
lui
Ion:
Ion:
+ "
"
+
"
+
print("\n#4 - Parcurgerea dictionarului prin folosirea buclei for\n") key = dictionarul_meu.items() for key in dictionarul_meu: print("Suma de bani disponibila din contul lui " + key + " este "+ str(dictionarul_meu[key]) + " EUR") print("\nAcordam un bonus pentru toata lumea...\n") #Adaugam 150 EUR in contul fiecarei persoane for key in dictionarul_meu: dictionarul_meu[key] = dictionarul_meu[key] + 150 print("NOUA Suma de bani disponibila din contul lui " + key + " este "+
_____________________________________________________________________ 108
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
str(dictionarul_meu[key]) + " EUR") print("\n#5 - Eliminarea elementelor\n") nr_elemente = len(dictionarul_meu) print("Dictionarul contine " + str(nr_elemente) + " elemente") dictionarul_meu.pop("Adi") print("Dictionarul fara Adi:\n", dictionarul_meu) nr_elemente = len(dictionarul_meu) print("Dictionarul contine " + str(nr_elemente) + " elemente") #se mai poate folosi si del del dictionarul_meu["Ion"] print("Dictionarul fara Adi si Ion:\n", dictionarul_meu) nr_elemente = len(dictionarul_meu) print("Dictionarul contine " + str(nr_elemente) + " elemente") #va sterge toate elementele din dictionar, pastrand variabila dictionarul_meu in memorie dictionarul_meu.clear() nr_elemente = len(dictionarul_meu) print("Dictionarul contine " + str(nr_elemente) + " elemente") #va sterge intregul dictionar si variabila dictionarul_meu din memorie del dictionarul_meu
Rezultatul codului de mai sus va fi: #Crearea dictionarului - reprezinta nume si contul bancar in EUR ale unor persoane {'Marius': 4832, 'Ionel': 683} #1 - Adaugarea elementelor in dictionar Dictionarul actualizat 1.0: {'Marius': 4832, 'Ionel': 683, 'Adi': 2149} Dictionarul actualizat 2.0:
_____________________________________________________________________ 109
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
{'Marius': 4832, 'Ionel': 683, 'Adi': 2149, 'Ana': 3434, 'Alex': 1204, 'Dan': 1378, 'Ion': 932} #2 - Obtinerea valorii pe baza unei chei date Valoarea din contul lui Adi: 2149 Valoarea din contul lui Adi: 2149 #3 - Modificarea elementelor (existente) #Valoarea initiala din contul lui Adi: 2149 EUR #Valoarea din contul lui Adi: 7777 EUR ##Valoarea initiala din contul lui Ion: 932 EUR ##Valoarea actualizata din contul lui Ion: 1864 EUR #4 - Parcurgerea dictionarului prin folosirea buclei for Suma Suma Suma Suma Suma Suma Suma
de de de de de de de
bani bani bani bani bani bani bani
disponibila disponibila disponibila disponibila disponibila disponibila disponibila
din din din din din din din
contul contul contul contul contul contul contul
lui lui lui lui lui lui lui
Marius este 4832 EUR Ionel este 683 EUR Adi este 7777 EUR Ana este 3434 EUR Alex este 1204 EUR Dan este 1378 EUR Ion este 1864 EUR
Acordam un bonus pentru toata lumea... NOUA NOUA NOUA NOUA NOUA NOUA NOUA
Suma Suma Suma Suma Suma Suma Suma
de de de de de de de
bani bani bani bani bani bani bani
disponibila disponibila disponibila disponibila disponibila disponibila disponibila
din din din din din din din
contul contul contul contul contul contul contul
lui lui lui lui lui lui lui
Marius este 4982 EUR Ionel este 833 EUR Adi este 7927 EUR Ana este 3584 EUR Alex este 1354 EUR Dan este 1528 EUR Ion este 2014 EUR
#5 - Eliminarea elementelor Dictionarul contine 7 elemente Dictionarul fara Adi: {'Marius': 4982, 'Ionel': 833, 'Ana': 3584, 'Alex': 1354, 'Dan': 1528, 'Ion': 2014}
_____________________________________________________________________ 110
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Dictionarul Dictionarul {'Marius': Dictionarul Dictionarul
contine 6 elemente fara Adi si Ion: 4982, 'Ionel': 833, 'Ana': 3584, 'Alex': 1354, 'Dan': 1528} contine 5 elemente contine 0 elemente
Nested dictionary Un dictionar poate avea ca elemente alte dictionare (situatie foarte des intalnita atunci cand lucram cu date transmise in format JSON). Scopul acestora este de a organiza si transmite datele de la un sistem catre altul astfel incat sa poata fi procesate rapid si usor de catre acestea, fara un consum mare de resurse. Sintaxa de baza pentru definirea unui astfel de dictionar este urmatoarea: nested_dict = { "d1": { 'cheie_1': 'valoare_1', 'cheie_2': 'valoare_2'}, "d2": { 'cheie_3': 'valoare_3', 'cheie_4': 'valoare_4'} } print(nested_dict) print(nested_dict["d1"]) print(nested_dict["d2"])
Si rezultatul in urma rularii acestei secvente de cod: {'d1': {'cheie_1': 'valoare_1', 'cheie_2': 'valoare_2'}, 'd2': {'cheie_3': 'valoare_3', 'cheie_4': 'valoare_4'}} {'cheie_1': 'valoare_1', 'cheie_2': 'valoare_2'} {'cheie_3': 'valoare_3', 'cheie_4': 'valoare_4'}
Iata mai jos un exemplu: nested_dict = { "d1": { 'cheie_1': 'valoare_1', 'cheie_2': 'valoare_2'}, "d2": { 'cheie_3': 'valoare_3', 'cheie_4': 'valoare_4'} } print(nested_dict) print(nested_dict["d1"]) print(nested_dict["d2"]) print("\nCrearea unui dictionar de tip nested\n")
_____________________________________________________________________ 111
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
date_personal = { "p1": { 'nume': 'Adi', 'venit': 1000, 'varsta': 28}, "p2": { 'nume': 'Emanuel', 'venit': 2750, 'varsta': 36}, "p3": { 'nume': 'George', 'venit': 1750, 'varsta': 31} } print(date_personal) print(date_personal["p1"]) print(date_personal["p2"]) print(date_personal["p3"]) print("\n#Adaugarea unui element\n") date_personal["p4"] = { 'nume': 'Gabi', 'venit': 0, 'varsta': 16, 'job': 'Internship'} print(date_personal) print("\n#Eliminarea unui element\n") del date_personal["p2"] print(date_personal)
Rezultatul secventei de cod de mai sus: Crearea unui dictionar de tip nested {'p1': {'nume': 'Adi', 'venit': 1000, 'varsta': 28}, 'p2': {'nume': 'Emanuel', 'venit': 2750, 'varsta': 36}, 'p3': {'nume': 'George', 'venit': 1750, 'varsta': 31}} {'nume': 'Adi', 'venit': 1000, 'varsta': 28} {'nume': 'Emanuel', 'venit': 2750, 'varsta': 36} {'nume': 'George', 'venit': 1750, 'varsta': 31} #Adaugarea unui element {'p1': {'nume': 'Adi', 'venit': 1000, 'varsta': 28}, 'p2': {'nume': 'Emanuel', 'venit': 2750, 'varsta': 36}, 'p3': {'nume': 'George', 'venit': 1750, 'varsta': 31}, 'p4': {'nume': 'Gabi', 'venit': 0, 'varsta': 16, 'job': 'Internship'}} #Eliminarea unui element
_____________________________________________________________________ 112
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
{'p1': {'nume': 'Adi', 'venit': 1000, 'varsta': 28}, 'p3': {'nume': 'George', 'venit': 1750, 'varsta': 31}, 'p4': {'nume': 'Gabi', 'venit': 0, 'varsta': 16, 'job': 'Internship'}}
Cand folosim dictionarele si ce aplicabilitate practica au? Dictionarele sunt folosite in tabelele de rutare pentru ca routerele trebuie sa decida unde sa trimita traficul: catre retea sau catre portul spre care poate trimite. Dictionarele sunt folosite: • In retelistica, pe Routere, in crearea tabelelor de rutare. • In cadrul API-urile pentru transmiterea informatiilor intre sisteme (de obicei in format JSON) • In stocarea parolelor in baza de date. Deoarece parolele sunt criptate, ele au un hash stocat in baza de date. In momentul in care tu trimiti parola, serverele lucreaza sa o puna intr-o functie si intr-un hash. Cheia este parola, hash-ul este valoarea acelei chei, deci acesta este un alt exemplu de dictionar.
_____________________________________________________________________ 113
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Exercitii Iar acum sa ne reintoarcem la partea practica: 1.1) Creati cu ajutorul unui dictionar o baza de date la care sa retineti numerele de telefon a 10 prieteni. 1.2) Afisati intrarile din aceasta baze de date in ordine alfabetica, dupa nume. 2) Scrieti un program pentru a obtine (sortate dupa pret) primele 3 produse dintr-un online magazin. Produse magazin: {'Pantofi': 45.50, 'Geaca': 35, 'Pulover': 41.30, 'Sacou': 55, 'Tricou': 24} Rezultatul dorit: Sacou 55 Pantofi 45.5 Pulover 41.3 3) Scrieti un program prin care sa obțineți cheia, valoarea și pozitia unui element dintr-o structura de date de tip dicționar.
_____________________________________________________________________ 114
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Capitolul 6 - Programare Orientata pe Obiecte in Python 1) Concepte teoretice despre POO POO (Programare Orientata pe Obiecte) sau OOP (Object Oriented Programming) este o paradigma de programare care foloseste concepte abstracte (sub forma de clase si obiecte) pentru a crea modele bazate pe elemente din lumea reala. O aplicatie construita pe POO foloseste mai multe obiecte care comunica prin mesaje specifice pentru a rezolva diverse servicii (ale aplicatiei) solicitate. Aceste obiecte sunt capabile sa trimita mesaje (date), sa primeasca mesaje (date) si sa proceseze date. Scopul programarii orientate pe obiecte este de a incerca sa creasca flexibilitatea si mentenabilitatea programelor. Deoarece programele create folosind un limbaj orientat pe obiecte (cum este Java, Python, C++, etc.) sunt modulare, ele pot fi mai usor de dezvoltat si mai usor de inteles dupa dezvoltare.
POO vs. Programare Procedurala Programele sunt alcatuite din module. Aceste module pot fi programe de sine statatoare (independente) care pot fi dezvoltate (codate) si testate separat fata de programul initial (ulterior acestea - mai multe module - putand fi asamblate pentru a forma un program complet). In limbajele de programare procedurale (cum ar fi C si Pascal) aceste module sunt de fapt proceduri, adica o secventa de instructiuni. In limbajul C, procedurile sunt functii care au un set clar de instructiuni (de tipul if, for, while etc.) cu scopul de a intoarce (sau nu) un rezultat (al acelei functii). In programarea procedurala se ia problema (care se doreste a fi rezolvata) si se sparge in mai multe bucati (sub proceduri). Astfel sub-procedurile rezolva bucati mai mici din problema initiala. Lucrurile continua asa pana cand problemele secundare (bucatile mai mici) sunt suficient de simple pentru a fi rezolvate de sub-procedura corespunzatoare ei. Dificultatea cu acest tip de programare consta in faptul ca intretinerea software-ului poate fi dificila si consumatoare de timp. Atunci cand se efectueaza modificari ale procedurii principale, aceste modificari pot intra in cascada, iar schimbarea poate avea un impact major asupra tuturor procedurilor din programul initial. O alternativa la programarea procedurala este programarea orientata pe obiecte. Scopul POO este cel de a rezolva dificultatile legate de programarea procedurala. In POO principalele module _____________________________________________________________________ 115
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
dintr-un program sunt clase, mai degraba decat proceduri. POO ne permite sa ne cream clase si obiecte care modeleaza elementele din lumea reala.
Din ce este compusa programarea orientata pe obiecte? Dupa cum poti vedea si in figura 6.1 de mai jos, programarea orientata pe obiecte este alcatuita din urmatoarele elemente:
Figura 6.1
● ● ● ● ● ●
Obiecte Clase Mostenirea (claselor) Polimorfism Abstractizarea (claselor) Incapsularea (claselor)
_____________________________________________________________________ 116
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
a) Obiecte si Clase in POO O clasa este o colectie de obiecte care au proprietati, operatii si comportamente comune. O clasa este o combinatie de stari (date) si de comportamente (metode). In POO o clasa este un tip de date, iar obiectele sunt instante ale acestui tip de date. In urmatoarea sectiune vom discuta in detaliu despre acest subiect.
b) Mostenirea claselor in POO Mostenirea (Inheritance) unei clase X de catre o clasa Y ii ofera acesteia posibilitatea de a imprumuta metodele si atributele existenta in clasa (parinte) X. Putem lua exemplul unui autoturism, marca BMW care are la baza foarte multe elemente comune cu alte autoturisme (Mercedes, Audi, Porsche etc), dar in acelasi timp are si elemente unice, specifice marcii BMW. Acesta este un exemplu cand un BMW mosteneste caracteristicile unui autoturism (marca, caroserie, roti, culoare, viteza maxima, capacitate motor, combustibil folosit etc.).
c) Polimorfismul in POO Polimorfism-ul reprezinta "a avea mai multe forme" si apare in momentul in care folosim mostenirea. Practic polimorfismul ne ofera posibilitatea de a folosi metodele mostenite sub mai multe forme, in functie de rezultatul pe care il dorim (astfel codul nostru devenind mai flexibil). Acest lucru ne ofera avantajul de a face un lucru in mai multe moduri. In concluzie, mostenirea ne ofera posibilitatea de a folosi atributele si metodele clasei parinte, in timp ce polimorfismul ne ofera posibilitatea de a folosi metodele mostenite sub mai multe forme pentru a obtine rezultate diferite. Acest lucru se face prin overloading (supraincarcare) si overriding (suprascriere).
d) Abstractizarea in programarea orientata pe obiecte Procesul de abstractizare a datelor are legatura cu ascunderea anumitor elemente care compun clase (care de obicei reprezinta aspecte de detaliu) si punerea in evidenta a acelor informatii esentiale pentru un utilizator. Abstractizarea poate fi facuta fie prin clase abstracte, fie prin interfete. Mai multe detalii in capitolul urmator.
_____________________________________________________________________ 117
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
e) Incapsularea in programarea orientata pe obiecte Incapsularea ne asigura cu faptul ca ascunde informatii sensibile de catre utilizatori. In aceasta situatie ne referim in mod special la variabile, metode sau clase care pot avea atributul private. Se ascund anumite stari interne a obiectelor, devenind necesar ca toate interactiunile sa fie efectuate utilizand metodele obiectelor. Cu alte cuvinte, atributele unei clase nu vor putea fi accesate (si modificate) in mod direct, ele nefiind vizibile (pentru ca sunt private), dar modificarile vor putea fi facute prin intermediul metodelor.
Beneficiile POO Iata beneficiile principale pe care ni le ofera POO in comparatie cu programare procedurala: 1. Modularitatea: Codul sursa pentru o clasa poate fi scris si mentinut independent de codul sursa pentru alte clase. Odata creat, un obiect poate fi usor transferat in interiorul sistemului. 2. Securitatea ridicata la nivel de cod: Interactionand doar cu metodele obiectului, detaliile implementarii interne raman ascunse de lumea exterioara. 3. Reutilizarea codului: Daca o clasa exista deja, puteti utiliza in programul dvs. obiecte din acea clasa. Acest lucru permite programatorilor sa implementeze / testeze / sa faca depanare pe obiecte complexe, specifice pentru sarcini, pe care apoi le puteti folosi in propriul cod. 4. Debugging mai usor: Daca un anumit obiect se dovedeste a fi o problema, il puteti elimina din program si puteti adauga/conecta, ca inlocuitor, un obiect diferit. Acest lucru este similar cu rezolvarea problemelor mecanice in lumea reala. Daca un surub se rupe, il inlocuiti pe el, nu intreaga masina.
Un scurt rezumat al celor discutate mai sus 1. In POO totul este un obiect. 2. Calculul se realizeaza prin obiecte care comunica intre ele, solicitand ca alte obiecte sa efectueze actiuni. Obiectele comunica prin trimiterea si primirea de mesaje. Un mesaj este o cerere de actiune, insotita de oricate argumente care ar putea fi necesare pentru a finaliza sarcinile. 3. Fiecare obiect are propria sa memorie alocata de catre OS. 4. Fiecare obiect (odata initializat) devine o instanta a unei clase. O clasa reprezinta pur si simplu o grupare de obiecte similare care are un set specific de caracteristici si functii. _____________________________________________________________________ 118
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
2) Clase in Python O clasa este o colectie de obiecte care au proprietati, operatii si comportamente comune. O clasa este o combinatie de stari (date) si comportament (metode). In POO o clasa este un tip de date, iar obiectele sunt instante ale acestui tip de date. De exemplu, putem crea o clasa Persoana() care reprezinta o colectie care poate descrie (printr-un obiect) fiecare persoane in parte. Persoanele au un statut, cum ar fi inaltimea, greutatea, genul, culoarea parului etc.. Ei au, de asemenea, un anumit comportament, o anumita limba pe care o vorbesc, o mancare preferata. Toate aceste caracteristici despre oameni sunt incapsulate (continute) in clasa Persoana(). Dupa cum am spus mai devreme, un obiect (dupa ce a fost initializat) devine o instanta a unei clase. Obiectele sunt unitati de abstractizare. Un obiect poate comunica cu alte obiecte folosind mesaje. Un obiect transmite un mesaj unui alt obiect, ceea ce duce la invocarea unei metode. Obiectele efectueaza apoi actiunile necesare pentru a obtine un raspuns de la sistem. Obiectele din lumea reala au 2 caracteristici in comun: toate au o stare si un comportament. O metoda de a gandi intr-un mod orientat pe obiecte este de a identifica starea si comportamentul obiectelor din lumea reala. Complexitatea acestor obiecte poate sa difere, unele obiecte au mai multe stari si comportamente considerabil mai complexe decat alte obiecte. Compara starea si comportamentul unui TV cu starile si comportamentele unei masini, sunt total diferite. Obiectele unei clase, dpvd conceptual, sunt similare cu obiectele din lumea reala. Un obiect isi stocheaza starea in atribute (aka. Variabile ale clasei) si isi expune comportamentele prin metodele sale (aka. Functiile clasei). Vom vedea in cele ce urmeaza mai multe detalii (si exemple) despre acestea. Odata ce ai inteles mai multe lucruri despre POO si care este rolul acestui mod de structurare a datelor este timpul sa intram in partea concreta, practica, a lucrurilor. Pentru inceput vom relua definitia unei clase in Python, dupa care iti voi arata un exemplu de folosire a acestora.
_____________________________________________________________________ 119
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Cum definim o clasa in Python? In sectiunea aceasta ne vom defini printr-o clasa, propriul tip de date (cum este de exemplu: String, listele, etc.) care poate fi caracterizat asa cum vrem noi. NOTA: In momentul in care incepi sa lucrezi cu POO in Python iti recomand ca pentru fiecare clasa in parte pe care o definesti sa-ti creezi cate un fisier separat. Daca ai 3 clase diferite (ClasaA, ClasaB, ClasaC) iti recomand sa creezi trei fisiere diferite fiecare cu denumirea ClasaA.py, ClasaB.py, ClasaC.py astfel incat codul tau sa utilizeze principiile de best-practice pentru utilitatea si modularitatea lui. Iata mai jos cum definim o clasa in Python: class PrimaClasa: pass
Exemplul de mai sus defineste o clasa denumita PrimaClasa. In aceasta situatie, clasa nu va face nimic, dar noi putem incepe sa adaugam variabile (atribute) astfel: class PrimaClasa: primulSir = "Salut!" primulNr = 51 nrSecund = -21
Acum, odata ce am definit clsa si variabilele din ea, vom creea un obiect al acestei clase, iar apoi cu ajutorul lui sa folosim variabilele din clasa: obj = PrimaClasa()
Variabilele de clasa le vom apela pentru a le putea folosi astfel: print(obj.primulSir) print(obj.primulNr) print(obj.nrSecund) print(obj.primulNr - obj.nrSecund)
_____________________________________________________________________ 120
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
In acest exemplu eu am printat atributele clasei PrimaClasa, folosindu-ma de obiectul obj creat mai devreme si cu ajutorul notatiei cu . pentru a ma adresa direct fiecarui atribut in parte.
Exemplul #2 In acest exemplu vom extinde ce am invatat pana acum despre programare cu conceptul de clase pe care il studiem. Iata o clasa denumita ClasaPrincipala care contine un set de variabile (atribute) si functii (metode): class ClasaPrincipala: """Aceasta este o clasa cu scop introductiv""" varA_clasa = 12345 varB_clasa = 54321 def doSomething(self): print("Sunt aici sa-ti arat valoarea atributelor:", self.varA_clasa, self.varB_clasa ) def changeVar(self,var): var %= 10 return var obj = ClasaPrincipala() obj.doSomething() print("Valoarea lui varA_clasa este:", obj.changeVar(obj.varA_clasa)) print("Valoarea lui varA_clasa este:", obj.changeVar(obj.varB_clasa))
Codul scris mai sus reprezinta o clasa in care am definit o variabila si doua functii care realizeaza o anumite actiune. Lucrurile nu difera cu mult fata de cum faceam pana acum, tot ce este diferi consta in faptul ca acestea sunt parte din clasa ClasaPrincipala (si au indentarea corespunzatoare). Urmatorul pas, dupa crearea clasei are de a face cu crearea si definirea obiectelor prin structura obj = ClasaPrincipala() care indica faptul ca variabila obiect obj va insusi proprietatile clasei (asta inseamna ca va putea folosi atributele si metodele din acea clasa, exact cum apare in exemplul generat de ea). Rezultatul afisat este urmatorul: Sunt aici sa-ti arat valoarea atributelor: 12345 54321 Valoarea lui varA_clasa este: 5 Valoarea lui varB_clasa este: 1
_____________________________________________________________________ 121
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
NOTA: In Python (precum si in alte limbaje de programare de nivel inalt cum ar fi Java, C++, JavaScript etc.) avem la dispozitie un set de clase predefinite pe care le putem folosi. In toate aceste limbaje exista deja anumite functii, anumite grupari, anumite clase care au scopul de a ne ajuta pe noi sa ne eficientizam munca. Ce rost ar avea un limbaj de programare fara functiile definite de catre o comunitate, de catre persoanele care au dezvoltat acel limbaj? Fiecare limbaj are specificul lui si ne ajuta sa ne facem munca mult mai eficient in anumite arii. De exemplu, cand facem programare in Python, e mai usor sa facem aplicatii pentru telefoane sau pentru servere. Cand facem programare in PHP, va fi mult mai usor sa ne ocupam de partea de web pentru ca acest limbaj a fost optimizat si gandit pentru asa ceva. Programarea in C ne ajuta sa facem lucruri care tin de sistemul de operare sau de programarea placutelor hardware pentru ca acest limbaj este foarte rapid si asa a fost conceput. self: reprezinta instanta clasei. Folosind acest keyword putem accesa atributele si metodele unei clase clasei in Python.
3) Constructori si Destructori Acum ca ai inteles si ai vazut cum se folosesc clasele in Python, a venit momentul sa mergem mai departe si sa vorbim despre Constructori (si Destructori) in POO (aceste concepte se aplica la orice limbaj orientat pe obiecte si nu doar in Python).
Ce este un constructor in POO? Constructorul unei clase este o functie interna, speciala a acelei clase care este apelata in momentul in care se creeaza o instanta a acelei clase. De exemplu sa presupunem clasa Proiect: class Proiect: pass x = Proiect()
In momentul in care rulam programul, in background va fi apelat constructorul clasei Proiect care poate sa faca urmatoarele operatiuni: • Initializarea atributelor (variabilelor) clasei sau a celor date ca parametru • Alocarea memorie pentru acestea sau alte atribute ale clasei _____________________________________________________________________ 122
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
In exemplele care urmeaza vei vedea cum declaram constructorii unei clase si cum ii putem folosi pentru o alocare cat mai eficienta a resurselor.
Folosirea constructorilor in Python Pentru a-ti putea demonstra folosirea constructorilor in Python, vom crea o clasa Person prin care vom defini o persoana. Clasa Person va contine urmatoarele atribute principale care definesc o persoana: nume, varsta, gen, si CNP. Aceasta clasa, impreuna cu atributele care o compun, ne va ajuta sa colectam mai multe date despre persoanele care folosesc aplicatia (gandeste-te la o aplicatie de gestiune a clientilor, de exemplu). Iata un exemplu: in momentul in care vizitam un site web si introducem datele personale, in spate sunt anumite structuri sau clase ce iti cer acele date si le structureaza intr-un singur loc. Prin urmare, clasa Person ne va ajuta sa luam un cumul mare de date si sa le aranjam intr-un mod mai ordonat is mai clar, ca apoi sa putem interpreta si folosi informatia in diferite scopuri. Iar acum, sa definim variabilele impreuna cu constructorul nostru: class Person: def __init__(self, nume, varsta, gen, cnp): self.nume = nume self.varsta = varsta self.gen = gen self.cnp = cnp
In Python constructorul se defineste prin def __init__() urmat de argumentele sale. Te poti gandi la mai multe elemente care apartin unei persoane. Poti merge mult mai in detaliu, prin adaugarea altor caracteristici precum CNP, inaltime, studii etc. Acum vom creea un obiect ala acestei clase si il vom initializa cu valori astfel: persA = Person("Ramon", 25, "M", 194) print(persA.nume) print(persA.varsta) print(persA.gen) print(persA.cnp)
_____________________________________________________________________ 123
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Si rezultatul afisat va fi urmatorul: Ramon 25 M 194
De asemenea, in constructorul definit anterior putem trece o valoare default a atributelor definite in acesta, iar in momentul in care o instanta noua va fi creata (vezi urmatoarea secventa de cod), i se vor atribui aceste valori daca nu au fost definite altele: class Person: def __init__(self, nume = "Nimeni", varsta = 0, gen = "N/A", cnp = 0): self.nume = nume self.varsta = varsta self.gen = gen self.cnp = cnp
Daca rescriem obiectul fara a oferi valori specifice ca argumente: persB = Person() print(persB.nume) print(persB.varsta) print(persB.gen) print(persB.cnp)
Rezultatul va fi: Nimeni 0 N/A 0
Instanta persB este goala in momentul de fata (in sensul in care nu are atribuite valori catre atributele definite in clasa). Pentru a afisa pe ecran acest rezultat am fost nevoiti sa luam fiecare atribut in parte si sa-l printam pe ecran. Avem o metoda si mai eficienta de a face acest lucru prin definirea unei functii __str__, care practic ne permite sa _____________________________________________________________________ 124
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
customizam modul in care vrem sa printam obiectul din clasa noastra. Daca vrem sa printam datele persoanei A, vom creea in clasa Person urmatoarea functie: class Person: def __init__(self, nume = "Nimeni", varsta = 0, gen = "N/A", cnp = 0): self.nume = nume self.varsta = varsta self.gen = gen self.cnp = cnp def __str__(self): return 'Person(nume=' + self.nume + ', varsta=' + str(self.varsta) + ', gen=' + self.gen + ', cnp=' + str(self.cnp) + ')'
Prin return, am intors variabilele clasei Person ca fiind un String. Astfel, printand: print(persA)
si pe ecran va aparea: Person(nume=Ramon, varsta=25, gen=M, cnp=194)
Vom face acelasi lucru pentru persB, tot din: print(persB)
Pe ecran va fi afisat urmatorul text: Person(nume=Nimeni, varsta=0, gen=N/A, cnp=0)
In primul exemplu va aparea numele ca avand valoarea “Nimeni” pentru ca asa a fost definit in primul constructor.
_____________________________________________________________________ 125
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Ce este un destructor in POO? Daca un constructor este folosit pentru initializarea variabilelor si alocarea de memorie pentru diferiti membri ai clasei, atunci destructorul este o componenta apelata in momentul in care se termina executia codului pentru dealocarea obiectului din memorie. Astfel gestiunea memorie va fi corect facuta (memoria alocata initial, fiind eliberata pentru folosirea acesteia de catre alte programe). In Python nu este necesara crearea unui destructor pentru ca acest proces are loc automat in momentul in care se termina executia programului.
4) Encapsularea elementelor dintr-o clasa in Python Intr-un limbaj de programare orientat pe obiecte (asa cum este si Python) poti restrictiona accesul la variabilele si metodele unei clase. Cateva dintre motivele pentru care dorim sa facem acest lucru sunt urmatoarele: • Pentru a evita accesul direct sau modificarea variabilelor unei clase. • Getters (returneaza valoarea unei variabile) si setters (seteaza valoarea unei variabile) pot oferi diferite nivele de acces la date. • Pentru setarea corecta a valorilor unor variabile, prin validarea valorilor. Acest proces se numeste encapsulation (aka. incapsularea datelor). Pentru clarificarea procesului de encapsulare avem nevoie sa discutam despre urmatoarele aspecte:
a) Metode de tip public, private si protected in Python Limbajele clasice orientate obiect, cum ar fi Python, C ++ sau Java, controleaza accesul la resursele clasei prin cuvinte cheie publice, private si protejate. Membrii privati ai clasei nu au acces din mediul din afara clasei. Ele pot fi tratate numai din interiorul clasei. Iata care este scopul fiecareia: Tipul public este pentru ca oricine sa ne poata folosi clasa, functia sau ce mai avem creat. • Tipul private este pentru a folosi atributele doar in aceeasi clasa sau metoda • Tipul protected specifica faptul ca putem accesa si folosi elementele create (clasa, variabila etc.) doar in aceeasi clasa sau in clase-copil (clase care mostenesc clasa principala - vom vorbi despre acest subiect in sectiunea 5 a acestui capitol). •
_____________________________________________________________________ 126
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Iata in secventa de cod de mai jos un exemplu de creare declarare a variabilelor unei clase, folosind cele trei tipuri de specificatori de acces (public, private si protected): class Student: def __init__(self, nume="Nimeni", varsta=0, gen="N/A", cnp=0): #variabila este publica self.nume = nume #variabila este protected, poate fi accesata din interiorul clasei sau din clase care mostenesc (clase child) clasa Person self._varsta = varsta #variabila este privata (nu poate fi accesata din exteriorul clasei) self.__gen = gen #variabila este privata (nu poate fi accesata din exteriorul clasei) self.__cnp = cnp
Prin crearea unui obiect, odata ce incercam sa modificam/apelam fiecare variabila in parte, rezultatul va fi urmatorul: stud = Student("Alex", 23, "M", 198) print (stud.nume) print (stud.gen) print (stud.varsta)
Programul afiseaza “numele” studentului pentru ca variabila poate fi accesata datorita faptului ca este de tip public), dar pentru variabila gen (care este de tip private) primim urmatorul mesaj de eroare, dupa care programul se opreste din a rula: Alex Traceback (most recent call last): File "main.py", line 83, in print (stud.gen) AttributeError: 'Student' object has no attribute 'gen'
Aceeasi situatie are loc si in cazul variabilei varsta (care este de tip protected).De asemenea, pe langa variabile, metodele unei clase pot restrictiona accesul prin specificatorii folositi anterior. Iata cum putem face asta, ddaugand la clasa Student, urmatoarele metode studentRandom(), __getRandom() si randomFun(): _____________________________________________________________________ 127
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
import random class Student: ... #definirea valorilor din exemplul de mai sus def studentRandom(self): randNr = random.randint(1, 10) return self.nume + str(randNr)
def __getRandom(self): #metoda definita private return self.studentRandom()
def randomFun(self, value): return "Random is: " + self.__getRandom() + " " + value
stud = Student("Alex", 23, "M", 198)
print (stud.nume) print (stud.studentRandom()) print (stud.randomFun("Tadaa")) print (stud.__getRandom())
Rezultatul rularii programului de mai sus va fi: Alex Alex1 Random is: Alex10 Tadaa Traceback (most recent call last): File "main.py", line 70, in print (stud.__getRandom()) AttributeError: 'Student' object has no attribute '__getRandom'
Mesajul de eroare se datoreaza faptului ca metode __getRandom() este de tip private si poate fi apelata doar in cadrul elementelor clasei Student si nu in afara ei prin accesare directa.
_____________________________________________________________________ 128
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
b) Getters si setters in Python Pentru a rezolva problema accesarii si modificarii variabilelor de tip private sau protected avem la dispozitie conceptul de metode de tip getter & setter. Un getter este o metoda care obtine valoarea unei variabile. In POO, acest lucru ajuta la accesarea variabilelor private dintr-o clasa. Un setter este o metoda care seteaza valoarea unei variabile. In POO, acest lucru ajuta la setarea valorii unei variabile private dintr-o clasa. Practic, utilizarea getters si setters asigura incapsularea datelor. In continuare vom lua un exemplu de metoda de tip getter, prin completarea clasei Person, definita anterior: def getNume(self): return self.nume
Odata definita, putem afisa pe ecran valoarea dorita (in cazul acesta numele persoanei), astfel: print("Numele meu este " + persA.getNume())
In cazul metodelor de tip setter, lucrurile arata in felul urmator: def setNume(self, value): self.nume = value
Iar, modul in care utilizam aceasta metoda este urmatorul: persA.setNume("Adi") print( "Numele meu este " + persA.getNume() )
Metodele de tip getter si setter se definesc pentru fiecare variabila din cadrul clasei care se doreste a fi accesata (prin getter) /modificata (prin setter). Astfel, in cazul exemplului nostru, intregul cod va arata in felul urmator: class Person: def __init__(self, nume="Nimeni", varsta=0, gen="N/A", cnp=0): self.nume = nume self.varsta = varsta self.gen = gen self.cnp = cnp #definim metode de tip getter def getNume(self): return self.nume def getVarsta(self): return self.varsta def getGen(self): return self.gen def getCNP(self): return self.cnp
_____________________________________________________________________ 129
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
#definim metode de tip setter def setNume(self, value): self.nume = value def setVarsta(self, value): self.varsta = value def setGen(self, value): self.gen = value def setCNP(self, value): self.cnp = value def __str__(self): return 'Person(nume=' + self.nume + ', varsta=' + str(self.varsta) + ', gen=' + self.gen + ', cnp=' + str(self.cnp) + ')' persA = Person() print( "Numele meu este " + persA.getNume() ) persA.setNume("Adi") print( "Numele meu este " + persA.getNume() ) persB = Person("Ramon", 27, "M", 1) print(persB)
In continuare, te invit ca pentru obiectul persA, sa modifici prin setters, fiecare variabila, dupa care sa le afisezi pe ecran, fiecare separat prin folosirea metodelor de tip getter.
_____________________________________________________________________ 130
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Exercitii Iata mai jos un exercitiu care sa te ajute sa-ti dezvolti abilitatile practice de programare in Python folosind conceptele de POO studiate pana acum: Creati o clasa de nume "FamiliaMea", iar obiectele asociate acesteia corespund membrilor familiei voastre. Clasa va contine variabilele "nume", "prenume", "vara", o lista de pasiuni, denumire "pasiuni" si o functie denumita "motto", care afiseaza motto-ul familiei voastre. Creati un constructor fara parametrii care initializeaza variabilele cu date default • Creati un constructor cu parametrii care initializeaza variabilele cu cele setate crearea instantei (obiectului) • Creati metode de tipul Getter si Setter pentru modificarea apelarea/modificarea atributelor din clase • Afisati variabilele pe ecran folosind "Getters" si modificati valorile atributelor prin apelarea "Setters" •
_____________________________________________________________________ 131
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
5) Mostenirea (Inheritance) unei clase in Python Mostenirea unei clase (parent) A de catre o clasa (child) B ii ofera clasei B posibilitatea de a imprumuta metodele si atributele existenta in clasa A. Ideea de baza este de a prelua functionalitatea existenta intr-o clasa si de a o modela pe cea existenta fara a rescrie codul. Relatia intre clase este de tipul “IS-A” (X este un Y) X face parte din multimea Y. Putem lua exemplul unui autoturism, marca BMW care are la baza foarte multe elemente comune cu alte autoturisme (Mercedes, Audi, Porsche etc), dar in acelasi timp are si elemente unice, specifice marcii BMW. Acesta este un exemplu cand un BMW mosteneste caracteristicile unui autoturism (marca, caroserie, roti, culoare, viteza maxima, capacitate motor, combustibil folosit etc.) De exemplu: • clasa Caine (child class) mosteneste clasa Animal (parent class) • clasa Tesla mosteneste clasa Masina • clasa Java si clasa Python mostenesc clasa LimbajProgramare Sau: • “Un caine este un animal” • “O carte este un document” • “Python este un limbaj de programare” • “Tesla este o masina” Iata mai jos o schema vizuala a acestui concept:
_____________________________________________________________________ 132
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Intr-o alta perspectiva, conceptul de "mostenire" in programare orientata pe obiecte se refera la posibilitatea de a crea o clasa "child" (copil), care are la baza ei o clasa de tip "parent" (parinte). Astfel, clasa de tip "child" va imprumuta atributele si metodele clasei “parent”. Acest concept este folositor pentru stabilirea atributiilor comune a mai multe clase particulare. Acesta poate fi dezvoltat la infinit clasele de tip "child" putand deveni "parents" pentru alte clase pe care le au in subordine. Aceasta tehnica eficientizeaza foarte mult programul si curata codul, nefiind nevoiti sa rescriem bucati importante de cod de mai multe ori. Adesea clasei child (copil) i se mai spune si subclass, iar clasei parent (parinte) i se spune superclass.
Exemplu #1 In continuare vom reorganiza codul folosit in exemplele anterioare, astfel incat sa utilizam conceptul de mostenire. Dupa cum poti vedea in exemplul de mai jos, elementele noi sunt: 1. In declararea clasei Student (class Student(Person):) prin care se specifica faptul ca aceasta mosteneste elementele clasei Person 2. In folosirea metodei super() din cadrul constructorului clasei Student care spune ca se doreste a fi reutilizat constructorul clasei parinte (Person in acest caz - clasa in care se atribuie valorile). 3. In folosirea metodelor clasei Person de catre un obiect de tip Student
import random class Person: def __init__(self, nume="Nimeni", varsta=0, gen="N/A", cnp=0): self.nume = nume self.varsta = varsta self.gen = gen self.cnp = cnp def __str__(self): return 'Person(nume=' + self.nume + ', varsta=' + str( self.varsta) + ', gen=' + self.gen + ', cnp=' + str(self.cnp) + ')' def getNume(self): return self.nume def getVarsta(self): return self.varsta def getGen(self): return self.gen
_____________________________________________________________________ 133
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
def getCNP(self): return self.cnp def setNume(self, value): self.nume = value def setVarsta(self, value): self.varsta = value def setGen(self, value): self.gen = value def setCNP(self, value): self.cnp = value class Student(Person): #clasa Student mosteneste clasa Person def __init__(self, nume="Nimeni", varsta=0, gen="N/A", cnp=0): super().__init__(nume,varsta,gen,cnp) #preia modul de initializare a valorilor din clasa parinte def studentRandom(self): randNr = random.randint(1, 10) return self.nume + str(randNr) def __getRandom(self): return self.studentRandom() def randomFun(self, value): return "Random is: " + self.__getRandom() + " " + value stud = Student("Alex", 23, "M", 198) #exemple de folosire a metodelor definite in clasa parinte, de catre clasa copil print (stud.getNume()) stud.setVarsta(29) print (stud.getVarsta()) stud.setCNP(192) print (stud.getCNP()) print (stud.studentRandom()) print (stud.randomFun("Tadaa"))
Rezultatul in urma rularii secventei de cod de mai sus va fi: Alex 29 192 Alex8 Random is: Alex2 Tadaa
_____________________________________________________________________ 134
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Care este rolul metodei super? Dupa cum poti sa vezi in declararea clasei Student, am specificat ca aceasta va mostenii clasa Person (cu alte cuvinte Student devine o subclasa a clasei Person), iar in interiorul constructorului (clasei Student) am folosit metoda super. In aceasta situatie prin super refolosim constructorul clasei parinte pentru a initializa variabilele create. Avem aceasta optiune in situatile in care dorim sa invocam constructorul clasei parinte (dupa cum ai putut sa vezi in exemplul de mai devreme) si in situatile in care dorim sa folosim o functie deja exista in clasa parinte (fara a fi nevoie sa redefinim noi codul).
Exemplu #2 In continuare vom lua un al doilea exemplu de cod (de data aceasta avand la baza masinile) pentru a vedea si intelege dintr-o alta perspectiva cele discutate mai devreme in acest capitol: class Masina(): def __init__(self, marca, caroserie, combustibil, pret, pretNegociabil): self.marca = marca self.caroserie = caroserie self.combustibil = combustibil self.pret = pret self.pretNegociabil = pretNegociabil def getMarca(self): return self.marca def getCaroserie(self): return self.caroserie def setCaroserie(self, caroserie): self.caroserie = caroserie def getCombustibil(self): return self.combustibil def setCombustibil(self, combustibil): self.combustibil = combustibil def getPret(self): return self.pret
_____________________________________________________________________ 135
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
def setPret(self, pret): self.pret = pret def getPretNegociabil(self): return self.pretNegociabil def setPretNegociabil(self, pretNegociabil): self.pretNegociabil = pretNegociabil
Dupa cum poti sa vezi clasa “Masina” contine o parte din caracteristiciile de baza care le intalnim la marea majoritate a masinilor (marca, combustibil, culoare, cai putere, viteza maxima). Aceasta clasa va fi clasa parinte pentru orice tip de masini dorim. In exemplul de mai jos eu am ales marca BMW si am creat o clasa cu caracteristiciile specifice acestei marci. class BMW(Masina): def __init__(self, caroserie, combustibil, model, culoare, kmParcursi, cPutere, vitezaMax, pret, pretNegociabil): super().__init__("BMW", caroserie, combustibil, pret, pretNegociabil)
self.model = model self.culoare = culoare self.kmParcursi = kmParcursi self.cPutere = cPutere self.vitezaMax = vitezaMax print("Masina de marca " + super().getMarca() + " si modelul " + self.model + " a fost creata.") def getModel(self): return self.model def setModel(self, model): self.model = model def getCuloare(self): return self.culoare def setCuloare(self, culoare): self.culoare = culoare
_____________________________________________________________________ 136
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
def getcPutere(self): return self.cPutere def setcPutere(self, cPutere): self.cPutere = cPutere def getVitezaMax(self): return self.vitezaMax def setVitezaMax(self, vitezaMax): self.vitezaMax = vitezaMax def pornesteMotor(self): print("Vmmmmm") def opresteMotor(self): print("Brrmmmm") def tureazaMotor(self): print("VMMMMMMMMMM") def accelereaza(self): print("PFIUUUHHH")
Acum, in momentul definirii clasei BMW, poti vedea ca intre paranteze am adaugat clasa Masina (clasa parinte) care specifica faptul ca aceasta clasa mosteneste caracteristiciile (atributele si metodele) clasei “Masina”. De asemenea folosesc si metoda super() al carui rol este sa se foloseasca de constructorul definit initial in clasa parinte (Masina). Dupa cum poti vedea in clasa BMW am definit atat functii de getter si setter pentru variabilele clasei, cat si functii specifice clasei BMW (care nu exista in clasa parinte) pe care le folosim in secventa urmatoare: #vom creea o instanta a clasei BMW si initializam variabilele: caroserie, combustibil, model, culoare, kmParcursi, cPutere, vitezaMax, pret si pretNegociabil bA = BMW("SUV", "Diesel", "X6", "Negru", 120000, 300, 260, 45000,'N') bA.pornesteMotor() bA.tureazaMotor()
_____________________________________________________________________ 137
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
bA.accelereaza() bB = BMW("Berlina", "Diesel", "530d", "Negru", 90000, 240, 230, 34000, 'Y') bB.pornesteMotor() bB.tureazaMotor() bB.accelereaza()
Mai sus poti vedea intregul program pus “cap la cap” in prin obiectele create (care in urma initializarii devin instante) ale clasei BMW. Mai jos poti vedea rezultatul rularii programului nostru: Masina de marca BMW si modelul X6 a fost creata. Vmmmmm VMMMMMMMMMM PFIUUUHHH Masina de marca BMW si modelul 530d a fost creata. Vmmmmm VMMMMMMMMMM PFIUUUHHH
_____________________________________________________________________ 138
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Capitolul 7 - Exceptii si Operatii cu Fisiere in Python I. Exceptii in Python Ce sunt exceptiile? O exceptie reprezinta un eveniment (neasteptat) care are loc in timpul executiei unui program. Aceasta exceptie (daca nu este tratata) poate duce la intreruperea programului si oprirea permanenta a acestuia. Exceptiile pot aparea in mai multe situatii, cum ar fi: • • • • •
Citirea sau lucru cu un fisier care nu exista (FileNotFoundError) Indentarea codului nu a fost facuta corect (IndentationError) Imposibilitatea utilizarii (sau inexistenta) unei clase (ClassNotFound) Depasirea lungimii maxime definite pentru o lista (IndexError) Imposibilitatea conectarii la un server
Toate aceste exceptii, precum si multe altele cu denumiri la fel de sugestive, pot aparea (sub forma de eroare) atunci cand scriem programele noastre si facem greseli la nivel de comportament al codului nostru, si nu la nivel de compilare (greseli de sintaxa in programare).
Cum sunt generate exceptiile in Python? O exceptie este generata prin “aruncarea” sa in momentul in care o anumita conditie nu este respectata. Sa luam codul de mai jos sub forma de exemplu pentru a intelege mai bine: h = None if h == None: raise Exception("Valoarea variabilei este nedefinita")
_____________________________________________________________________ 139
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Iar rezultatul generat va fi aceasta eroare: Traceback (most recent call last): File "main.py", line 170, in raise Exception("Valoarea variabilei este nedefinita") Exception: Valoarea variabilei este nedefinita
In acest exemplu am creat o variabile care am initializat-o cu None - o valoare care indica faptul ca variabila e complet goala, e nula, nu are atribuit nimic. Dupa aceea am testat daca variabila este nula. In cazul in care if-ul este valid, atunci va fi aruncata o exceptie (prin crearea unui instante de tipul Exception) care va anunta faptul ca variabila este nula, iar programul nu poate merge mai departe datorita acestui fapt. Exceptiile pot fi de doua tipuri: 1. Exceptii predefinite (built-in) - vezi figura 7.1 2. Exceptii definite de catre programator Clasa BaseException este clasa parinte a majoritatii exceptiilor din Python. O parte dintre exceptiile built-in le-am mentionat si la inceputul acestui capitol: • • • • • • • •
FileNotFoundError ZeroDivisionError ValueError EOFError IndexError ImportError TypeError Si multe altele
_____________________________________________________________________ 140
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Figura 7.1 In aceasta sectiune ne vom concentra asupra exceptiilor built-in. In cele ce urmeaza iti voi arata cateva exemple de programe care genereaza exceptii si modul in care le putem trata. Iata mai jos un exemplu de cod care genereaza o exceptie: o = 3 d = "Str" g = o + d print(g)
In exemplul de mai sus, secventa de cod declara 2 variabile de tipuri diferite (int si String) si printr-o a treia variabila incearca sa adune valorile celor 2. Dupa cum poti vedea in eroarea de mai jos exceptia de tipul TypeError, acest lucru nu este posibil pentru ca cele doua valori nu sunt de acelasi tip, iar o operatie matematica in aceasta situatie este imposibila. Traceback (most recent call last): File "main.py", line 165, in g = o + d TypeError: unsupported operand type(s) for +: 'int' and 'str'
Aceasta eroare o putem rezolva in doua moduri. Primul mod este prin a trata exceptia cu blocul de instructiuni try - except (asa cum vei vedea in sectiunea urmatoare), _____________________________________________________________________ 141
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
respectiv prin convertirea variabilei de tipul int la String pentru a putea face o concatenare a doua siruri: o = 3 d = "Str" g = str(o) + d print(g)
Cu rezultatul: 3Str
Cum tratam exceptiile in Python? Pentru a rezolva aceasta problema (si pentru a permite codului nostru sa fie executat in continuare fara intreruperi) trebuie sa prindem (captam) exceptiile care sunt aruncate, dupa care sa le tratam. Putem face asta in formatul urmator: l = [1, 2, 3, 4] for r in range(6): print(l[r])
Rezultatul in acesta situatie va fi urmatorul: 1 2 3 4 Traceback (most recent call last): File "main.py", line 167, in print (l[r]) IndexError: list index out of range
Practic prin folosirea blocului de instructiuni try - except putem sa ne protejam codul (si programul) nostru de o eventuala intrerupere care poate avea loc. In blocul try except am introdus codul principal care va fi executat instructiune cu instructiune. In _____________________________________________________________________ 142
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
momentul in care este lansata o exceptie, blocul except o va prinde si o va trata (in functie de codul scris acolo). In cazul acesta, codul nostru va arata astfel: l = [1, 2, 3, 4] try: for r in range(6): print(l[r]) except IndexError: print("S-a depasit dimensiunea listei")
Si rezultatul: 1 2 3 4 S-a depasit dimensiunea listei
NOTA: Aici este recomandat sa modificam valoarea functiei range(), in loc sa tratam exceptia. Iata alte exemple de cod care genereaza o parte din exceptiile mentionate la inceputul acestui capitol:
Exemplul #1 - Divide by 0 In acest exemplu poti sa vezi cum are loc o operatie de impartire a unui numar la 0 si rezultatul generat de catre compilator: x = 21 y = 0 z = x / y print(z) print("Programul a fost terminat cu succes")
Iar rezultatul il poti vedea mai jos: _____________________________________________________________________ 143
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Traceback (most recent call last): File "main.py", line 157, in z = x / y ZeroDivisionError: division by zero
Pentru a rezolva aceasta problema, vom folosi blocul try - except, care ne ve permite sa prindem o eventuala exceptie care ar putea fi lansata de catre program. In secventa except vom incerca sa prindem exceptia ZeroDivisionError. try: x = 21 y = 0 z = x / y except ZeroDivisionError: print("Operation Not allowed") print("Programul a fost terminat cu succes")
Si rezultatul in urma rularii codului: Operation Not allowed Programul a fost terminat cu succes
Exemplul #2 - File Not Found In acest al doilea exemplu poti sa vezi cum are loc o operatie de citire a datelor (despre care vom discuta in partea a doua a acestui capitol) dintr-un fisier si rezultatul generat: f = open("test.txt", "r") f.read() print("Programul a fost terminat cu succes")
Iata rezultatul acestei secvente de cod care are scopul de a deschide un fisier, denumit test.txt, si de a citi datele din el: _____________________________________________________________________ 144
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Traceback (most recent call last): File "main.py", line 163, in f = open("test.txt", "r") FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
Pentru a rezolva aceasta problema, vom folosi blocul try - except, care ne ve permite sa prindem o eventuala exceptie care ar putea fi aruncata de catre program. In secventa except vom incerca sa prindem exceptia FileNotFoundException, doar ca de data aceasta am sa te las pe tine sa scrii codul pentru prinderea exceptiilor (vezi sectiunea de exercitii de la sfarsitul acestei prime parti ale capitolului). NOTA: Pentru ca acest program sa functioneze cum trebuie, este foarte important ca fisierul test.txt sa existe. Mai multe detalii la sfarsitul acestui capitol.
Exemplul #3 - Indentation Error In acest al treilea exemplu poti sa vezi cum are loc o operatie simpla, dar asupra careia indentarea nu a fost facuta corect: k = [9, 8, 7, 6, 5] def listPrint(ls): for x in range(len(ls)): print (ls[x]) listPrint(k)
Iata si rezultatul: File "main.py", line 168 print (ls[x]) ^ IndentationError: expected an indented block
Iti poti da seama unde este eroarea? Pentru a rezolva aceasta problema, nu este nevoie de blocul try - except (desi poate fi folosit ca o bariera de siguranta), ci e nevoie de a
_____________________________________________________________________ 145
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
identifica elementul unde a fost facuta in mod eronat indentarea. Ce spui, reusesti sa gasesti greseala? :) Astfel de erori sunt des intalnite in programare in Python mai ales pentru ca nu exista acolade sau alte tipuri de delimitari ale codului in afara de aceasta indentare. Asadar, iti recomand sa fii foarte atent la modul in care este indentat codul tau (mai ales atunci cand scrii programe mai lungi si mai complexe) pentru ca in anumite situatii s-ar putea ca programul tau sa ruleze (eronat), chiar daca a fost gresita indentarea intr-un anumit loc.
Exemplul #4 - String index out of range In acest al patrulea exemplu poti sa vezi cum are loc o operatie de parcurgere a caracterelor dintr-un sir (ba, chiar depasirea numarului total de caractere) si rezultatul generat: e = "Big string" print(e[20])
Iar eroarea generata este: Traceback (most recent call last): File "main.py", line 164, in print(e[20]) IndexError: string index out of range
Pentru a rezolva aceasta problema, vom folosi blocul try - except, care ne ve permite sa prindem o eventuala exceptie care ar putea fi lansata de catre program. In secventa except vom incerca sa prindem exceptia IndexError, doar ca de data aceasta am sa te las pe tine sa scrii codul pentru prinderea exceptiilor (vezi sectiunea de exercitii de la sfarsitul acestei prime parti ale capitolului). NOTA: Aceeasi eroare poate aparea atat in cazul string-urilor, cat si in cazul listelor sau a oricaror alte structuri de date. Acest lucru se poate intampla doar in momentul in care este depasit indexul alocat acelei structuri de date. Exemplu: exista 9 elemente intr-o lista si este apelat elementul 11, atunci va fi aruncata aceasta exceptie de index. ATENTIE: acestea au fost cateva exemple de erori pe care le poti avea atunci cand iti scrii programele in Python. Cand vine vorba de exceptii precum IndexError te incurajez sa rezolvi cauza acestei exceptii si NU sa pui codul intr-un bloc try - except, in acest caz aceasta solutie nu este una eficienta. _____________________________________________________________________ 146
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Exercitiu 1) Pentru fiecare exemplu (2 - 4) de mai sus care nu contine o solutie de tratare a exceptiilor, te invit sa rescrii codul astfel incat programul sa nu fie intrerupt si sa-si poata continua executia.
_____________________________________________________________________ 147
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
II. Operatii cu Fisiere in Python Cand vine vorba de programare, o buna parte din timp vei lucra cu operarea sau manipularea de date, care sunt folosite de programul sau de aplicatia la care lucrezi. In marea majoritate a cazurilor, aceste date se vor afla stocate pe disc (cel mai probabil sub forma fisiere) sau intr-o baza de date. In aceasta sectiune vom invata cum sa gestionam citirea dintr-un fisier, respectiv scrierea intr-un fisier prin Python. Cand vine vorba de lucrul cu fisiere, in mare parte poti face 2 lucruri: citirea sau scrierea in acele fisiere. Este important sa il ai in vedere pentru ca te vei intalni destul de des cu astfel de operatii. Alte moduri prin care programul tau poate obtine date (pe care sa le proceseze) sunt: De la alte programe prin fisierele locale (aflate pe acelasi PC/laptop, hard disk) • De la alte programe prin retea (aflate pe anumite PC-uri/laptop-uri sau servere) • Din program, datele fiind introduse de la tastatura (despre care am vorbit in capitolul 2) •
1) Citirea fisierelor in Python Cand vine vorba de citirea dintr-un fisier, este extrem de important ca acel fisier sa existe si sa-i fie precizata locatia exacta de pe disk, astfel incat sa fie citite datele din el. Pentru asta putem folosi functia open() care ne va permitem sa accesam un fisier stocat pe hard disk. Functia open() are urmatoarea structura si contine urmatoarele proprietati: open (file, mode, buffering, encoding, errors) "r" - Read - Deschide un fisier pentru a citi datele din el si intoarce o eroare daca acesta
nu exista. Este valoarea implicita. "w" - Write - Deschide un fisier pentru a scrie in el. Daca fisierul exista deja si are
continut, va sterge acel continut si apoi scrie in el noile date. Altfel, creeaza fisierul daca nu exista. "a" - Append - Deschide un fisier pentru adaugare. Daca fisierul exista deja si are
continut, va adauga noile date dupa acel continut. Altfel, creeaza fisierul daca nu exista. "x" - Create - Creeaza fisierul specificat si intoarece o eroare in care fisierul exista deja.
_____________________________________________________________________ 148
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Pe langa acestea, mai poti specifica si modul in care sa fie citite datele dintr-un fisier: "t" - Text - Modul text, valoarea implicita. "b" - Binary - Modul binar, folosit in cazul citirii unei imagini.
Acum, haide sa vedem cum putem “declara” un fisier pentru a face diferite operatiuni de scriere sau de citire cu acesta. Inainte de asta, te invit sa creezi un fisier pe Desktop (sau in folderul proiectului tau din IDE) si sa adaugi urmatorul text in el: Salut! Sunt un fisier care asteapta sa fie modificat.
NOTA: Acest exercitiu iti recomand sa-l faci intr-un IDE (cum ar fi PyCharm) pentru ca iti va fi mai usor sa gestionezi fisierele. Implicit fisierele create (ex: “fisier.txt”) se vor afla in folderul proiectului tau. fileWindows = "C:\Users\Public\Desktop\fisierIntrare.txt" fileMac = "/Users/ramon/Desktop/fisierIntrare.txt" fileLinux = "/home/ramon/Desktop/fisierIntrare.txt" fW = open(fileWindows, "r") fM = open(fileMac, "r") fL = open(fileLinux, "r")
Daca locatia oferita programului nu este exacta si programul esuaza sa citeasca datele din fisier, atunci acesta (daca nu este scris corect) se poate opri din executie. In marea majoritate a cazurilor o exceptie este lansata cand fisierul nu exista sub forma FileNotFoundError. Daca ajungem in aceasta situatie, e important sa tratam aceasta exceptie astfel incat programul nostru sa continue si sa nu-si inceteze executia. Asadar, indiferent daca esti pe Windows, Linux sau macOS iti recomand sa folosesti calea absoluta (adica locul exact de pe disc) pentru a arata unde se afla fisierul din care doresti sa faci operatia de citire (asa cum ai putut sa vezi in exemplul de mai sus). De asemenea putem creea un fisier care se va afla in folderul proiectului nostru din IDE, folosind expresia de mai jos: _____________________________________________________________________ 149
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
fisier = "fisier.txt" f = open(fisier, "r", "t")
Pentru a citi datele stocate intr-un fisier, vom folosi functia read() exemplificata in urmatoarea structura de cod: print(fW.read())
Iar rezultatul afisat in consola va fi: Salut! Sunt un fisier care asteapta sa fie modificat
Astfel, ai reusit sa citesti toata informatia din acel fisier si sa o afisezi in consola. Practic, programul tau a accesat un fisier stocat pe hard disk-ul tau, a citit acele date si le-a afisat in consola. Acum sper ca iti poti imagina cat de departe poti merge cu asta. Acest proces este unul care sta la baza majoritatii programelor cu care noi lucram zi de zi. Odata ce am terminat lucrul cu fisierul, e important sa il inchidem pentru a nu aparea erori sau alterari ale acestuia. Modul prin care facem asta este cu functia de mai jos: fW.close()
Alte moduri de a citi informatia dintr-un fisier Functia read poate primi si un argument care reprezinta numarul de biti pe care sa-l citeasca din fisier. print(fW.read(10))
Iata in exemplul de mai jos rezultatul afisat: Salut! Su
_____________________________________________________________________ 150
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Asadar, doar o parte din continutul fisierului a fost citit (mai exact primii 10 biti). In cazul in care ai un fisier si vrei sa citesti datele linie cu linie, atunci te poti folosi de secventa de mai jos: fW.readline()
In secventa urmatoarea poti vedea un mod mai rapid de a declara un fisier si de a importa intr-o variabila datele existente in el pentru a putea fi procesate de catre program: with open('file.txt') as f: read_f = f.read() print(read_f)
Unul dintre avantajele acestei secvente de cod consta in faptul ca fisierul este inchis automat la finalizarea sa (un aspect pe care marea majoritate a programatorilor il uita), fapt care va duce la mai putine erori de program.
_____________________________________________________________________ 151
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
2) Scrierea in fisiere cu Python Procesul de scriere intr-un fisier este mai usor de facut pentru ca nu trebuie sa existe fisierul in care vrem sa scriem. Daca fisierul destinatie (cel cu denumirea in care vrem sa scriem) nu exista, atunci programul il va crea automat, deci nu trebuie sa-ti faci griji. Important si aici este sa te asiguri ca oferi corect locatia destinatie a fisierului. Iata mai jos un exemplu: fileW = "fisierul_meu.txt" fileA = "C:\Users\Public\Desktop\fisierul_meu_desktop.txt" fW = open(fileW, "w") fA = open(fileLoc, "a")
Mai sus, intentionat am ales 2 fisiere (unul care se va afla in folderul proiectului din IDE fileW) si al doilea care se afla pe Desktop. Primul fisier nu exista, deci va fi creat automat de catre program in momentul in care va fi executata functia de deschidere si scriere, iar al doilea fisier exista si continutul (1234, “Salut!”). Primul a fost deschis cu “w”, adica cu scopul de a scrie in el, iar al doilea a fost deschis cu “a”, adica cu scopul de a face append, de a adauga text in el (astfel pastrandu-si continutul). ATENTIE: daca deschizi un fisier cu scopul de a scrie in el (“w”), e important ca acel fisier sa fie gol pentru ca, altfel, functia de scriere iti va sterge intregul continut al acelui fisier. Daca doresti doar sa adaugi, atunci declara-l cu append (“a”). fW.write("Text pentru noul fisier fileW") fA.write("Text pentru fisierul fileA") fW.close() fA.close()
Si acum, iata mai jos rezultatele pentru fisierul fW: Text pentru noul fisier fileW
Respectiv fA: _____________________________________________________________________ 152
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
1234, “Salut!” Text noul fisierul fileA
Dupa cum poti sa vezi, in primul fisier rezultatul este exact ceea ce am scris in el, iar in al doilea fisier a fost adaugat textul pe langa cel existent initial.
Exemplul #2 Mergand mai departe, propun sa punem lucrurile cap la cap. In sectiunea de cod de mai jos poti vedea un exemplu complet de citire, respectiv scriere a unui text intr-un fisier. Programul citeste datele din fisierul input.txt (care poate contine orice valoare doresti tu in cazul meu am ales sa-l umplu cu dummy text - Lorem Ipsum) si le scrie in fisierul output.txt. Daca nu introducem o locatie anume de unde dorim sa citim/scriem in fisier, programul va folosi locatia default (cea in care se afla proiectul tau Python). Pentru a afla aceasta locatie, avem la dispozitie functia: import os print(os.getcwd())
Aceasta functie o folosim pentru a afisa in consola locatia curenta, unde programul nostru in Python cauta (by default) fisierul input.txt, respectiv unde va crea fisierul output.txt. Nu iti fa griji, vom discuta in capitolul urmator mai multe despre module, functia import si ce alte functii mai putem folosi pentru a ne face viata mai usoara in timp ce scriem programe. try: fIn = open("input.txt", "r") fOut = open("output.txt", "w")
dateFisier = fIn.read() print("Fisierul citit este:") print(dateFisier) print("Fisierul scris este:") dateFisier = dateFisier.upper() fOut.write(dateFisier)
_____________________________________________________________________ 153
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
print(dateFisier) fOut.close() fIn.close() except IOError: print("Fisierul de citire nu a fost gasit") fOut.close()
Acest program citeste datele dintr-un fisier, le stocheaza intr-o variabila de tipul String (dateFisier), dupa care le modifica formatul (toate caracterele devin uppercase) intr-un alt fisier. Rezultatul il poti vedea mai jos: Fisierul citit este: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec hendrerit lorem vel libero scelerisque, in faucibus lorem iaculis. Etiam vestibulum lacus sit amet nisi pretium vehicula. Sed quam lacus, volutpat et magna a, consequat sodales quam. Donec luctus sapien finibus, dapibus tellus nec, auctor turpis. Nullam sit amet mauris ultrices, gravida metus rutrum, pulvinar orci. Integer molestie scelerisque tellus, quis bibendum sem accumsan et. Vestibulum et ante fermentum, condimentum nisl et, auctor neque. Vivamus in nibh nec enim scelerisque dictum. Nullam accumsan turpis quis risus elementum sodales. Sed blandit nec nulla ultricies euismod. Praesent eu euismod nibh. Curabitur eu erat vitae diam ultricies volutpat nec sed velit. Fisierul scris este: LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPISCING ELIT. DONEC HENDRERIT LOREM VEL LIBERO SCELERISQUE, IN FAUCIBUS LOREM IACULIS. ETIAM VESTIBULUM LACUS SIT AMET NISI PRETIUM VEHICULA. SED QUAM LACUS, VOLUTPAT ET MAGNA A, CONSEQUAT SODALES QUAM. DONEC LUCTUS SAPIEN FINIBUS, DAPIBUS TELLUS NEC, AUCTOR TURPIS. NULLAM SIT AMET MAURIS ULTRICES, GRAVIDA METUS RUTRUM, PULVINAR ORCI. INTEGER MOLESTIE SCELERISQUE TELLUS, QUIS BIBENDUM SEM ACCUMSAN ET. VESTIBULUM ET ANTE FERMENTUM, CONDIMENTUM NISL ET, AUCTOR NEQUE. VIVAMUS IN NIBH NEC ENIM SCELERISQUE DICTUM. NULLAM ACCUMSAN TURPIS QUIS RISUS ELEMENTUM SODALES. SED BLANDIT NEC NULLA ULTRICIES EUISMOD. PRAESENT EU EUISMOD NIBH. CURABITUR EU ERAT VITAE DIAM ULTRICIES VOLUTPAT NEC SED VELIT.
_____________________________________________________________________ 154
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Exercitii Dupa cum te-ai obisnuit pana acum, la fiecare final de capitol iti pun la dispozitie un set de cateva exercitii pe care tu sa le practici. 1) Creeaza un program care citeste numerele din cele 3 fisiere atasate AICI. Dupa citire, aceste numere vor fi sortate in ordine crescatoare si vor fi scrise intr-un fisier nou denumit "rezultat.txt". Pe prima linie se va scrie cel mai mare numar dintre cele citite, urmat numarul total de elemente citite din cele 3 fisiere. Exemplu fisiere "rezultat.txt": 8181 45 3 4 5 19 ... Unde 8181 reprezinta cel mai mare numar dintre cele citite, iar 45 reprezinta numarul total de numere citite din cele 3 fisiere. Raspuns corect: 991 44 3 4
_____________________________________________________________________ 155
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Capitolul 8 - Module in Python Ce sunt modulele si de ce le folosim Rolul modulelor in Python (precum si in alte limbaje de programare) este de a ne face viata mai simpla, mai usoara atunci cand vrem sa dezvoltam diverse aplicatii. Gandeste-te la urmatorul lucru: atunci cand dorim sa batem un cui in perete, cel mai probabil vom folosi un ciocan (sau un alt instrument - aka. modul) care sa ne faca viata mai usoara pentru ca altfel, daca ar fi sa-l batem cu palma sau cu pumnul, s-ar putea sa dureze si cel mai probabil sa doara. La fel si in programarea cu partea de module, le folosim pentru ca ne faca viata mai usoara, acestea continand deja metode eficiente implementate de alte persoane care devin “best-practice” in industrie.
Exemple de module folosite cu Python In Python sunt numeroase module pentru diferite scopuri (in general gasesti pentru orice arie de interes cel putin un modul pe care il poti folosi, tot ce ai nevoie este sa cauti pe Google, acel modul de care ai nevoie). Iata o lista cu cele mai populare module din Python, impreuna cu ariile de utilizare: ● ● ● ● ● ●
NumPy - math & number processing Pandas - analiza de date TensorFlow - inteligenta artificiala si machine learning Pillow - procesare de imagini Tkinter - programare aplicatii grafice (GUI) Requests - HTTP requests & API development
a) Modulul “random” (have fun with random numbers) Modulul random este folosit pentru a obtine valori noi, pentru a genera valori aleatoare. Acesta poate fii utilizat pentru a efectua o actiune la intamplare, pentru a obtine un numar aleator, amestecarea elementelor dintr-o structura de date sau pentru selectarea aleatorie a unui element dintr-o lista. In exemplul de mai jos, vei vedea o problema care se rezolva folosind acest modul. Probabil ca stii deja jocul “Piatra, hartie, foarfeca”. Am incercat sa oferim o rezolvare a acestui joc, creand logica bazata pe modulul random dupa urmatorul enunt:
_____________________________________________________________________ 156
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Creati un joc Piatra-Hartie-Foarfeca la care participa 2 persoane, folosindu-va de functia input pentru a cere date de la jucatori. In momentul cand cineva castiga, printati un mesaj de felicitare si intrebati utilizatorii daca doresc sa inceapa un joc nou. import random
optiune = str(input("Alege o optiune dintre piatra, hartie si foarfeca. ")) optiuni = ["piatra", "hartie", "foarfeca"] optiuneCalculator = random.choice(optiuni) print(optiuneCalculator) variantaCastigatoare = "Felicitari! A-ti castigat. Doriti sa incepeti inca un joc?" a = "Yes" while a == "Yes": if optiune == optiuneCalculator: print("egalitate") break elif optiune = "piatra": if optiuneCalculator == "hartie": print("ai pierdut") break elif optiuneCalculator == "foarfeca": print(variantaCastigatoare) a = input("Introduceti Yes sau NO: ") if a == "Yes": optiune = str(input("Alege o optiune dintre piatra, hartie si foarfeca: ")) optiuneCalculator = random.choice(optiuni) print(optiuneCalculator) elif optiune == "hartie": if optiuneCalculator == "foarfeca": print("ai pierdut") break elif optiuneCalculator == "piatra": print(variantaCastigatoare) a = input("Introduceti Yes sau No: ") if a == "Yes": optiune = str(input("Alege o optiune dintre piatra, hartie si foarfeca: "))
_____________________________________________________________________ 157
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
optiuneCalculator = random.choice(optiuni) print(optiuneCalculator) ` elif optiune == "foarfeca": if optiuneCalculator == "hartie": print(variantaCastigatoare) a = input("Introduceti Yes sau No: ") if a == "Yes": optiune = str(input("Alege o optiune dintre piatra, hartie si foarfeca: ")) optiuneCalculator = random.choice(optiuni) print(optiuneCalculator) elif optiuneCalculator == "piatra": print("ai pierdut") break
Poti testa jocul si sa iti faci o idee despre logica din spate a unui program. Fiecare dintre aceste module are propriile sale metode. Vom aminti doar o parte dintre ele in cele ce urmeaza: Metoda random.randint() ce returneaza un numar intreg aleator intre un interval specificat. >>>import random >>>random.randint(5,10) 7 >>>random.randint(5,10) 9
Metoda random.random() ce returneaza un numar real (cu virgula) intre 0.0 si 1.0 >>>import random >>>random.random() 0.458765675
Metoda random.shuffle() ce reordoneaza random elementele dintr-o lista: >>>import random >>>a = [30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40] >>>random.shuffle(a) >>>a [32, 37, 40, 31, 30, 38, 35, 39, 33, 36, 34] >>>random.shuffle(a)
_____________________________________________________________________ 158
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
>>>a [37, 35, 36, 34, 30, 38, 31, 39, 33, 40, 32]
Metoda random.choice() ce returneaza un element selectat random dintr-o secventa nevida, precum o lista: >>>import random >>>random.choice('computer') 'm' >>>random.choice([11,14,17,19,20]) 11 >>>random.choice([11,14,17,19,20]) 19
Metoda random.randrange() ce selecteaza random un element dintr-un interval ales, format din numarul de unde incepe intervalul, numarul la care se termina intervalul, iar acestui interval ii poti adauga si un pas, un argument >>>import random >>>random.randrange(1, 10) 3 >>>random.randrange(1, 10, 2) 5 >>>random.randrange(0, 101, 10) 70
_____________________________________________________________________ 159
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
b) Modulul “pillow” pentru procesarea de imagini Multe aplicatii folosesc imagini digitale necesare pentru diferite scopuri, iar una dintre lucrurile de baza ale aplicatiilor web sunt imaginile, in Python existand biblioteci pentru procesarea acestora, precum: OpenCV, PIL sau Pillow despre care vom vorbi in cele ce urmeaza. Modulul pillow accepta mai multe formate de imagine, iar printre tipuri de procesare a imaginilor amintim: redimensionarea, rotirea, decuparea sau transformarea imaginilor. Acest modul poate rula pe orice sistem de operare si suporta o varietate de imagini: jpeg, png, ppm, etc. Pe langa procesarea imaginilor, cu ajutorul acestui modul putem executa anumite operatii de filtrare a imaginilor. Permite, de asemenea, extragerea unor date statistice din imagine prin folosirea Histogramei pentru o analiza statistica si implicit, imbunatatirea contrastului. Utilizarea acestui capitol presupune cateva etape: a) Instalarea modulului pillow folosind pip Iar pentru a face aceasta etapa, avem nevoie sa introducem in command prompt urmatoarea comanda: python -m pip install pip python -m pip install pillow
Daca ai deja instalat acest modul, vei primi un mesaj in care vei fii anuntat despre acest lucru sau poti sa ii faci un update folosind urmatoarele comenzi: python3 -m pip install --upgrade pip python3 -m pip install --upgrade Pillow
E posibil sa intampini totusi cateva erori provocate de IDE. Iti recomand ca in acest caz sa urmaresti linkurile de mai jos:
How to import pil in pycharm or anaconda How to use Conda env in pycharm Python Tutorial: Image Manipulation with Pillow
_____________________________________________________________________ 160
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
b) Folosirea modulului IMAGE Acest modul contine cateva functii incorporate precum incarcarea imaginilor sau crearea lor. Pentru incarcarea imaginilor, importam si apelam modulul IMAGE folosind comanda: Image.open(“poza”), trecand intre paranteze numele pozei dorite. Apoi vom incarca imaginea prin functia Image.open(), iar orice modificare ii aducem acestei imagini, poate fii salvata prin comanda save() . Vom apela modulul PIL, in locul modulului Pillow pentru a fii compatibil cu modulul Python Imaging Library (PIL), iar codul va incepe cu secventa: “from PIL import Image”. Imaginea poate fii redimensionata, decupata, putandu-se opera diferite functii sau metode. In exemplul de mai jos, poti observa rotatia unei imagini. Functia show() este apelata pentru a afisa o imagine. from PIL import Image x = Image.open("image.jpg") #comanda pentru
a afisa imaginea actuala
x.show() #imaginea rotita x = x.rotate(90)
x.show()
Exemple de metode ale modulului Image( sa presupunem ca avem o poza cu numele imagine):
● ● ● ●
imagine.filename: functie folosita pentru a obtine numele imaginii imagine.format: folosita pentru a identifica formatul pozei, exemplu JPEG imagine.mode : determina formatul pixelilor folositi in imagine, exemplu RGB imagine.size : marimea imaginii
In exemplul urmator, poti observa diferite functii folosite in cadrul acestui modul. Iti recomand sa testezi si sa vezi ce se intampla in propriul IDE.
_____________________________________________________________________ 161
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
# Importam modulul Image from PIL import Image # Importam modulul os import os # Selectam imaginea imageName = 'a.jpg' if os.path.exists(imageName) : # deschidem imaginea imagine = Image.open('a.jpg') # o afisam imagine.show() # printam latimea si inaltimea acesteia print('Dimensiunea imaginii este : {}'.format(imagine.size)) # afisam formatul imaginii print('Formatul imaginii este : {}'.format(imagine.format)) else: # altfel afisam o eroare print('Imaginea nu exista')
De asemenea, te poti juca si cu formatul acesteia: print('The size of the original image is : {}'.format(imagine.size)) # schimbam dimensiunea imaginii resized_imag = imagine.resize((200, 100)) # salvam noua imagine cu un nou nume resized_imag.save('new.jpg') # Print the width and height of the new image in pixels print('Dimensiunea noii imagini este : {}'.format(resized_imag.size))
_____________________________________________________________________ 162
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Poti crea si o miniatura a pozei respective: from PIL import Image #deschidem imaginea imag = Image.open('a.jpg')
# stabilim valorile miniaturii imag.thumbnail((200, 200)) # salvam miniatura imag.save('thumbnail.png') # deschidem miniatura thumbnail_imag = Image.open('thumbnail.png') # o afisam thumbnail_imag.show()
In concluzie, modulul IMAGE contine multiple functii pentru a putea efectua operatii asupra unei imagini. Te invit sa le testezi si sa te joci cu acestea.
_____________________________________________________________________ 163
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
c) Folosire modul sys & argumentele unui program in Python In continuare iti voi arata cum putem sa luam argumente pentru scripturile noastre de Python din linia de comanda. Asta ne va ajuta programul nostru prin interactiunea directa cu utilizatorul. Daca ai mai folosit Linux (sau terminalul de pe replit.com), sigur ai rulat (din linia de comanda) anumite programe care aveau nevoie si de argumente. Ai vazut deja cum poate un utilizator sa interactioneze cu un program intre timp ce acesta ruleaza, el poate introduce anumiti parametri sau raspunsuri. De data aceasta userul le va preciza chiar inainte de rularea programului, prin argumente. In acest capitol o sa vezi cel mai clar cum Python si Linux merg mana-n mana si avantajul oferit acestei posibilitati. Voi crea un fisier denumit file.py, dupa care il deschid cu un editor text. import sys
Modulul sys odata importat, ne simplifica accesarea anumitor variabile si functii. Acum, pentru a accesa argumentele, ne vom folosi chiar de acest modul. Clasic, daca vrem sa rulam un program, ne folosim de comanda: python file1.py Daca in schimb vrem sa ii specificam si anumite argumente, il vom rula sub forma: python file1.py {argv[1]} ... {argv[n]} Observa cum simbolic, numerotarea argumentelor date de utilizator am inceput-o de la 1. De ce? Pentru ca numele fisierul (numele script-ului) reprezinta de fapt {argv[0]}, iar {argv[1]} este imediat urmatorul argument primit. import sys
n = len(sys.argv) if n < 2: print("Usage: file.py nr1 nr2") exit() print("Number of arguments found: " + str(n))
Prin codul de mai sus atribuim intai variabile n numarul de argumente folosite in linia de comanda, dupa care verificam ca acesta sa aibe minim 2 argumente (adica minim numele fisierului, urmat de un numar). In continuare, pentru a afisa fiecare agument in parte gasit, completam codul cu: import sys n = len(sys.argv) if n < 2: print("Usage: file.py nr1 nr2")
_____________________________________________________________________ 164
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
exit() print("Number of arguments found: " + str(n) + "\n1st: " + sys.argv[0] + "\n2nd: " + sys.argv[1] + "\n3th: " + sys.argv[2])
Totusi, ca sa calculam suma acestor doua argumente date, mai avem nevoie de urmatoarea completare: import sys n = len(sys.argv) if n < 2: print("Usage: file.py nr1 nr2") exit() print("Number of arguments found: " + str(n) + "\n1st: " + sys.argv[0] + "\n2nd: " + sys.argv[1] + "\n3th: " + sys.argv[2]) a1 = sys.argv[1] a2 = sys.argv[2] suma = a1 + a2 print("The sum is: " + suma)
Apeleaza programul prin: python file1.py 2 si observa ce se afiseaza. Eroarea IndexError: list index out of range iti spune de fapt ca programul nu a gasit al doilea argument. E nevoie sa modific verificarea din if, pentru a fi sigur ca se executa programul doar daca numarul de argumente nu este mai mic decat 3. import sys n = len(sys.argv) if n < 3: print("Usage: file.py nr1 nr2") exit() print("Number of arguments found: " + str(n) + "\n1st: " + sys.argv[0] + "\n2nd: " + sys.argv[1] + "\n3th: " + sys.argv[2]) a1 = sys.argv[1] a2 = sys.argv[2] suma = a1 + a2 print("The sum is: " + suma)
Observam ca se afiseaza de data aceasta: 13. Asta deoarece sys.argv le-a preluat ca String-uri, iar la adunare le-a concatenat. Mai jos poti vedea cum le modificam in numere intregi. _____________________________________________________________________ 165
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
import sys n = len(sys.argv) if n < 3: print("Usage: file.py nr1 nr2") exit() print("Number of arguments found: " + str(n) + "\n1st: " + sys.argv[0] + "\n2nd: " + sys.argv[1] + "\n3th: " + sys.argv[2]) a1 = int(sys.argv[1]) a2 = int(sys.argv[2]) suma = a1 + a2 print("The sum is: " + str(suma))
_____________________________________________________________________ 166
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
d) Alte exemple de folosire a modulelor in Python
1.
Trimiterea unui mail cu Python
import smtplib #pentru a putea trimite mesaje, mail-uri catre un anumit server from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText #pentru a compune mail-ul, pentru a adauga text, formate, etc fromADD="[email protected]" #schimba cu adresa reala toADD="[email protected]" #schimba cu adresa reala msg=MIMEMultipart() # pentru a crea un obiect in care noi vom putea sa atasam informatiile legate de mailul acesta subiect="Hello from Programming" ### PART 1 - Crearea mail-ului in formatul MIME print("Creating the message.") msg["From"]=fromADD msg["To"]=toADD msg["Subject"]=subiect mesaj="Eu invat Python" ### PART 2 - Crearea mesajului msg.attach(MIMEText(mesaj, 'plain')) #atasam acest mesaj in format text catre obiectul msg ### PART 3 - Conectarea la server cu user-ul & parola de gmail print("Connecting to server...") server=smtplib.SMTP("smtp.gmail.com",587) # pentru transferul mailului de la noi catre destinatie server.starttls() # pentru partea de criptare a mesajului server.login(fromADD, "parola ta")
_____________________________________________________________________ 167
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
server.sendmail(fromADD, toADD, msg.as_string()) print("Done sending")
In functie de versiunea de Python pe care o ai, e posibil sa intampini ceva erori. Iti recomand sa cauti pe Google aceste erori, iar mai jos iti las cateva linkuri pentru cateva erori de securitate:
● https://stackoverflow.com/questions/16512592/login-credentials-not-working-withgmail-smtp ● https://stackoverflow.com/questions/10147455/how-to-send-an-email-with-gmail-as -provider-using-python/27515833#27515833 ● https://myaccount.google.com/u/1/lesssecureapps?pli=1&pageId=none&rapt=AEjH L4MDS9PUmGwAGxJ99P_CQglLsYVSeKrvR80tWRcpweYUk6BCL1alBYhmAyGmlI sP5z2mm5DWIVq3ter2zw6lhEAL-WGVxw ● https://myaccount.google.com/security?utm_source=OGB&utm_medium=act&origi n=3
NOTA: codul a fost testat si validat pe versiunea de Python 3.9
_____________________________________________________________________ 168
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
2.
Descarcarea unei pagini web cu Python - urllib2
import urllib.request as urllib2 url = "http://www.google.com" raspuns_server = urllib2.urlopen(url) date = raspuns_server.read() print("##### STARTING TO CRAWL THE SITE #####") print(date) try: fisier_html = open("site_downloadat.html","w") fisier_html.write(str(date)) except Exception: print("Procesul nu s-a incheiat cu succes. ") else: fisier_html.close() print("Job done")
NOTA: codul a fost testat si validat pe versiunea de Python 3.9
_____________________________________________________________________ 169
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
3.
Folosirea unor module precum turtle sau calendar
Te poti juca cu astfel de module pentru a vedea si o alta parte practica a acestora. import turtle
def square(): a = turtle.Turtle() a.forward(100) a.right(90) a.forward(100) a.right(90) a.forward(100) a.right(90) a.forward(100) square() turtle.done()
Rezultand o imagine precum cea de mai jos:
Figura 8.1 _____________________________________________________________________ 170
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Iti poti face propria imagine si chiar te invit sa te joci cu acest modul si sa desenezi un trapez, paralelogram sau orice forma grafica doresti tu. De asemenea, te poti juca si cu modulul calendar precum in exemplul de mai jos: import calendar print(calendar.weekheader(5)) print()
print(calendar.firstweekday()) print() print(calendar.month(2021,4)) print(calendar.monthcalendar(2021,4)) print(calendar.calendar(2021))
Rezultand:
Mon
Tue
Wed
Thu
Fri
Sat
Sun
0
Mo 5 12 19 26
April 2021 Tu We Th Fr Sa 1 2 3 6 7 8 9 10 13 14 15 16 17 20 21 22 23 24 27 28 29 30
Su 4 11 18 25
[[0, 0, 0, 1, 2, 3, 4], [5, 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24, 25], [26, 27, 28, 29, 30, 0, 0]] 2021 January Mo Tu We Th Fr 1 4 5 6 7 8 11 12 13 14 15 18 19 20 21 22 25 26 27 28 29
Sa 2 9 16 23 30
Su 3 10 17 24 31
February Mo Tu We Th Fr 1 2 3 4 5 8 9 10 11 12 15 16 17 18 19 22 23 24 25 26
Sa 6 13 20 27
Su 7 14 21 28
Mo 1 8 15 22 29
Tu 2 9 16 23 30
March We Th Fr 3 4 5 10 11 12 17 18 19 24 25 26 31
Sa 6 13 20 27
Su 7 14 21 28
_____________________________________________________________________ 171
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
April Mo Tu We Th Fr 1 2 5 6 7 8 9 12 13 14 15 16 19 20 21 22 23 26 27 28 29 30
July Mo Tu We Th Fr 1 2 5 6 7 8 9 12 13 14 15 16 19 20 21 22 23 26 27 28 29 30
Mo Tu 4 5 11 12 18 19 25 26
October We Th Fr 1 6 7 8 13 14 15 20 21 22 27 28 29
Sa 3 10 17 24
Su 4 11 18 25
Sa 3 10 17 24 31
Su 4 11 18 25
Sa 2 9 16 23 30
Su 3 10 17 24 31
May Mo Tu We Th Fr Sa 1 3 4 5 6 7 8 10 11 12 13 14 15 17 18 19 20 21 22 24 25 26 27 28 29 31
Su 2 9 16 23 30
August Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Mo 1 8 15 22 29
Tu 2 9 16 23 30
November We Th Fr 3 4 5 10 11 12 17 18 19 24 25 26
Sa 6 13 20 27
Su 7 14 21 28
June We Th Fr 2 3 4 9 10 11 16 17 18 23 24 25 30
Sa 5 12 19 26
Su 6 13 20 27
September Mo Tu We Th Fr 1 2 3 6 7 8 9 10 13 14 15 16 17 20 21 22 23 24 27 28 29 30
Sa 4 11 18 25
Su 5 12 19 26
December We Th Fr 1 2 3 8 9 10 15 16 17 22 23 24 29 30 31
Sa 4 11 18 25
Su 5 12 19 26
Mo Tu 1 7 8 14 15 21 22 28 29
Mo Tu 6 7 13 14 20 21 27 28
_____________________________________________________________________ 172
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Capitolul 9 - Versionarea codului cu Git si GitHub Ce este Git si GitHub? O modalitate prin care iti poti salva si cum iti poti apoi accesa codul in orice moment. Git si GitHub este din ce in ce mai utilizat si cerut de catre toti angajatorii. Reprezinta un software ce te ajuta la versionarea codului tau si chiar in management-ul codului sursa (SCM - Source Code Management). Git-ul te ajuta sa iti salvezi codul scris, online. Iar cel mai mare avantaj este ca tu si ceilalti programatori dintr-un proiect puteti vedea schimbarile pe care le faceti in cod. Pe langa asta, poti si gasi anumite solutii pe problemele pe care le intampini in cod. Creatorul Linux, pe numele lui Linus Torvalds, este cel care s-a gandit la o metoda de versionare a codului, in momentul in care a considerat ca este nevoie ca mai multi programatori sa lucreze la versiunea sa de Linux. Hai sa vedem in ce context ai putea folosi Git-ul. De exemplu, daca vrei sa construiesti pe baza a ceea ce ai lucrat deja sau sa aduci si alte persoane care sa contribuie la munca ta, nu poti tine codul pe calculatorul tau pentru ca va deveni dificil ca si altii sa acceseze si sa lucreze cu ceea ce tu ai facut pana la momentul respectiv. Un alt exemplu ar fi ca, dupa ce ai scris cod si ai adaugat ceva acum 3 zile, te anunta testerul de software ca 90% din codul scris in ultimele 3 zile trebuie rescris, conform modificarilor in cerinta initiala (presupunand ca sunteti echipa mica). Prin GitHub te poti intoarce la versiunea de acum 3 zile si poti incepe sa lucrezi la asta fara ca tu manual sa stergi fiecare linie de cod adaugat in cele 3 zile. Bun, bun, dar este folositor Git-ul pentru proiecte mari cu o echipa mai complexa? Raspunsul este da. Tocmai aici se vede cat de util poate fi. O echipa complexa inseamna o echipa care are membrii cu diferite roluri si chiar diferite drepturi pe proiect. Cei cu rol de tester pot colabora cu developerii, intre timp project managerul poate monitoriza cine, unde si ce a adaugat. Simplu spus, prin folosirea Git, altii vor putea adauga si isi pot pune amprenta pe codul deja creat de tine. INTRA AICI pentru a afla mai multe despre Git si GitHub. Multi programatori folosesc GitHub pentru a-si stoca ceea ce au codat si pentru a-si crea un portofoliu pe care angajatorii il pot oricand vizualiza. Este extrem de important sa ai cont pe GitHub daca iti doresti o cariera in IT. Sa nu mai vorbesc ca poti colabora cu alti programatori ce vor aduce imbunatatiri codului tau. Pe langa GitHub, te mai poti folosi de GitLab si Atlantis, care fac exact aceleasi lucruri, dar au doar cateva mici diferente de design.
_____________________________________________________________________ 173
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Cum folosim Git pentru versionarea codului? De ce este important sa iti faci back-up la cod in Git? Versionarea codului este necesara, deoarece un program se scrie pe o perioada indelungata de timp, iar salvarile anumitor etape sunt absolut necesare pentru a te intoarce la versiunea codului pe care o doresti sau la versiunea care este corecta. Exemplele anterioare sunt doar cateva dintre cele simple, un intreg flow de dezvoltare al unui produs final fiind mult mai complicat in realitate, pentru echipele mari. Am amintit deja ca Git este foarte util atunci cand mai multi programatori lucreaza la acelasi cod si aduc propriile lor versiuni de cod, ce pot fi mai mult sau mai putin bune. Acum ca tot mai multi programatori aplica “laptop lifestyle”, adica isi iau laptopul si lucreaza cand, cat si mai ales de unde doresc ei atata timp cat au acces la Internet, este evident ca multi programatori care colaboreaza nu se afla in aceeasi tara, deci au diferite zone de timp (fusuri orare). Git-ul are avantajul de a mentine integritatea codului sursa. Asta datorita posibilitatii lucrului pe diferite “branch”-uri, adica pe diferite ramuri (pe care se lucreaza) care nu intra in conflict in momentul in care, sa zicem ca, mai multi programatori lucreaza pentru aceeasi aplicatie. Am putea sa ne uitam la un “repository” ca la un depozit in care practic chiar depozitam un intreg proiect, cu toate fisierele si folderele din care acesta este compus, dar care pe langa asta contine si un istoric al modificarilor/revizuirilor care au avut loc in fiecare fisier in parte. In Git, oricine care are o copie locala (pe propriul PC) al repository-ului are acces la intreaga baza de date a schimbarilor care au avut loc asupra codului, cu istoricul lor cu tot. Acum, daca tot avem o baza de date a intregului istoric al codului, cu toate fisierele si folderele din el, ce putem face cu acesta si cum anume? Pentru a interactiona cu codul, putem folosi linia de comanda sau un program cu interfata grafica. Mai concret: • • • • •
Putem clona istoricul sau putem interactiona cu el Putem crea branch-uri Putem da commit la ce am scris noi (acest commit se face local) Putem face merge Putem schimba si testa diferite versiuni ale codului, etc.
Hai sa vedem comenzile pe care sa le dam pentru a configura contul de GitHub si cum se seteaza mai multi useri ce pot lucra la codul tau. Dupa asta vom adauga in Repository si vom modifica codul astfel incat munca ta sa evolueze in directia cea buna. Bineinteles, te poti oricand intoarce la anumite salvari ale codului tau, deci nu fi speriat daca ai gresit ceva. Este posibil ca oricand sa reincepi de la un nivel in care erai multumit. INTRA AICI pentru a vedea cum sa folosesti Git. _____________________________________________________________________ 174
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Cum urcam codul pe GitHub? Stocand munca ta intr-o baza de date (repository) din GitHub, vei avea posibilitatea sa revii oricand la stadii din proiectele tale si sa inviti alte persoane sa contribuie la codul tau. Poti avea repository-uri publice si private, acestea din urma trebuind sa fie platite. Sunt multe alte platforme asemenatoare cu GitHub, dar aceasta este totusi cea mai cunoscuta pentru cod open source. Sa nu mai vorbesc ca marea majoritate a angajatorilor se ajuta foarte mult de ea si cer aplicantilor la job-urile lor sa-si prezinte portofoliul aici. Acum vei afla cum sa accesezi codul tau in GitHub, cum sa-l downloadezi si cum sa-l copiezi sau modifici. Bineinteles ca poti lua bucati de cod din anumite repository-uri si sa lucrezi la ele, dupa care sa le urci inapoi in repository-ul de care apartin si sa astepti sa vezi daca ai avut o contributie de succes, care multumeste pe toata lumea. Vei invata cum sa-ti creezi repository-urile tale si cum sa urci munca ta pe platforma. Poti vedea cine a adaugat ceva codul tau, urmarind commit-urile ce s-au facut. Urmareste acest video BONUS pentru a vedea cum poti face asta: INTRA AICI.
_____________________________________________________________________ 175
#InvataProgramare - Introducere in Programare cu Python
___________________________________________________________________
Care sunt urmatorii pasi? Si iata-ne ajunsi la final! Da-mi voie sa te felicit pentru parcursul tau pentru ca ai ajuns pana aici. Iti vine sa crezi sau nu dar nu foarte multi oameni reusesc sa parcurga o carte sau un curs, asadar acesta este meritul tau si ma bucur foarte mult esti aici. In continuare, pentru urmatoarea etapa, iti recomand sa incepi sa dezvolti proiecte, aplicatii software, prin care sa rezolvi diverse situatii (probleme) din lumea reala (indiferent de nivelul acestora). Poate te confrunti tu cu diverse probleme, in mod constant, acasa, la scoala, la locul de munca actual pe care le-ai putea solutiona cu ajutorul programarii. Acum practica este cel mai important lucru de care ai nevoie pentru ca toate aceste cunostinte pe care le dobandit sa devina abilitati care te vor servi pe mai departe in ceea ce iti propui tu sa faci in domeniul IT. Iti recomand sa dezvolti mai multe proiecte, sa urci codul pe GitHub (astfel dezvoltandu-ti un portofoliu) si sa te prezinti in fata angajatorului (sau in fata unui potential client asta daca iti doresti partea de freelancing) pentru ca sansele tale de reusita sa fie net superioare fata de media din piata. Construind acest portofoliu pe GitHub (si de ce nu, chiar si unul de Linkedin) te vei diferentia fata de restul persoanelor care incearca sa obtina un job in domeniu. Totodata pentru a aprofunda studiile te invit sa programezi o discutie telefonica sau pe Zoom cu un membru din echipa mea care te va ghida in urmatoarea etapa pentru a ajunge acolo unde iti doresti. Tot ce ai de facut este sa apesi pe acest link sa completez formularul, iar apoi colegii mei te vor contacta pentru a purta o discutie cu tine. Acestia te vor ajuta sa-ti dezvolti un plan personalizat de invatare pentru a obtine rezultate mai rapid si a ajunge sa faci printr-o cariera in IT, ceea ce iubesti cu adevarat. Iti doresc mult succes in ceea ce ti-ai propus si drum bun in noua ta etapa. Ramon
_____________________________________________________________________ 176