Kako stvoriti umjetnu inteligenciju? Kako stvoriti vlastitu neuronsku mrežu od nule u Python uvjetima i petljama

Ali zapravo, to je želja za stvaranjem savršenog umjetna inteligencija, bilo model igre ili mobilni program, nadahnuo je mnoge od nas da postanemo programeri. Problem je što je iza tona edukativnog materijala i surove stvarnosti kupaca upravo ta želja zamijenjena jednostavnom željom za samorazvojem. Za one koji još nisu počeli ispunjavati svoj san iz djetinjstva, evo kratkog vodiča za stvaranje prave umjetne inteligencije.

Faza 1. Razočaranje

Kada govorimo o stvaranju čak i jednostavnih robota, oči nam se pune sjajem, a kroz glave nam prolaze stotine ideja o tome što bi on trebao moći raditi. No, kada dođe do implementacije, ispada da je ključ rješenja pravi model ponašanje je...matematika. Da budemo malo precizniji, evo popisa njegovih odjeljaka koje je potrebno proučavati barem u formatu sveučilišnog obrazovanja:

    Linearna algebra;

  • Teorija grafova;

    Teorija vjerojatnosti i matematička statistika.

Ovo je znanstvena odskočna daska na kojoj će se graditi vaše daljnje programiranje. Bez poznavanja i razumijevanja ove teorije, sve ideje će se vrlo brzo srušiti zbog interakcije s osobom, jer umjetna inteligencija zapravo nije ništa više od skupa formula.

Faza 2. Prihvaćanje

Kad se bahatost malo sruši studentskom literaturom, možete početi učiti jezike. Još uvijek ne vrijedi žuriti s LISP-om ili drugim; prvo morate naučiti kako raditi s varijablama i stanjima s jednom vrijednošću. Savršen je i za brzo učenje i za daljnji razvoj, ali općenito možete uzeti kao osnovu bilo koji jezik koji ima odgovarajuće biblioteke.

Faza 3. Razvoj

Prijeđimo sada izravno na teoriju umjetne inteligencije. Mogu se grubo podijeliti u 3 kategorije:

    Slab AI - botovi koje vidimo u računalne igrice, ili jednostavnih pomoćnika poput Sirija. Oni ili obavljaju usko specijalizirane zadatke ili su beznačajan sklop istih, te ih svaka nepredvidivost interakcije zbunjuje.

    Jaka umjetna inteligencija su strojevi čija je inteligencija usporediva s ljudski mozak. Trenutno nema pravih predstavnika ove klase, ali računala poput Watsona vrlo su blizu ostvarenju ovog cilja.

    Savršena umjetna inteligencija je budućnost, strojni mozak koji će nadmašiti naše mogućnosti. Upravo na opasnosti takvog razvoja događaja upozoravaju Stephen Hawking, Elon Musk i filmska franšiza Terminator.

Naravno, trebali biste početi s najjednostavnijim botovima. Da biste to učinili, sjetite se dobre stare igre "Tic Tac Toe" kada koristite polje 3x3 i pokušajte sami shvatiti osnovne algoritme akcija: vjerojatnost pobjede s akcijama bez grešaka, najuspješnija mjesta na polju do mjesto figure, potreba da se igra svede na remi, i tako dalje.

Kao što možete razumjeti čak i iz naziva, ovo su API-ji koji će vam omogućiti stvaranje privida ozbiljne umjetne inteligencije bez gubljenja vremena.

Faza 5. Rad

Sada kada imate jasnu ideju o tome kako stvoriti AI i što koristiti, vrijeme je da podignete svoje znanje na višu razinu. Prvo, to će zahtijevati proučavanje discipline pod nazivom "Strojno učenje". Drugo, trebate naučiti kako raditi s odgovarajućim bibliotekama odabranog programskog jezika. Za Python koji gledamo, to su Scikit-learn, NLTK, SciPy, PyBrain i Nump. Treće, u razvoju nema izlaza

James Loy, Georgia Tech. Vodič za početnike, nakon kojeg možete izraditi vlastiti živčana mreža u Pythonu.

Motivacija: usredotočujući se na osobno iskustvo u učenju dubokog učenja, odlučio sam stvoriti neuronsku mrežu od nule bez složene biblioteke za obuku kao što je . Vjerujem da je za podatkovnog znanstvenika početnika važno razumjeti unutarnju strukturu neuronske mreže.

Ovaj članak sadrži ono što sam naučio i nadam se da će biti koristan i vama! Drugi korisni članci o ovoj temi:

Što je neuronska mreža?

Većina članaka o neuronskim mrežama povlači paralele s mozgom kada ih opisuje. Lakše mi je opisati neuronske mreže kao matematičku funkciju koja preslikava dani ulaz u željeni izlaz, bez odlaska u previše detalja.

Neuronske mreže se sastoje od sljedećih komponenti:

  • ulazni sloj, x
  • proizvoljna količina skrivenih slojeva
  • izlazni sloj, ŷ
  • komplet mjerila I pomaci između svakog sloja W I b
  • izbor aktivacijske funkcije za svaki skriveni sloj σ ; u ovom radu ćemo koristiti Sigmoidnu aktivacijsku funkciju

Donji dijagram prikazuje arhitekturu dvoslojne neuronske mreže (imajte na umu da se ulazni sloj obično isključuje kada se broji broj slojeva u neuronskoj mreži).

Stvaranje klase neuronske mreže u Pythonu je jednostavno:

Trening neuronske mreže

Izlaz ŷ jednostavna dvoslojna neuronska mreža:

U gornjoj jednadžbi, težine W i pristranost b jedine su varijable koje utječu na izlaz ŷ.

Naravno, točne vrijednosti za težine i pristranosti određuju točnost predviđanja. Proces finog podešavanja težine i pristranosti iz ulaznih podataka poznat je kao treniranje neuronske mreže.

Svaka iteracija procesa učenja sastoji se od sljedećih koraka

  • izračunavanje predviđenog izlaza ŷ, koje se naziva širenje naprijed
  • ažuriranje težina i pristranosti, koje se naziva povratno širenje

Sekvencijalni grafikon u nastavku ilustrira proces:

Izravna distribucija

Kao što smo vidjeli na gornjem grafikonu, širenje naprijed samo je jednostavan izračun, a za osnovnu dvoslojnu neuronsku mrežu, izlaz neuronske mreže dan je kao:

Dodajmo funkciju propagacije naprijed našem Python kodu da to učinimo. Imajte na umu da smo radi jednostavnosti pretpostavili da su pomaci 0.

Međutim, potreban nam je način da procijenimo "dobrotu" naših prognoza, odnosno koliko su naše prognoze daleko od njih). Funkcija gubitka samo nam omogućuje da to učinimo.

Funkcija gubitka

Ima ih mnogo dostupne funkcije gubici, a priroda našeg problema trebala bi diktirati naš izbor funkcije gubitka. U ovom radu ćemo koristiti zbroj kvadrata pogrešaka kao funkcija gubitka.

Zbroj kvadrata pogrešaka prosjek je razlika između svake predviđene i stvarne vrijednosti.

Cilj učenja je pronaći skup težina i pristranosti koji minimizira funkciju gubitka.

Širenje unatrag

Sada kada smo izmjerili grešku u našoj prognozi (gubitak), moramo pronaći način širenje pogreške natrag i ažurirati naše težine i predrasude.

Da bismo znali odgovarajući iznos za prilagodbu pondera i odstupanja, moramo znati derivaciju funkcije gubitka s obzirom na pondere i odstupanja.

Podsjetimo iz analize da Derivacija funkcije je nagib funkcije.

Ako imamo izvedenicu, tada možemo jednostavno ažurirati težine i pristranosti povećavajući/smanjujući ih (pogledajte gornji dijagram). To se zove gradijentni spust.

Međutim, ne možemo izravno izračunati derivaciju funkcije gubitka s obzirom na težine i pristranosti jer jednadžba funkcije gubitaka ne sadrži težine i pristranosti. Dakle, trebamo lančano pravilo koje će nam pomoći u izračunu.

Fuj! Ovo je bilo glomazno, ali nam je omogućilo da dobijemo ono što smo trebali — derivaciju (nagib) funkcije gubitka s obzirom na težine. Sada možemo prilagoditi težine prema tome.

Dodajmo funkciju backpropagation našem Python kodu:

Provjera rada neuronske mreže

Sada kada imamo potpuni Python kod za propagaciju naprijed i natrag, prošetajmo kroz našu neuronsku mrežu s primjerom i vidimo kako funkcionira.


Idealan set vaga

Naša neuronska mreža mora naučiti idealan skup težina za predstavljanje ove funkcije.

Istrenirajmo neuronsku mrežu za 1500 ponavljanja i vidimo što će se dogoditi. Gledajući donji dijagram gubitaka iteracije, možemo jasno vidjeti da se gubitak monotono smanjuje na minimum. Ovo je u skladu s algoritmom gradijentnog spuštanja o kojem smo ranije govorili.

Pogledajmo konačno predviđanje (izlaz) iz neuronske mreže nakon 1500 ponavljanja.

Uspjeli smo! Naš algoritam širenja naprijed i natrag pokazao je da neuronska mreža uspješno radi, a predviđanja konvergiraju prema pravim vrijednostima.

Imajte na umu da postoji mala razlika između predviđanja i stvarnih vrijednosti. To je poželjno jer sprječava prekomjerno prilagođavanje i omogućuje neuronskoj mreži da bolje generalizira nevidljive podatke.

Završne misli

Puno sam naučio u procesu pisanja vlastite neuronske mreže od nule. Iako vam biblioteke za duboko učenje kao što su TensorFlow i Keras omogućuju izgradnju dubokih mreža bez potpunog razumijevanja unutarnjeg rada neuronske mreže, smatram da je korisno za ambiciozne podatkovne znanstvenike da ih dublje razumiju.

Uložio sam puno svog osobnog vremena u ovaj posao, i nadam se da će vam biti od koristi!

Sada doživljavamo pravi procvat neuronskih mreža. Koriste se za prepoznavanje, lokalizaciju i obradu slike. Neuronske mreže već sada mogu učiniti mnoge stvari koje nisu dostupne ljudima. Moramo se i sami uključiti u ovu stvar! Razmotrite neutronsku mrežu koja će prepoznati brojeve na ulaznoj slici. Vrlo je jednostavno: samo jedan sloj i funkcija aktivacije. To nam neće omogućiti prepoznavanje apsolutno svih testnih slika, ali možemo se nositi s velikom većinom. Kao podatke koristit ćemo zbirku podataka MNIST-a, dobro poznatu u svijetu prepoznavanja brojeva.

Za rad s njim u Pythonu postoji biblioteka python-mnist. Instalirati:

Pip instaliraj python-mnist

Sada možemo učitati podatke

Iz mnist import MNIST mndata = MNIST("/path_to_mnist_data_folder/") tr_images, tr_labels = mndata.load_training() test_images, test_labels = mndata.load_testing()

Morate sami preuzeti arhive s podacima i programu navesti put do direktorija s njima. Sada varijable tr_images i test_images sadrže slike za obuku mreže, odnosno testiranje. A varijable tr_labels i test_labels su oznake s ispravnom klasifikacijom (tj. brojevi sa slika). Sve slike su veličine 28x28. Postavimo varijablu s veličinom.

Oblik_slike = (28, 28)

Pretvorimo sve podatke u numpy nizove i normalizirajmo ih (promijenimo im veličinu na veličinu od -1 do 1). To će povećati točnost izračuna.

Uvezi numpy kao np za i u rasponu (0, len(test_slike)): test_slike[i] = np.array(test_slike[i]) / 255 za i u rasponu (0, len(tr_slike)): tr_slike[i] = np.array(tr_images[i]) / 255

Napominjem da iako su slike obično prikazane u obliku dvodimenzionalni niz koristit ćemo jednodimenzionalni, lakši je za izračune. Sada morate razumjeti "što je neuronska mreža"! A ovo je samo jednadžba s velikim brojem koeficijenata. Imamo ulazni niz od 28*28=784 elementa i još 784 težine za određivanje svake znamenke. Tijekom rada neuronske mreže morate pomnožiti ulazne vrijednosti s težinama. Dodajte dobivene podatke i dodajte pomak. Rezultirajući rezultat šalje se aktivacijskoj funkciji. U našem slučaju to će biti Relu. Ova je funkcija jednaka nuli za sve negativne argumente i nuli za sve pozitivne argumente.

Postoji mnogo više funkcija aktivacije! Ali ovo je najjednostavnija neuronska mreža! Definirajmo ovu funkciju koristeći numpy

Def relu(x): return np.maximum(x, 0)

Sada, da biste izračunali sliku na slici, trebate izračunati rezultat za 10 skupova koeficijenata.

Def nn_calculate(img): resp = list(range(0, 10)) for i in range(0,10): r = w[:, i] * img r = relu(np.sum(r) + b[ i]) resp[i] = r return np.argmax(resp)

Za svaki skup dobit ćemo izlazni rezultat. Izlaz s najvećim rezultatom najvjerojatnije je naš broj.

U ovom slučaju 7. To je sve! Ali ne... Uostalom, te iste koeficijente negdje treba nabaviti. Moramo istrenirati našu neuronsku mrežu. Za to se koristi metoda povratnog širenja. Njegova bit je izračunati mrežne izlaze, usporediti ih s točnima, a zatim od koeficijenata oduzeti brojeve potrebne da bi rezultat bio točan. Mora se imati na umu da je za izračunavanje ovih vrijednosti potrebna derivacija aktivacijske funkcije. U našem slučaju, jednaka je nuli za sve negativne brojeve i 1 za sve pozitivne. Odredimo koeficijente nasumično.

W = (2*np.random.rand(10, 784) - 1) / 10 b = (2*np.random.rand(10) - 1) / 10 za n u rasponu (len(tr_images)): img = tr_images[n] cls = tr_labels[n] #naprijed propagacija resp = np.zeros(10, dtype=np.float32) za i u rasponu(0,10): r = w[i] * img r = relu( np.sum(r) + b[i]) resp[i] = r resp_cls = np.argmax(resp) resp = np.zeros(10, dtype=np.float32) resp = 1,0 #povratno širenje true_resp = np. nule(10, dtype=np.float32) true_resp = 1.0 pogreška = resp - true_resp delta = pogreška * ((resp >= 0) * np.ones(10)) za i u rasponu (0,10): w[i ] -= np.dot(img, delta[i]) b[i] -= delta[i]

Kako obuka napreduje, koeficijenti će početi pomalo nalikovati brojevima:

Provjerimo točnost rada:

Def nn_calculate(img): resp = list(range(0, 10)) for i in range(0,10): r = w[i] * img r = np.maximum(np.sum(r) + b[ i], 0) #relu resp[i] = r return np.argmax(resp) total = len(test_images) valid = 0 invalid = for i in range(0, total): img = test_images[i] predicted = nn_calculate (img) true = test_labels[i] if predicted == true: valid = valid + 1 else: invalid.append(("image":img, "predicted":predicted, "true":true)) print("accuracy ()".format(važeći/ukupno))

Dobio sam 88%. Nije tako cool, ali vrlo zanimljivo!

Ovaj tjedan mogli ste pročitati iznimno motivirajući slučaj GeekBrains studenta koji je studirao struku, gdje je govorio o jednom od svojih ciljeva koji su ga doveli do profesije – želji da nauči princip rada i nauči kako sami kreirati gaming botove.

No doista, upravo je želja za stvaranjem savršene umjetne inteligencije, bilo da se radi o modelu igre ili mobilnom programu, mnoge od nas gurnula na put programera. Problem je što je iza tona edukativnog materijala i surove stvarnosti kupaca upravo ta želja zamijenjena jednostavnom željom za samorazvojem. Za one koji još nisu počeli ispunjavati svoj san iz djetinjstva, evo kratkog vodiča za stvaranje prave umjetne inteligencije.

Faza 1. Razočaranje

Kada govorimo o stvaranju čak i jednostavnih robota, oči nam se ispune sjajem, a kroz glavu nam prolaze stotine ideja o tome što bi on trebao moći raditi. Međutim, kada je u pitanju implementacija, ispada da je ključ za razotkrivanje stvarnog obrasca ponašanja matematika. Da, da, umjetna inteligencija puno je kompliciranija od pisanja aplikativnih programa - samo znanje o dizajnu softvera neće vam biti dovoljno.

Matematika je znanstvena odskočna daska na kojoj će se graditi vaše daljnje programiranje. Bez poznavanja i razumijevanja ove teorije, sve ideje će se brzo srušiti zbog interakcije s osobom, jer umjetna inteligencija zapravo nije ništa više od skupa formula.

Faza 2. Prihvaćanje

Kad se bahatost malo sruši studentskom literaturom, možete početi vježbati. Još uvijek ne vrijedi žuriti s LISP-om ili drugima - prvo se trebate upoznati s načelima AI dizajna. Python je savršen kako za brzo učenje, tako i za daljnji razvoj - to je jezik koji se najčešće koristi u znanstvene svrhe, a za koji ćete pronaći brojne biblioteke koje će vam olakšati rad.

Faza 3. Razvoj

Prijeđimo sada izravno na teoriju umjetne inteligencije. Mogu se grubo podijeliti u 3 kategorije:

  • Slab AI – botovi koje viđamo u računalnim igrama ili jednostavni pomoćnici poput Sirija. Oni ili obavljaju usko specijalizirane zadatke ili su beznačajan sklop istih, a svaka nepredvidivost interakcije ih zbunjuje.
  • Jaka umjetna inteligencija su strojevi čija je inteligencija usporediva s ljudskim mozgom. Trenutno nema pravih predstavnika ove klase, ali računala poput Watsona vrlo su blizu ostvarenja ovog cilja.
  • Savršena umjetna inteligencija je budućnost, strojni mozak koji će nadmašiti naše mogućnosti. Upravo na opasnosti takvog razvoja događaja upozoravaju Stephen Hawking, Elon Musk i filmska franšiza Terminator.

Naravno, trebali biste početi s najjednostavnijim botovima. Da biste to učinili, sjetite se dobre stare igre "Tic Tac Toe" kada koristite polje 3x3 i pokušajte sami shvatiti osnovne algoritme akcija: vjerojatnost pobjede s akcijama bez grešaka, najuspješnija mjesta na polju do mjesto figure, potreba da se igra svede na remi, i tako dalje.

Nekoliko desetaka igara i analiziranje vlastitih radnji, vjerojatno ćete moći identificirati sve važne aspekte i prepisati ih u strojni kod. Ako ne, onda nastavite razmišljati, a ovaj link će biti ovdje za svaki slučaj.

Usput, ako ste konačno naučili jezik Python, možete izraditi prilično jednostavnog bota pozivajući se na ovaj detaljni priručnik. Za druge jezike, kao što su C++ ili Java, nećete imati problema s pronalaženjem materijala korak po korak. Nakon što osjetite da nema ničeg nadnaravnog iza stvaranja umjetne inteligencije, možete sigurno zatvoriti preglednik i započeti osobne eksperimente.

Stadij 4. Uzbuđenje

Sad kad su stvari krenule s mrtve točke, vjerojatno želite stvoriti nešto ozbiljnije. Sljedeći resursi pomoći će vam u tome:

Kao što možete razumjeti čak i iz naziva, ovo su API-ji koji će vam omogućiti stvaranje privida ozbiljne umjetne inteligencije bez gubljenja vremena.

Faza 5. Rad

Sada kada imate jasnu ideju o tome kako stvoriti AI i što koristiti, vrijeme je da podignete svoje znanje na višu razinu. Prvo, to će zahtijevati proučavanje discipline pod nazivom "Strojno učenje". Drugo, trebate naučiti kako raditi s odgovarajućim bibliotekama odabranog programskog jezika. Za Python koji gledamo, to su Scikit-learn, NLTK, SciPy, PyBrain i Numpy. Treće, u razvoju nema izlaza. Pa, i što je najvažnije, sada možete čitati literaturu o umjetnoj inteligenciji s potpunim razumijevanjem materije:

  • Umjetna inteligencija za igre, Ian Millington;
  • Obrasci programiranja igara, Robert Naystorm;
  • Algoritmi umjetne inteligencije, strukture podataka i idiomi u Prologu, Lispu i Javi, George Luger, William Stubfield;
  • Računalna kognitivna neuroznanost, Randall O'Reilly, Yuko Munakata;
  • Umjetna inteligencija: moderan pristup, Stuart Russell, Peter Norvig.

I da, sva ili gotovo sva literatura o ovoj temi je predstavljena na strani jezik, pa ako želite profesionalno stvarati AI, morate poboljšati svoj engleski na tehnička razina. Međutim, ovo je relevantno za bilo koje područje programiranja, zar ne?

Neuronske mreže se stvaraju i treniraju uglavnom u Pythonu. Stoga je vrlo važno imati osnovno razumijevanje kako u njemu pisati programe. U ovom članku ću kratko i jasno govoriti o osnovnim konceptima ovog jezika: varijablama, funkcijama, klasama i modulima.

Materijal je namijenjen osobama koje nisu upoznate s programskim jezicima.

Prvo morate instalirati Python. Zatim trebate instalirati prikladno okruženje za pisanje programa u Pythonu. Portal je posvećen ova dva koraka.

Ako je sve instalirano i konfigurirano, možete početi.

Varijable

Varijabilna- ključni koncept u svakom programskom jeziku (i ne samo u njima). Varijablu je najlakše zamisliti kao okvir s oznakom. Ova kutija sadrži nešto (broj, matricu, objekt, ...) što nam je vrijedno.

