Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Aliohjelmien käyttö

Kanarianlintu [18.11.2017 17:48:12]

#

Hei kaikille. Olen laatinut jo aika pitkän ohjelman, enemmän ja vähemmän tuurilla:-D Joskus aikaisemmin yritin ohjelmoida basicilla ja se olikin hyvä ohjelma, tykkäsin komennoista goto ja gosub. Ymmärtääkseni tässä ohjelmassa ei sellaisia hienouksia ole ja on pärjättävä "def aliohjelma():"lla. Olen käyttänyt näitä jo tosi paljon, mutta silti tietämykseni niistä on liian vähäistä, vaikka olen yrittänyt etsiä tietoa. Suuri ongelma tuossa on se, että jos siirrän suorituksen tuonne toiseen aliohjelmaan, niin (1) se ei enää muista olemassa olevia muuttujia, ellen jokaiseen änkeä globalia ja (2) se ei osaa palata takaisin samaan kohtaan ohjelmaa. Siis ihan varmasti on loistava ohjelma, mutta en vain osaa käyttää tuota deffiä. Voisiko joku vastata tähän ihan pähkinänkuoressa:-), miten saisin sen muistuttamaan gosubia tai gotoa(basic)

Kiitos.

Metabolix [18.11.2017 17:58:35]

#

Kanarianlintu kirjoitti:

se ei enää muista olemassa olevia muuttujia, ellen jokaiseen änkeä globalia

Niin. Ohjelma (ja aliohjelmat) kannattaa suunnitella niin, että kaikkia muuttujia ei tarvitse joka kohdassa. Globaaleja ei yleensä pidä käyttää, vaan tiedot siirretään aliohjelmille (ts. funktioille) parametreina, ja muutetut tiedot palautetaan return-lauseilla.

Oletko lukenut sivuston Python-opasta? Siellä selitetään asiaa.

def funktio(parametri, toinen):
	return parametri + toinen

a = 1
b = 2
c = funktio(a, b)
print("funktio(%d, %d) = %d" % (a, b, c))

Kanarianlintu kirjoitti:

se ei osaa palata takaisin samaan kohtaan ohjelmaa.

Nyt olet erehtynyt. Se nimenomaan palaa samaan kohtaan.

Jaska [19.11.2017 15:29:53]

#

Metabolix kirjoitti:

Kanarianlintu kirjoitti:

se ei osaa palata takaisin samaan kohtaan ohjelmaa.

Nyt olet erehtynyt. Se nimenomaan palaa samaan kohtaan.

Eikös se kuitenkin palaa samalle riville mutta eri sarakkeelle:

def a(h):
  return 3

print(str(a(3)))
#            ^   kohta, jossa funktiota kutsuttiin
# Koodi tulkitaan muodossa
print(str(3))
#         ^    kohta, johon palattiin. Sama rivi, eri sarake.

Vaikka tietysti tulkki on voitu rakentaa siten, että palataan samaan kohtaan ja sitten peruutetaan tulkitsemaan saatua lauseketta. En ole tutustunut miten Pyhon-tulkki on ohjelmoitu.

Grez [19.11.2017 20:07:05]

#

Ei kai tuossa nyt varsinaisesti mistään riveistä tai sarakkeista puhuttu. Totta kai jos samalla rivillä on useampi komento, niin ne kaikki voidaan suorittaa. Tuon saman voisi kirjoittaa

temp1 = a(3)
temp2 = str(temp1)
print(temp2)

Tällöin suoritusjärjestys olisi enemmän "ylhäältä alas"

Jaska [19.11.2017 21:15:00]

#

Jaa. Minusta sama kohta tarkoittaa, että jos riviltä r ja sarakkeelta s hypätään aliohjelmaan, niin palataan myös riville r ja sarakkeelle s. Voi olla, että Kanarianlintu tarkoittaa kohdalla jotain muuta.

Grez [19.11.2017 21:32:19]

#

No jos "samaan kohtaan" palaamisen ajattelee tuolla tavalla, niin sittenhän aliohjelmaa suoritettaisiin aina vaan uudeelleen.

Tuntuisi vähän oudolta odottaa että aliohjelmat toimisivat jotenkin eri tavalla kuin kielen omatkaan funktiot ja/tai metodit, ja kyllähän niitäkin suoritettaessa ohjelma etenee eikä jää samaan riviin ja sarakkeeseen junnaamaan.

Jaska [19.11.2017 22:38:57]

#

Ahaa. Luulin, että tulkki pitää parsettaessa kirjaa jotenkin muuttujasta muotoa ei_vielä_evaluoitu. Siis että kun luetaan funktio(muuttuja) ensimmäisen kerran, niin hypätään funktioon, koska joku muuttuja muotoa ei_vielä_evaluoitu = True. Kun funktio on kutsuttu, niin ei_vielä_evaluoitu saa arvon False. Kun sitten kohdataan jälleen funktio(muuttuja), niin huomataan, että ei_vielä_evaluoitu = False ja korvataan hyppykohdassa funktio(muuttuja) paluuarvollaan.

Mutta voihan toisaalta olla, että kun tulkki kohtaa funktiokutsun, niin se korvaa kyseisen kutsun temppimuuttujalla sinä aikana kun kutsuttua funktiota suoritetaan. Kun sitten funktion arvo on selvillä, tämä arvo sijoitetaan temppimuuttujaan.

Varmaankin tulkin voi toteuttaa monella tapaa ja funktiosta voidaaan palata joko alkuperäiseen kohtaan tai johonkin lähelle.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta