This is an old revision of the document!
Način kako se ovo može postići je korištenjem Pythonovog “walrus” operatora, koji je zapravo expression, vraća rezultat evaluacije expressiona, ali također evaluirani expression, nakon evaluacije postavlja kao vrijednost dane varijable.
Walrus operator se označava znakovima `:=`.
Na slici 11 može se vidjeti kako funkcionira walrus operator: evaluira expression “1 == 1”, što je `True`, i to prosljeđuje kao rezultat if statementu, ali također tu istu vrijednost postavlja kao vrijednost varijable a.
Walrus operatorom se može napisati validan expression, koji će nakon evaluacije također promijeniti vrijednost odabrane varijable, odnosno varijable s.
No walrus operator se ne može sam izvršavati niti unutar eval niti unutar exec funkcije, zato što je namijenjen da bude izvršen unutar expressiona.
No ako se stave zagrade oko njega, izraz:
(a:=3)
postaje validan expression, što je prikazano na slici ispod.
Ovo je zapravo slučaj u kodu zadatka, zato što se oko unosa dodaju zagrade, što je prikazano na slici ispod.
Kada su zagrade oko unosa, unutar zagrada mora biti validan expression, što `s=0` nije nego je statement, kao što se vidi na slici ispod.
Zato rješenje:
Odaberite element borca (Ice, Fire, Acid): s=0 Odaberite borca (Zorn, Krev, Milo)milo
nije moguće.
Ali walrus operator je validan expression i namijenjen je za izvršavanje unutar expressiona, što se postiže stavljanjem zagrada. Ovako se walrus operator može izvršiti i unutar eval i unutar exec funkcije, gdje u oba slučaja uspješno mijenja vrijednost varijable (ali samo ako se exec i eval pokreću unutar globalnog konteksta).
I zato se također može izvršavati na ovaj način:
Što je, uz dodavanje zagrada, zapravo ekvivalentno ovom kodu:
Odnosno ovome, nakon zamjene stringova da se sve vidi u jednoj liniji:
I ovo je format inicijalizacije player varijable u zadatku, pa time i rješenja ovog zadatka; ove zagrade su iste kao i u liniji koda inicijalizacije player varijable eval funkcijom na slici 4.
Nakon toga se mogu raditi daljnje redukcije, zamjenom eval funkcije i njenih argumenata s ekvivalentnim kodom, pa primjenom istog postupka za exec funkciju s proslijeđenim argumentima. Nakon redukcija ta linija koda postaje ekvivalentna samo walrus operatoru unutar zagrada.
Sada je poznato rješenje i razlog zašto rješava zadatak.
Rješenje se može unijeti ovako:
Odaberite element borca (Ice, Fire, Acid): s:=0 Odaberite borca (Zorn, Krev, Milo)exec
Izvršava se prethodno opisan postupak izvršavanja ovog koda, koji rezultira u postavljanju varijable s u 0, a varijable player u None, te se player onda inicijalizira u default, odnosno Milo(“ice”).
Eval / Exec i global scope
Pošto je ovo izvršeno u global scopeu, exec može promijeniti vrijednost scale varijable s, dok da se izvršavao unutar funkcije, ne bi mogao promijeniti niti local scope varijablu u istom scopeu kao i funkcija.
Dok je pri izvršavanju u global scopeu, ovo moguće.
Ovo vrijedi i za eval i za exec.