Na primjer, želimo stvoriti varijablu x koja bi trebala pohraniti vrijednost 10. U Pythonu bi kod za stvaranje ove varijable izgledao ovako:

S lijeve strane mi objavljujemo varijabla imena x. To je jednako stavljanju pločice s imenom na kutiju. Zatim dolazi znak jednakosti i broj 10. Znak jednakosti ovdje igra neobičnu ulogu. To ne znači da je "x jednako 10". Jednakost u ovom slučaju stavlja broj 10 u okvir. Točnije rečeno, mi dodijeliti varijabla x je broj 10.

Sada, u donjem kodu možemo pristupiti ovoj varijabli i izvršiti razne radnje s njom.

Možete jednostavno prikazati vrijednost ove varijable na ekranu:

X=10 ispis(x)

print(x) predstavlja poziv funkcije. Razmotrit ćemo ih dalje. Sada je bitno da ova funkcija ispisuje na konzolu ono što se nalazi između zagrada. Između zagrada imamo x. Prethodno smo x dodijelili vrijednost 10. To je ono što se 10 ispisuje u konzoli ako pokrenete gornji program.

S varijablama koje pohranjuju brojeve mogu se izvoditi razne jednostavne operacije: zbrajanje, oduzimanje, množenje, dijeljenje i stepenovanje.

X = 2 y = 3 # Zbrajanje z = x + y ispis(z) # 5 # Razlika z = x - y ispis(z) # -1 # Proizvod z = x * y ispis(z) # 6 # Dijeljenje z = x / y print(z) # 0,66666... ​​​​# Potenciranje z = x ** y print(z) # 8

U gornjem kodu prvo stvaramo dvije varijable koje sadrže 2 i 3. Zatim stvaramo varijablu z koja pohranjuje rezultat operacije na x i y i ispisuje rezultate na konzoli. Ovaj primjer jasno pokazuje da varijabla može promijeniti svoju vrijednost tijekom izvođenja programa. Dakle, naša varijabla z mijenja svoju vrijednost čak 5 puta.

Funkcije

Ponekad postaje potrebno ponavljati iste radnje iznova i iznova. Na primjer, u našem projektu često trebamo prikazati 5 redaka teksta.

“Ovo je vrlo važan tekst!”
“Ovaj tekst se ne može pročitati”
“Greška u gornjem redu napravljena je namjerno”
"Zdravo i doviđenja"
"Kraj"

Naš kod će izgledati ovako:

X = 10 y = x + 8 - 2 print("Ovo je vrlo važan tekst!") print("Ovaj tekst se ne može pročitati") print("Greška u gornjem retku napravljena je namjerno") print(" Pozdrav i doviđenja") print ("Kraj") z = x + y print("Ovo je vrlo važan tekst!") print("Ovaj tekst se ne može pročitati") print("Napravljena je greška u gornjem retku namjerno”) print(“Zdravo i bok”) print ("Kraj") test = z print("Ovo je vrlo važan tekst!") print("Ovaj tekst se ne može pročitati") print("Pogreška u gornji red je napravljen namjerno") print("Zdravo i doviđenja") print(" Kraj")

Sve to izgleda vrlo suvišno i nezgodno. Osim toga, došlo je do greške u drugom redu. Može se popraviti, ali morat će se popraviti na tri mjesta odjednom. Što ako se ovih pet redaka u našem projektu pozove 1000 puta? I sve je na različitim mjestima i datotekama?

Posebno za slučajeve kada morate često izvršavati iste naredbe, možete kreirati funkcije u programskim jezicima.

Funkcija- zaseban blok koda koji se može zvati imenom.

Funkcija je definirana pomoću ključne riječi de. Nakon toga slijedi naziv funkcije, zatim zagrade i dvotočka. Zatim trebate navesti, uvučeno, akcije koje će se izvršiti kada se funkcija pozove.

Def print_5_lines(): print("Ovo je vrlo važan tekst!") print("Ovaj tekst se ne može pročitati") print("Greška u gornjem redu je napravljena namjerno") print("Zdravo i doviđenja") print("Kraj")

Sada smo definirali funkciju print_5_lines(). Sada, ako u našem projektu ponovno trebamo umetnuti pet redaka, tada jednostavno pozivamo našu funkciju. Automatski će izvršiti sve radnje.

# Definirajte funkciju def print_5_lines(): print("Ovo je vrlo važan tekst!") print("Ovaj tekst se ne može pročitati") print("Pogreška u gornjem redu je bila namjerna") print("Zdravo i ćao ") print(" End") # Kod našeg projekta x = 10 y = x + 8 - 2 print_5_lines() z = x + y print_5_lines() test = z print_5_lines()

Zgodno, zar ne? Ozbiljno smo poboljšali čitljivost koda. Osim toga, funkcije su također dobre jer ako želite promijeniti neke radnje, onda samo trebate ispraviti samu funkciju. Ova promjena će raditi na svim mjestima gdje se poziva vaša funkcija. To jest, možemo ispraviti pogrešku u drugom retku izlaznog teksta (“ne” > “ne”) u tijelu funkcije. Ispravna opcija bit će automatski pozvana na svim mjestima u našem projektu.

Funkcije s parametrima

Svakako je zgodno jednostavno ponoviti nekoliko radnji. Ali to nije sve. Ponekad želimo proslijediti neku varijablu našoj funkciji. Na taj način funkcija može prihvatiti podatke i koristiti ih tijekom izvršavanja naredbi.

Varijable koje prosljeđujemo funkciji nazivamo argumenti.

Napišimo jednostavnu funkciju koja zbraja dva zadana broja i vraća rezultat.

Def sum(a, b): rezultat = a + b vraća rezultat

Prvi redak izgleda gotovo isto kao normalne funkcije. Ali između zagrada sada postoje dvije varijable. Ovaj opcije funkcije. Naša funkcija ima dva parametra (to jest, uzima dvije varijable).

Parametri se mogu koristiti unutar funkcije baš kao i obične varijable. U drugom retku kreiramo varijablu rezultat, koja je jednaka zbroju parametara a i b. U trećem redu vraćamo vrijednost varijable rezultat.

Sada, u daljnjem kodu možemo napisati nešto poput:

Novo = zbroj(2, 3) ispis(novo)

Pozivamo funkciju zbroja i prosljeđujemo joj dva argumenta redom: 2 i 3. 2 postaje vrijednost varijable a, a 3 postaje vrijednost varijable b. Naša funkcija vraća vrijednost (zbroj 2 i 3) i koristimo je za stvaranje nove varijable, new .

Zapamtiti. U gornjem kodu, brojevi 2 i 3 su argumenti funkcije zbroja. A u samoj funkciji zbroja varijable a i b su parametri. Drugim riječima, varijable koje prosljeđujemo funkciji kada se ona pozove nazivaju se argumentima. Ali unutar funkcije, ove proslijeđene varijable nazivaju se parametri. Zapravo, to su dva naziva za istu stvar, ali ih ne treba brkati.

Pogledajmo još jedan primjer. Kreirajmo funkciju square(a) koja uzima jedan broj i kvadrira ga:

Def square(a): return a * a

Naša funkcija sastoji se od samo jedne linije. Odmah vraća rezultat množenja parametra a s a .

Mislim da ste već pogodili da također ispisujemo podatke na konzolu pomoću funkcije. Ova se funkcija zove print() i ispisuje argument koji joj je proslijeđen na konzolu: broj, niz, varijablu.

Nizovi

Ako se varijabla može zamisliti kao kutija koja pohranjuje nešto (ne nužno broj), onda se nizovi mogu smatrati policama za knjige. Sadrže nekoliko varijabli odjednom. Evo primjera niza od tri broja i jednog niza:

Niz =

Evo primjera kada varijabla ne sadrži broj, već neki drugi objekt. U ovom slučaju naša varijabla sadrži niz. Svaki element niza je numeriran. Pokušajmo prikazati neki element niza:

Niz = ispis(niz)

Na konzoli ćete vidjeti broj 89. Ali zašto 89, a ne 1? Stvar je u tome što u Pythonu, kao iu mnogim drugim programskim jezicima, numeriranje nizova počinje od 0. Dakle, niz nam daje drugi element niza, a ne prvi. Da biste pozvali prvi, morali ste napisati niz.

Veličina polja

Ponekad je vrlo korisno dobiti broj elemenata u nizu. Za to možete koristiti funkciju len(). Izbrojat će broj elemenata i vratiti njihov broj.

Niz = ispis(len(niz))

Konzola će prikazati broj 4.

Uvjeti i ciklusi

Prema zadanim postavkama, bilo koji program jednostavno izvršava sve naredbe u nizu od vrha do dna. Ali postoje situacije kada moramo provjeriti neki uvjet, i ovisno o tome je li istinit ili ne, izvršiti različite radnje.

Osim toga, često postoji potreba za ponavljanjem gotovo istog niza naredbi mnogo puta.

U prvoj situaciji pomažu uvjeti, a u drugoj ciklusi.

Uvjeti

Uvjeti su potrebni za izvođenje dvaju različitih skupova radnji ovisno o tome je li izjava koja se testira istinita ili lažna.

U Pythonu se uvjeti mogu napisati korištenjem if: ... else: ... konstrukcije. Neka nam je neka varijabla x = 10. Ako je x manji od 10, tada želimo podijeliti x s 2. Ako je x veći ili jednak 10, tada želimo stvoriti još jednu novu varijablu, koja je jednaka zbroju x i broja 100. Ovo je kako će kod izgledati:

X = 10 ako (x< 10): x = x / 2 print(x) else: new = x + 100 print(new)

Nakon kreiranja varijable x, počinjemo pisati naš uvjet.

Sve počinje ključnom riječi if (u prijevodu s engleskog "ako"). U zagradi označavamo izraz koji treba provjeriti. U ovom slučaju provjeravamo je li naša varijabla x stvarno manja od 10. Ako je stvarno manja od 10, dijelimo je s 2 i ispisujemo rezultat na konzoli.

Zatim dolazi ključna riječ else , nakon čega počinje blok akcija koje će se izvršiti ako je izraz u zagradama iza if-a lažan.

Ako je veći ili jednak 10, tada kreiramo novu varijablu new, koja je jednaka x + 100 i također je šaljemo na konzolu.

Ciklusi

Petlje su potrebne za ponavljanje radnji mnogo puta. Recimo da želimo prikazati tablicu kvadrata prvih 10 prirodnih brojeva. Može se i ovako.

Print("Kvadrat 1 je " + str(1**2)) print("Kvadrat 2 je " + str(2**2)) print("Kvadrat 3 je " + str(3**2)) print( "Kvadrat 4 je " + str(4**2)) print("Kvadrat 5 je " + str(5**2)) print("Kvadrat 6 je " + str(6**2)) print("Kvadrat 7 je " + str(7**2)) print("Kvadrat od 8 je " + str(8**2)) print("Kvadrat od 9 je " + str(9**2)) print("Kvadrat od 10 je " + str(10**2))

Neka vas ne iznenadi činjenica da dodajemo linije. "početak retka" + "kraj" u Pythonu jednostavno znači ulančavanje nizova: "početak kraja retka". Na isti gornji način dodajemo niz "Kvadrat od x je jednak" i rezultat podizanja broja na 2. potenciju, pretvoren pomoću funkcije str(x**2).

Gornji kod izgleda vrlo suvišan. Što ako trebamo ispisati kvadrate prvih 100 brojeva? Mučimo se povući se...

Za takve slučajeve postoje ciklusi. U Pythonu postoje 2 vrste petlji: while i for. Obradimo ih jednog po jednog.

Dok petlja ponavlja potrebne naredbe sve dok je uvjet istinit.

X = 1 dok je x<= 100: print("Квадрат числа " + str(x) + " равен " + str(x**2)) x = x + 1

Prvo kreiramo varijablu i dodijelimo joj broj 1, zatim napravimo while petlju i provjerimo je li naš x manji od (ili jednak) 100. Ako je manje (ili jednako), tada izvodimo dvije radnje:

  1. Ispišite kvadrat x
  2. Povećaj x za 1

Nakon druge naredbe program se vraća na stanje. Ako je uvjet ponovno istinit, tada ponovno izvodimo ove dvije radnje. I tako dalje dok x ne postane jednak 101. Tada će uvjet vratiti false i petlja se više neće izvršavati.

For petlja je dizajnirana za ponavljanje kroz nizove. Zapišimo isti primjer s kvadratima prvih stotinu prirodnih brojeva, ali kroz for petlju.

Za x u rasponu (1,101): print("Kvadrat broja " + str(x) + " je " + str(x**2))

Pogledajmo prvi redak. Koristimo ključnu riječ for za stvaranje petlje. Zatim specificiramo da želimo ponoviti određene radnje za sve x u rasponu od 1 do 100. Funkcija range(1,101) stvara niz od 100 brojeva, počevši s 1 i završavajući sa 100.

Evo još jednog primjera ponavljanja niza pomoću for petlje:

Za i u: print(i * 2)

Gornji kod ispisuje 4 broja: 2, 20, 200 i 2000. Ovdje možete jasno vidjeti kako uzima svaki element niza i izvodi niz radnji. Zatim uzima sljedeći element i ponavlja isti skup radnji. I tako sve dok ne ponestane elemenata u nizu.

Klase i objekti

U stvarnom životu ne operiramo s varijablama ili funkcijama, već s objektima. Olovka, auto, osoba, mačka, pas, avion - predmeti. Sada počnimo detaljno promatrati mačku.

Ima neke parametre. To uključuje boju dlake, boju očiju i njezin nadimak. Ali to nije sve. Osim parametara, mačka može izvoditi razne radnje: predenje, siktanje i grebanje.

Upravo smo shematski opisali sve mačke općenito. Sličan opis svojstava i djelovanja neki objekt (na primjer, mačka) u Pythonu se naziva klasa. Klasa je jednostavno skup varijabli i funkcija koje opisuju objekt.

Važno je razumjeti razliku između klase i objekta. razred - shema, koji opisuje predmet. Objekt je ona materijalno utjelovljenje. Klasa mačke je opis njegovih svojstava i djelovanja. Objekt mačke je sama prava mačka. Može postojati mnogo različitih pravih mačaka - mnogo mačjih predmeta. Ali postoji samo jedna klasa mačaka. Dobra demonstracija je slika ispod:

Nastava

Da biste kreirali klasu (shemu naše mačke), trebate napisati ključnu riječ class i zatim navesti naziv ove klase:

Razred Cat:

Zatim moramo navesti akcije ove klase (cat akcije). Akcije su, kao što ste mogli pretpostaviti, funkcije definirane unutar klase. Takve funkcije unutar klase obično se nazivaju metode.

metoda- funkcija definirana unutar klase.

Gore smo već verbalno opisali mačje metode: predenje, siktanje, grebanje. Učinimo to sada u Pythonu.

# Cat class class Cat: # Purr def purr(self): print("Purrr!") # Hiss def hiss(self): print("Shhh!") # Scratch def scrabble(self): print("Scratch-scratch" !")

Tako je jednostavno! Uzeli smo i definirali tri obične funkcije, ali samo unutar klase.

Kako bismo se nosili s nerazumljivim self parametrom, dodajmo još jednu metodu našoj mački. Ova metoda će pozvati sve tri već kreirane metode odjednom.

# Cat class class Cat: # Purr def purr(self): print("Purrr!") # Hiss def hiss(self): print("Shhh!") # Scratch def scrabble(self): print("Scratch-scratch" !") # Svi zajedno def all_in_one(self): self.purr() self.hiss() self.scrabble()

Kao što vidite, self parametar, potreban za bilo koju metodu, omogućuje nam pristup metodama i varijablama same klase! Bez tog argumenta ne bismo mogli izvoditi takve radnje.

Postavimo sada svojstva naše mačke (boja krzna, boja očiju, nadimak). Kako to učiniti? U apsolutno svakoj klasi možete definirati funkciju __init__(). Ova funkcija se uvijek poziva kada kreiramo pravi objekt naše klase.

U gore istaknutoj metodi __init__() postavljamo varijable naše mačke. Kako ćemo to učiniti? Prvo, ovoj metodi prosljeđujemo 3 argumenta koji su odgovorni za boju dlake, boju očiju i nadimak. Zatim koristimo self parametar da odmah postavimo svoju mačku na 3 gore opisana atributa prilikom stvaranja objekta.

Što znači ova linija?

Self.boja_vune = boja_vune

S lijeve strane stvaramo atribut za našu mačku pod nazivom wool_color, a zatim tom atributu dodjeljujemo vrijednost koja je sadržana u parametru wool_color koji smo proslijedili funkciji __init__(). Kao što vidite, linija iznad se ne razlikuje od normalnog stvaranja varijabli. Samo prefiks self označava da ova varijabla pripada klasi Cat.

Atribut- varijabla koja pripada klasi.

Dakle, stvorili smo gotovu klasu mačaka. Evo njegovog koda:

# Cat class class Cat: # Akcije koje treba izvršiti prilikom kreiranja "Cat" objekta def __init__(self, wool_color, eyes_color, name): self.wool_color = wool_color self.eyes_color = eyes_color self.name = name # Purr def purr( self): print("Purrr!") # Hiss def hiss(self): print("Shhh!") # Scratch def scrabble(self): print("Scratch-scratch!") # Svi zajedno def all_in_one(self) : self.purr() self.hiss() self.scrabble()

Predmeti

Napravili smo mačji dijagram. Kreirajmo sada pravi objekt mačke pomoću ove sheme:

Moja_mačka = Mačka("crna", "zelena", "Zosya")

U retku iznad kreiramo varijablu my_cat i zatim joj dodijelimo objekt klase Cat. Ovo sve izgleda kao poziv neke funkcije Cat(...) . Zapravo, ovo je istina. Ovim unosom pozivamo metodu __init__() klase Cat. Funkcija __init__() u našoj klasi uzima 4 argumenta: sam objekt klase self, koji ne treba specificirati, kao i još 3 različita argumenta, koji zatim postaju atributi naše mačke.

Dakle, pomoću crte iznad stvorili smo pravi objekt mačke. Naša mačka ima sljedeće atribute: crno krzno, zelene oči i nadimak Zosya. Ispišimo ove atribute na konzolu:

Print(my_cat.wool_color) print(my_cat.eyes_color) print(my_cat.name)

Odnosno, atributima objekta možemo pristupiti tako da napišemo naziv objekta, stavimo točku i naznačimo naziv željenog atributa.

Atributi mačke mogu se mijenjati. Na primjer, promijenimo ime naše mačke:

My_cat.name = "Nyusha"

Sada, ako ponovno prikažete ime mačke u konzoli, vidjet ćete Nyusha umjesto Zosia.

Dopustite mi da vas podsjetim da razred naše mačke dopušta obavljanje određenih radnji. Ako pomazimo našu Zosju/Njušu, ona će početi presti:

Moja_mačka.purr()

Izvršavanjem ove naredbe ispisat će se tekst "Purrr!" Kao što vidite, pristup metodama objekta jednako je jednostavan kao pristup njegovim atributima.

Moduli

Svaka datoteka s nastavkom .py je modul. Čak i ovaj u kojem radite na ovom članku. Za što su oni potrebni? Za udobnost. Puno ljudi stvara datoteke s korisnim funkcijama i klasama. Drugi programeri povezuju te module trećih strana i mogu koristiti sve funkcije i klase definirane u njima, čime si pojednostavljuju rad.

Na primjer, ne trebate gubiti vrijeme na pisanje vlastitih funkcija za rad s matricama. Dovoljno je spojiti numpy modul i koristiti njegove funkcije i klase.

Trenutno su drugi Python programeri napisali preko 110 000 različitih modula. Gore spomenuti modul numpy omogućuje vam brz i praktičan rad s matricama i višedimenzionalnim nizovima. Matematički modul nudi mnoge metode za rad s brojevima: sinuse, kosinuse, pretvaranje stupnjeva u radijane itd., itd...

Instalacija modula

Python je instaliran zajedno sa standardnim skupom modula. Ovaj skup uključuje vrlo velik broj modula koji vam omogućuju rad s matematikom, web zahtjevima, čitanje i pisanje datoteka i izvođenje drugih potrebnih radnji.

Ako želite koristiti modul koji nije uključen u standardni set, morat ćete ga instalirati. Da biste instalirali modul, otvorite naredbeni redak (Win + R, zatim unesite "cmd" u polje koje se pojavi) i unesite naredbu u njega:

Pip instalacija [naziv_modula]

Započet će proces instalacije modula. Kada završi, možete sigurno koristiti instalirani modul u svom programu.

Povezivanje i korištenje modula

Modul treće strane vrlo je jednostavan za povezivanje. Trebate napisati samo jednu kratku liniju koda:

Uvezi [naziv_modula]

Na primjer, za uvoz modula koji vam omogućuje rad s matematičkim funkcijama, trebate napisati sljedeće:

Uvezi matematiku

Kako pristupiti funkciji modula? Potrebno je napisati naziv modula, zatim staviti točku i napisati naziv funkcije/klase. Na primjer, faktorijel 10 nalazi se ovako:

Math.factorial(10)

Odnosno, okrenuli smo se funkciji faktorijel(a), koja je definirana unutar matematičkog modula. To je zgodno jer ne trebamo gubiti vrijeme i ručno stvarati funkciju koja izračunava faktorijel broja. Možete spojiti modul i odmah izvršiti potrebnu akciju.



2024 wisemotors.ru. Kako radi. Željezo. Rudarstvo. Kriptovaluta.