@littleman: Vielleicht sollte man das Programm erst einmal vereinfachen bevor man versucht es nachzuvollziehen.
`y` auf Modulebene kann weg, das wird nirgends verwendet.
Das ``global`` aus `g()` kann weg, denn `x` wird in der Funktion nichts zugewiesen.
``y += 4`` ist als unnötiger Einzelschritt formuliert, das kann man direkt in den Ausdruck bei ``return`` integrieren. Dann lässt sich `g()` auch als Einzeiler schreiben.
Und wenn man schon unsauber mit globalen Variablen hantiert, sollte man für globale und lokale Namen besser nicht auch noch gleich Namen verwenden um das alles noch verwirrender zu machen, also würde ich die lokalen Namen nicht `y` nennen. (Obwohl es ja gar kein globales `y` gibt, wie ich ganz am Anfang schon angemerkt hatte.)
Bei der Ausgabe musste ich übrigens zweimal hinschauen um zu merken dass negative Zahlen ausgegeben werden, weil das '-' in den '-'-Zeichen von den Pfeilen ('->') ”untergeht”. Ich lande dann bei so etwas:
Code: Alles auswählen
x = 8
def f(a):
global x
x = a
return x * 3
def g(a):
return f(x // 3) if x >= 5 else x - a - 4
for i in range(5):
print(g(i), end=' ')
print()
Und weil Unübersichtlich so einen Heidenspass macht, hier das Programm in BASIC für den C64, wo alles global ist:
[codebox=locobasic file=Unbenannt.txt] 10 X=8:FOR I=0 TO 4:GY=I:GOSUB 100:PRINT GR;:NEXT:PRINT:END
100 IF X>=5 THEN FY=INT(X/3):GOSUB 200:GR=FR:RETURN
110 GR=X-GY-4:RETURN
200 X=FY:FR=X*3:RETURN[/code]
Edit: Wobei man das auf dem C64 natürlich versuchen würde kürzer zu schreiben, ohne die Unterprogrammaufrufe:
Code: Alles auswählen
10 X=8:FOR I=4 TO 8:IF X<5 THEN R=X-I:GOTO 30
20 X=INT(X/3):R=X*3
30 PRINT R;:NEXT:PRINT