User Tools

Site Tools


elemental_fighters

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 `:=`.

 Slika 11. - walrus operator

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.

 Slika 12 - walrus operator

No ako se stave zagrade oko njega, izraz:

(a:=3)

postaje validan expression, što je prikazano na slici ispod.

 Slika 13 - walrus operator unutar zagrada

Ovo je zapravo slučaj u kodu zadatka, zato što se oko unosa dodaju zagrade, što je prikazano na slici ispod.

 Slika 14 - zagrade oko korisničkog unosa

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.

 Slika 15 - nevaljajuca sintaksa

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).

 Slika 16 - walrus i eval / exec

I zato se također može izvršavati na ovaj način:

 Slika 17 - walrus unutar exec unutar eval

Što je, uz dodavanje zagrada, zapravo ekvivalentno ovom kodu:

 Slika 18 - kod ekvivalentan kodu zadatka

Odnosno ovome, nakon zamjene stringova da se sve vidi u jednoj liniji:

 Slika 19 - pojednostavljeni ekvivalentan kod

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.

 Slika 20 - pojednostavljeno izvršavanje payloada

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”).

 Slika 21. - rješenje zadatka

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.

 Slika 22. - eval unutar functiona

Dok je pri izvršavanju u global scopeu, ovo moguće.

 Slika 23. - eval unutar global scopea

Ovo vrijedi i za eval i za exec.

elemental_fighters.1761923342.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki