"Par" pitanja o Python-u

2

"Par" pitanja o Python-u

offline
  • Cigarette Smoking Man
  • Pridružio: 14 Feb 2005
  • Poruke: 9113
  • Gde živiš: Beograd

Napisano: 24 Jan 2017 17:14

Hvala vaske. Ziveli

Dopuna: 08 Feb 2017 16:56

Moram braćo opet malo da vas smaram jer nisam našao prikladno objašnjenje na netu. Imam dva pitanja. Da se ne bi zbunjivali staviću oba u isti post, samo odvojeno po brojevima. Wink

1. pitanje

Nije mi potpuno jasna uloga naredbe return.

Ako recimo imamo funkciju:
def funk(x, y): return x+y     print(funk(5,6))
Rezultat je 11.

Ako isti primer uradimo na sledeći način:
def funk(x,y)     print(x+y) def(5,6)
Rezultat je takođe 11.

Ako recimo imamo if petlju u kojoj, recimo, tražimo makimalnu vrednost dva broja:
def max(x, y):    if x > y:       print(x, ' je vece')    elif x == y:       print (x, ' je jednako ', y)    else:       print (y, 'je vece') max(2,3)
Dobijamo rezultat: 3 je vece.

ili:
def max(x, y):    if x > y:       return "x je vece"    elif x == y:       return "x je jednako y"    else:       return "y je vece" print(max(2,3))
Dobijamo rezultat: y je vece.

Malo me zbunjuje ovo. Koja je zapravo razlika print i return naredbe kada i jedna i druga vrše neki ispis, jedino što je nakon return potrebno print sa imenom funkcije i zadatim vrednostima..
Da li je slučaj da return naredba ima mnogo veće mogućnosti samo što se čini istom sa naredbom print u ovim primerima, koji su za apsolutne početnike.

Nadam se da bar malo razumete šta sam napisao, tj. da nije baš toliko konfuzno. Smile


2. pitanje
Preneću par rečenica i kod iz knjige jer mi ni malo nije jasno šta su hteli da kažu:

Parametri samo sa ključnim rečima
Ako želimo da definišemo određene parametre koji bi bili dostupni samo preko ključnih reči, ali ne i preko njihove pozicije argumenata, oni mogu biti definisani posle parametra sa zvezdom.
def total(inicijal=5, *brojevi, ekstra_broj):     brojanje = inicijal     for broj in brojevi:     brojanje += broj     brojanje += ekstra_broj     print(brojanje) total(10, 1, 2, 3, ekstra_broj=50) total(10, 1, 2, 3) # Izbacuje gresku jer nismo naveli vrednost za argument 'ekstra_broj'
Dobijamo izlaz:
$ python3 samo_kljucne_reci.py 66 Traceback (most recent call last): File "samo_kljucne_reci.py", line 9, in <module> total(10, 1, 2, 3) TypeError: total() missing 1 required keyword-only argument: 'ekstra_broj'

Njihovo objašnjenje:
Definisanje parametra posle parametara sa zvezdicom, rezultira u argumentu samo sa ključnim
rečima. Ako ovakvim argumentima nismo dodelili podrazumevanu vrednost prilikom pozivanja
funkcije, funkcija će izbaciti grešku da joj nismo isporučili argument sa ključnim rečima, kao što se
vidi u gornjem primeru.
Obratite pažnju na korišćenje oznake += koja je prečica operatora, tako da umesto da pišemo x =
x + y , možemo pisati x += y .
Ako želite da imate argumente koji su samo sa ključnim rečima, ali nema potrebe za parametrom sa
zvezdicom, onda jednostavno koristite zvezdu bez upotrebe bilo kojeg imena, kao što je def
total(inicijal=5, *, ekstra_broj) .
---------------------

Ubijte me, ali ja pojma nemam šta su hteli da objasne i kakav je ovo primer. Šta je inicijal, koji su to brojevi sa zvezdicom, kakav ekstra broj?
Zadali su neke vrednosti za funkciju (10, 1, 2, 3) ali zašto četiri vrednosti kada u definiciji funkcije ima samo tri (inicijal=5, *brojevi, ekstra_broj)..
Znam da je zvezdica u nekoj vezi sa tim ali iz ovog tupavog primera ne mogu da povežem nikako. Il` sam glup.. Very Happy

Bez brige, nisam baš toliko glup, ostalo mi sasvim fino ide.. Very Happy
Hvala unapred. Ziveli



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14809
  • Gde živiš: Niš

Napisano: 08 Feb 2017 17:33

rapha ::Da li je slučaj da return naredba ima mnogo veće mogućnosti samo što se čini istom sa naredbom print u ovim primerima, koji su za apsolutne početnike.A šta kad želiš npr. da rezultat neke funkcije koristiš dalje u nekim drugim funkcijama? Zapravo, to koristiš i ovde, u ovim primerima:
print(max(2,3))Ovo je ništa drugo do:
x = max(2,3) print(x)Dakle, ključna reč return označava da se to što sledi iza ove reči vraća kao rezultat poziva te funkcije /sa konkretnim parametrima) u onu tačku programa iz koje je pozvana. Ona ne vrši nikakav ispis. Print služi samo i isključivo za štampanje/ispis, dok sa onim što sledi iza return (ili jasnije - sa rezultatom neke funkcije) možeš da radiš šta god hoćeš - da ga koristiš za neka dalja izračunavanja ili da ga proslediš kao parametar print funkcije i tako ispišeš rezultat poziva te funkcije.

Dopuna: 08 Feb 2017 17:52

Aj da probam da objasnim kako ja to shvatam. Da ponovim, od Python-a ne znam ni P, ali prilično sam obeđen da ovo razumem. Very Happy

Elem, inicijal je u toj funkciji najobičniji parametar. inicijal=5 verovatno predstavlja to da je podrazumevana vrednost tog parametra 5, odnosno ta vrednost se uzima kao vrednost onda kada se pri pozivu funkcije taj parametar ne navede.

Parametar sa zvezdom - *brojevi - to bi trebalo da označava da je moguće navođenje nekog proizvoljnog broja parametara. Dakle, metodu sa potpisom
def total(prvi, *ostali)bi mogao da pozivaš kao:
total(1, 2) total(1, 2, 3) total(1, 2, 3, 4) ...Kapiraš valjda suštinu. Trebalo bi proveriti i granični slučaj, tj. da li bi bilo moguće pozvati funkciju bez tog parametra sa zvezdom, npr. ovako:
total(1)O tome ili konsultuj literaturu, ili sačekaj nekoga ko zna Python. Kako god, mislim da ti je sada možda malo jasnije to.

Što se tiče ostalih parametara koji idu posle parametra sa zvezdom, suština sledeća: Ako broj parametara sa zvezdom može da bude proizvoljan, kako znati gde je granica tog niza parametra, odnosno gde počinje parametar koji ide iza parametra sa zvezdicom. Pogledajmo to na postojećem primeru:
def total(inicijal=5, *brojevi, ekstra_broj)Dakle, pod brojevi možemo da smestimo "1, 2, 3":
total(10, 1, 2, 3, ...Ali je apsolutno validno i ovako:
total(10, 1, 2, 3, 4, 5, ...Šta bi u tom nizu mogao da bude parametar ekstra_broj? Šta ako ima više parametara kao što je ekstra broj? Dakle, prepoznavanje ovakve konstrukcije bi otežalo posao kompajleru, pa je verovatno zbog toga usvojeno da se parametri iza parametra sa zvezdom moraju definisati kao dodela vrednosti konkretnom parametru.



offline
  • Cigarette Smoking Man
  • Pridružio: 14 Feb 2005
  • Poruke: 9113
  • Gde živiš: Beograd

Napisano: 11 Feb 2017 14:21

Ako ikada počnem da zaradjujem od programiranja, prvih godinu dana imaš po 30% od svakog posla. Very Happy

Za return i print mi je sve jasno..
Za drugo pitanje mi se učinilo da razumem ali si me totalno zbunio sa drugim delom.
Ako recimo imamo:
def total(1, *brojevi_od_dva_do_pet)
To bi bilo isto kao da sam napisao:
def total(1, 2, 3, 4, 5)
Samo što sa *brojevi skraćujem pisanje, što bi značilo da su *brojevi u ovom konkretnom slučaju (2, 3, 4, 5)? Ja sam to tako shvatio..

E sad, primer ispod mi nije jasan. Ako je:
def total(inicijal=5, *brojevi, ekstra_broj)
Kako dobijaš broj 10 na prvoj mestu? Ok, na "drugoj poziciji" su *brojevi i tu (ako sam dobro razumeo na primeru iznad) možemo da stavimo brojeva koliko želimo (npr. 1, 2, 3).
On je stavio da je brojanje = inicijal (5).
Pa ako imamo da je:
brojanje += broj brojanje += ekstra_broj
Zar to nije isto kao:
[code]
brojanje = brojanje + broj tj. 5 = 5 + 1
5 = 5 + 2
.
.
.
i na kraju 5 = 5 + ekstra_broj (50)
Jer u objašnjenju piše da je
Citat:
Obratite pažnju na korišćenje oznake += koja je prečica operatora, tako da umesto da pišemo x = x + y , možemo pisati x += y .


Ništa meni to nije jasno. Potpuno sam se spetljao.. Bebee Dol

Dopuna: 11 Feb 2017 14:27

Aaaaaaaaa, tupavac. Tupavac na kvadrat
Ček, ček, Vaso sunce ti.. Very Happy

Ako imamo:
[code]
def total(inicijal=5, *brojevi, ekstra_broj)
[/code]
A hoćemo recimo da saberemo te brojeve, pa pokrenemo funkciju sa:
[code]
total(2, 4, 6, ekstra_broj=8)
[/code]
Dobijamo rezultat 25? Jel?
To bi značilo da prilikom pozivanja funkcije total, vrednost inicijal ni ne moramo da unosimo već se ona podrazumeva pošto je u "postavci" funkcijee, odnosno već je definisana. Praktično, sve što navodimo u pozivanju funkcije su *brojevi i ekstra_broj..?

Al`, mamu mu, zašto mu izbacuje grešku da nije uneta vrednost za ekstra_broj kada je 50?

Nisam valjda opet tresnuo i ostao živ? Bebee Dol

Ja u nekoliko knjiga, a i po netu uopšte nisam uspeo da pronađem primere i objašnjenje za ovo. Da li je to što se slabije koristi ili nešto treće, nemam pojma..

Dopuna: 13 Feb 2017 16:40

Nisi valjda pogubio živce sa mnom? Very Happy

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14809
  • Gde živiš: Niš

Nisam. Nego čekam da ispraviš formatiranje u ovoj dopuni. Very Happy

offline
  • Pridružio: 14 Feb 2008
  • Poruke: 12392

Baci pogled na ovaj primer Rapho :

https://repl.it/FiCd/0

def total(base, initial=5, *numbers, extra_number):     total = base+initial+extra_number;     print("-------")     print("Base:", base)     print("Initial:", initial)     print ("Numbers:",  numbers)     print ("Extra number :", extra_number)     for num in numbers:       total+=num           print("Total :", total)        print("-------")   total(25, extra_number=15); total(25,10, extra_number=15); total(25,10,1,2,3, extra_number=15);

offline
  • Cigarette Smoking Man
  • Pridružio: 14 Feb 2005
  • Poruke: 9113
  • Gde živiš: Beograd

Very Happy

Sori, ispravljam čim dođem kući. Ziveli

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14809
  • Gde živiš: Niš

Napisano: 13 Feb 2017 20:34

Ma, šalio sam se malo. Very Happy Nisam ni ja stigao da leepo isčitam ovo i probam i sam da rastumačim valjano. Very Happy Ali evo stigla je pomoć, prepuštam njemu svojih 10%. Mr. Green

Dopuna: 13 Feb 2017 20:36

Nego, radi kompletnosti sam dopunio Srkijev primer ovako:
def total(base, initial=5, *numbers, extra_number=12):     total = base+initial+extra_number;     print("-------")     print("Base:", base)     print("Initial:", initial)     print ("Numbers:",  numbers)     print ("Extra number :", extra_number)     for num in numbers:       total+=num           print("Total :", total)        print("-------")   total(25); total(25, extra_number=15); total(25,10, extra_number=15); total(25,10,1,2,3, extra_number=15); https://repl.it/FiCd/1

Dopuna: 13 Feb 2017 20:42

Btw, Srki, hvala za ovaj alat. Sad ću i ja da počnem da učim Python. Mr. Green

Dopuna: 13 Feb 2017 21:17

rapha ::Ako recimo imamo:
def total(1, *brojevi_od_dva_do_pet)
To bi bilo isto kao da sam napisao:
def total(1, 2, 3, 4, 5)
Samo što sa *brojevi skraćujem pisanje, što bi značilo da su *brojevi u ovom konkretnom slučaju (2, 3, 4, 5)? Ja sam to tako shvatio..
Dobro si shvatio ovo. Parametar sa zvezdom može da bude ništa ili bilo šta. Da, doslovce bilo šta - ni jedan parametar, pet parametra ili pedeset parametra, svejedno je. Ono što je bitno pomenuti jeste to da taj parametar predstavlja neku kolekciju, što se može videti na Srkijevom primeru u ovom alatu. Dakle, u funkciji iz Srkijevog primera numbers kolekciju čine svi parametri od parametra od parametra initial, pa sve do parametra sa ključnim rečima.

rapha ::E sad, primer ispod mi nije jasan. Ako je:
def total(inicijal=5, *brojevi, ekstra_broj)
Kako dobijaš broj 10 na prvoj mestu? Ok, na "drugoj poziciji" su *brojevi i tu (ako sam dobro razumeo na primeru iznad) možemo da stavimo brojeva koliko želimo (npr. 1, 2, 3).
Tako što ga postaviš sam na 10. Very Happy Poenta sa podrazumevanom vrednošću (npr. inicijal=5) je ta da će ta promenljiva da uzme onu vrednost koja joj se prenese samo ako joj se prenese. Ako joj se ne prenese, uzeće vrednost koja je postavljena kao podrazumevana, što je u ovom slučaju 5. Da pokažem na jednostavnom primeru: def total(initial=5):     print("Initial:", initial)   total(); total(20);Evo rešenja: https://repl.it/FiCd/2 Prvi poziv štampa "Initial: 5", a drugi "Initial: 20". Valjda je sada to jasnije.

Elem, veoma je bitno i pomenuti da se izostavljanje parametra koji ima postavljenu podrazumevanu vrednost mora obavljati s desna na levo. Evo još jednog primera:
def total(initial1=5, initial2=10):     print("Initial1:", initial1)     print("Initial2:", initial2)     print("-----------");   total(20, 30); total(20); total(); https://repl.it/FiCd/3 Dakle, 'uparivanje' se izvodi s leva na desno, pa zato izostavljanje parametra mora da bude s desna na levo.

offline
  • Cigarette Smoking Man
  • Pridružio: 14 Feb 2005
  • Poruke: 9113
  • Gde živiš: Beograd

Napisano: 15 Feb 2017 17:37

Svaka čast, jasno kao dan.
Hvala puno. Ziveli

Dopuna: 27 Feb 2017 15:49

Evo me opet, nije baš dugo vemena prošlo. Embarassed

Imam mali problem u razumevnju klasa i objekata, tj. primera i kako to sve funkcioniše. Gledao sam u nekoliko različitih izvora ali su im primeri (bar za početnike) prilično konfuzni, kao da su se trudili ko će da navede primer koji će više da zbuni nekog početnika, kao što sam ja. Smile

Dakle, jasno mi je da se klase koriste da bi mogli da koristimo različite funkcije i različite promenljive. Ali neke me stvari bune u datim primerima. Recimo:
class Licnost:     def __init__(self, ime):         self.ime = ime     def kaziZdravo(self):         print('Zdravo, ja se zovem', self.ime) L = Licnost('rapha') L.kaziZdravo() # Ovaj kratki primer se takodje moze napisati kao Licnost('rapha').kaziZdravo()
Kao rezultat dobijemo:
('Zdravo, ja se zovem', 'rapha') ('Zdravo, ja se zovem', 'rapha')
Može li neko na srpskom da mi objasni ovaj primer? Smile
Ono što ja shvatam je da u prvoj funkciji zadajemo argument ime koji je deo self objekta. U trećem redu imamo lokalnu promenljivu koja se takođe naziva ime, koju izjednačavamo sa promenljivom ime iz self objekta. Iako iste, to su ustvari dve različite promenljive.

Ovo dalje mi ništa nije jasno. Smile
- Šta je tačno __init__ i zašto baš to koristimo?
- Zašto u drugoj funkciji kaziZdravo u zagradi stoji self?
- Zašto u komandi print kod druge funkcije stoji self.ime? Da li smo mogli u ovom slučaju da napišemo i samo ime, pošto smo iznad napisali da je self.ime = ime?
- Zašto smo napisali L = Licnost('rapha')? Da li to znači da ćemo za celu klasu Licnost imati varijablu ime/self.ime = rapha?
- U kakvom su odnosu prva i druga funkcija?

Ništa meni ovde nije jasno.. Nešto pokušavam da povežem ali slabo ide. Embarassed

Vaso brate pomaži. Ili onaj tvoj prijatelj kojem dođem 10%. Mr. Green

offline
  • Milan
  • Pridružio: 17 Dec 2007
  • Poruke: 14809
  • Gde živiš: Niš

Napisano: 27 Feb 2017 17:08

Ajmo ovako. Šta je klasa, a šta objekat? Smile

Klasa, samo ime kaže, predstavlja vrstu 'nečega', odnosno klasa je način da se neki entiteti iz realnog sveta enkapsuliraju u celinu koja ima neka svoja svojstva. Uzmimo na primer klasu MotornoVozilo. Ta klasa može da definiše koje sve delove sadrži jedno motorno vozilo - tip, tip motora, broj sedišta, broj točkova itd. Međutim, to je praktično samo specifikacija, slovo na papiru. Tek kada se u fabrici napravi neko motorno vozilo, tek tada ta klasa MotornoVozilo dobija smisao. Napravljeno motorno vozilo predstavlja objekat klase MotornoVozilo. I prirodno, moguće je napraviti mnogo motornih vozila, sa različitim svojstvima. Sve po potrebi.

Šta je __init__? (Ponavljam, nisam učio Python nikada, pa uglavnom nagađam, i to dobro koliko vidim. Smile) __init__ je tzv. konstruktor. To je specijalna vrsta metode i koristi se prilikom kreiranja objekta. Zbog toga što jeto specijalna metoda, zbog toga se kao argument navodi ključna reč self kako bi se razlikovala od drugih metoda. Konstruktori se koriste za kreiranje, odnosno instanciranje objekata. Dakle, ako želiš da napraviš novo MotornoVozilo - pozivaš konstruktor klase MotornoVozilo. Povratna vrednost te metode jeste sam objekat klase MotornoVozilo.

Zašto u drugoj funkciji stoji self? Zbog toga što se na taj način definiše metoda koja se izvršava nad objektom te klase. Šta to znači? To znači da možeš da imaš i metode unutar klase koje realizuju neku funkcionalnost same klase (specifikacije), a ne samog objekta (motornog vozila). Takve metode se uglavnom nazivaju statičke metode. Uzmimo na primer metodu uključiSe(). Za samu specifikaciju motornog vozila (same klase) takva metoda nema neki značaj, ali ona svoj značaj dobija onda kada se u fabrici napravi jedno motorno vozilo, jer mu se ugrađuje mogućnost uključivanja motora. Dakle, kreiraš motorno vozilo konstruktorom, pa nad tom instancom pozivaš metodu za uključivanje motora.

Dopuna: 27 Feb 2017 17:17

Citat:- Zašto u komandi print kod druge funkcije stoji self.ime? Da li smo mogli u ovom slučaju da napišemo i samo ime, pošto smo iznad napisali da je self.ime = ime?Zavisi. Obrati pažnju na to da su to dve različite metode, pa nemoj da mešaš da bi ono 'samo ime' iz prve metode bilo isto što i 'samo ime' u drugoj metodi. Svakako, u nekim jezicima bi takav zapis bio moguć, dok za Python zaista nisam siguran, i po ovom primeru bih rekao da nije. Svakako, brisni 'slef.' pa ga kresni i vidi sam, ne boli ništa. Very Happy

Šta je tu suština? Suština je da sam objekat ima svoje svojstvo 'ime', i kao parametar metode dolazi promenljiva koja se takođe zove 'ime'. Kako razlikovati te dve? Upravo upotrebom ključne reči 'self'. U kulturnim jezicima (Razz) to je ključna reč 'this', što znači 'promenljivoj ovog objekta...'.

Dopuna: 27 Feb 2017 17:18

Ostale dve nedoumice će biti jasne same od sebe kad svariš ovo što napisah. Very Happy

offline
  • Cigarette Smoking Man
  • Pridružio: 14 Feb 2005
  • Poruke: 9113
  • Gde živiš: Beograd

Jasnije, dosta jasnije.. Jbg, sve je ovo prilično konfuzno i suvoparno ali leže polako.. Verujem da će za koji da biti dim iz.. Smile Ziveli

Ko je trenutno na forumu
 

Ukupno su 599 korisnika na forumu :: 5 registrovanih, 1 sakriven i 593 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: _Rade, bato, cikadeda, JOntra, slonic_tonic