Scrierea funcțiilor este mai mult sau mai puțin instrumentul final din setul de instrumente al programatorului și, după cum am învățat de-a lungul anilor mei de predare, adesea provoacă cele mai multe probleme.
Acum s-ar putea să vă gândiți, „hei, așteptați, știm deja despre funcții. Acesta este ceva nou?” Da, este. Anterior, în această carte, am făcut o mulțime de funcții de apelare – de la cele simple precum len() și np.append() la cele complexe precum pd.read_csv() la scipy.stats.chi2_contingency() – pe care altcineva le-a scris pentru noi. În schimb, în acest capitol, ne uităm în spatele cortinei și ne alăturăm personalului de producție: ne scriem propriile funcții.
Se pare că sunt implicate o mulțime de prostii sintactice pentru a obține tot cablajul corect atunci când faci asta. Poate determina elevii să-și smulgă părul din cap. Deci, merită să ne întrebăm de la început: ce primim pentru toată această durere?
Răspunsul este subtil și poate părea dezamăgitor la început, dar este crucial. În esență, se rezumă la această lecție: orice lucrare creativă complexă (inclusiv un program de calculator) ar trebui să fie modulară în design. Aceasta înseamnă că ar trebui să fie compus din blocuri de construcție mai mici, care sunt, la rândul lor, compuse din blocuri de construcție și mai mici. Întregul lucru ar trebui să cuprindă un întreg organizat.
Orice alt mod de a face asta duce la nebunie.
Gândiți-vă la un motor de mașină. Când un mecanic deschide capota, el sau ea nu vede doar un singur lucru mare monolit numit „Motorul”, ci mai degrabă ansambluri de pistoane, bujii, pompe de apă, arbori de transmisie și o mulțime de alte subsisteme. Este ceea ce permite investigarea piesă cu piesă a problemelor și înlocuirea piesă cu piesă a pieselor proaste.
Sau gândiți-vă la o melodie rock’n’roll. Nu este doar o bloc de sunet impenetrabil. În schimb, este o colecție de linii de bas recunoscute, secvențe de tobe, modele vocale și variații ale riff-urilor obișnuite de chitară. Nu vreau să minimizez creativitatea implicată în orchestrarea acesteia; de fapt, noua combinație a nenumăratelor blocuri posibile este creativitatea. Dacă melodia ar fi doar un bloc impermeabil de sunet, ar fi zgomot, nu muzică.
În același mod, odată ce codul dvs. de analiză a datelor se apropie de o anumită dimensiune, trebuie într-adevăr să fie scris într-un mod modular, altfel va deveni o mizerie fără speranță, ceea ce programatorii numesc „cod spaghetti”. Și modalitatea de a realiza acest lucru este prin a-l scrie în termeni de funcții pe care apoi le apelați la momentul potrivit.
Un alt avantaj al acestei abordări, de altfel, este că funcțiile sunt reutilizabile. Gândiți-vă la câți programatori din întreaga lume au avut motive să apeleze np.sort(), sau scipy.stats.pearsonr()! Aceeași funcție devine aplicabilă într-o varietate de contexte diferite, astfel încât nimeni să nu fie nevoit să reinventeze roata.
Declarația def
Bine, să detaliem. Modul de a crea (nu de a apela) o funcție în Python este utilizarea instrucțiunii def. Pentru primul nostru exemplu, să scriem o funcție pentru a calcula scorul unei echipe de fotbal (americane) într-un joc:
def football_score(num_tds, num_fgs): return num_tds * 7 + num_fgs * 3
Pentru cei care nu sunt familiarizați cu scorul la fotbal, fiecare „touchdown” (sau TD pe scurt) marcat de o echipă valorează șapte puncte, iar fiecare „gol de teren” (sau FG) valorează trei puncte. (Pentru cei care sunt familiarizați cu scorul la fotbalul, vă rugăm să iertați simplificările de aici – lovituri de puncte suplimentare, siguranțe etc. Este un prim exemplu.)
După cum puteți vedea din fragmentul de cod de mai sus, cuvântul def (care înseamnă „definiți”, deoarece „definim” – a.k.a. scriem – o funcție) este urmat de numele funcției noastre, care, ca un nume de variabilă, poate fi orice nume pe care îl alegem. După nume este lista de argumente ale funcției, în paranteze.
Toate acestea ce este antetul funcției. Corpul, ca și alte „corpuri” pe care le-am văzut deja, este indentat dedesubt. Corpul football_score are o singură linie, dar poate fi atât de multe rânduri câte sunt necesare.
În cele din urmă, vedem cuvântul „return” pe ultima linie. Acesta este modul în care controlăm valoarea returnată care este dată înapoi codului care a numit funcția noastră (revizuiți secțiunea 5.3 dacă aveți nevoie de o actualizare în acest sens). Ori de câte ori o instrucțiune return este întâlnită în timpul execuției unei funcții, funcția se oprește imediat din execuție, iar valoarea specificată este transmisă înapoi codului de apelare.
Sursa: Stephen Davies, The Crystal Ball – Instruction Manual, Vol. 1: Introduction to Data Science, v. 1.1. Copyright © 2021 Stephen Davies. Licența CC BY-SA 4.0. Traducere și adaptare: Nicolae Sfetcu. © 2024 MultiMedia Publishing, Introducere în Știința Datelor, Volumul 1
Descoperă mai multe la MultiMedia
Abonează-te ca să primești ultimele articole prin email.



Lasă un răspuns