Python ja aliohjelmat

Anonyymi-ap

Tein kaksi aliohjelmaa omiin tiedostoihinsa ja yhden pääohjelmatiedoston.

Pääohjelman alussa sisällytetään nuo aliohjelmat import-käskyillä. Sitten tulee input-käsky ja iffittelyt joilla annetaan ja valitaan kumpaa aliohjelmaa aletaan ajamaan. Tämä siis while True -loopissa.

Mutta kun ohjelma alkaa ajamaan saman tien ensimmäistä aliohjelmaa ja perään toisen. Näyttäisi että se ei edes käy pääohjelmassa koska minulla on sen alussa tarkistus-printtausrivi.

Kun ohjelma on ajanut molemmat aliohjelmat läpi kerran niin sitten vasta se siirtyy pääohjelman alkuun ja kysyy ensimmäisen kerran kumpaa aliohjelmaa halutaan ajaa.

Mikä neuvoksi?

23

459

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi
    • Anonyymi

      Tässäpä pääohjelma

      # MAIN PROGRAM

      import prog_force
      import prog_one_oloinacci_number

      def main():
      while True:
      print(" ")
      print("Start...")
      print(" ")
      loop = input("Calculate Force: enter ´f´. Calculate Oloinacci number: enter ´o´: ")
      if loop == "f":
      prog_force.main()
      elif loop == "o":
      prog_one_oloinacci_number.main()
      else:
      break
      main()

      print(" ")
      print("Main program end. Good bye! :)")

      • Anonyymi

        Tuo on rikki kokonaan, koska puuttuu sisennykset ym.


      • Anonyymi

        Jess! Tämmönen toimii. En vain oikein ymmärrä miksi.

        # MAIN PROGRAM

        def main():
        while True:
        print(" ")
        print("Start main program")
        print(".")
        print(".")
        print(".")
        print(" ")
        loop = input("Calculate Force: enter ´f´. Calculate Oloinacci number: enter ´o´: ")
        if loop == "f":
        import prog_force

        elif loop == "o":
        import prog_one_oloinacci_number

        else:
        break
        main()

        print(" ")
        print(".")
        print(".")
        print(".")
        print("Main program ended. Good bye! :)")


    • Anonyymi

      Toimiiko tämä?

      # MAIN PROGRAM

      import prog_force
      import prog_one_oloinacci_number

      def main():
          while True:
              print("\nStart...")
              loop = input("Calculate Force: enter 'f'. Calculate Oloinacci number: enter 'o'. Quit: any other key: ").lower()

              if loop == "f":
                  prog_force.main()
              elif loop == "o":
                  prog_one_oloinacci_number.main()
              else:
                  break

          print("\nMain program end. Good bye! :)")

      # Käynnistetään ohjelma
      if __name__ == "__main__":
          main()

      • Anonyymi

        Jostain syystä ei. Tai siis toimii mutta niin että hyppää ensin suoraan force-aliohjelmaan. Eli samoin kuin alkuperäinen ohjelmani. Näyttää että ajaa heti jo sisällytysvaiheessa nuo aliohjelmat. Tuo pätkä yllä jossa laitoin sisällytykset iffittelyjen alle ja poistin varsinaiset kutsut näyttäisi toimivan. Aika outoa...


      • Anonyymi
        Anonyymi kirjoitti:

        Jostain syystä ei. Tai siis toimii mutta niin että hyppää ensin suoraan force-aliohjelmaan. Eli samoin kuin alkuperäinen ohjelmani. Näyttää että ajaa heti jo sisällytysvaiheessa nuo aliohjelmat. Tuo pätkä yllä jossa laitoin sisällytykset iffittelyjen alle ja poistin varsinaiset kutsut näyttäisi toimivan. Aika outoa...

        Moduulissasi (esim. prog_force.py) todennäköisesti on koodi, joka suoritetaan heti tuonnin yhteydessä.

        Esimerkiksi näin:
        ---
        # prog_force.py

        def main():
            print("Lasketaan voima...")

        main() # <- Tämä suoritetaan HETI, kun moduuli tuodaan!
        ---
        Tuo tarkoittaa, että main() ajetaan automaattisesti heti, kun teet import prog_force.

        Korjaus: käytä
        if __name__ == "__main__"
        -rakennetta moduuleissa

        Muuta prog_force.py ja prog_one_oloinacci_number.py seuraavasti:
        ---
        # prog_force.py

        def main():
            print("Lasketaan voima...")

        if __name__ == "__main__":
            main()
        ---

        Mitä if __name__ == "__main__" tekee?
        – Kun suoritat tiedoston suoraan, __name__ on "__main__" , main() ajetaan.
        – Kun tiedosto tuodaan moduulina, __name__ ei ole "__main__", mitään ei ajeta automaattisesti.

        Näin import ei enää laukaise main()-funktiota itsestään.


      • Anonyymi
        Anonyymi kirjoitti:

        Moduulissasi (esim. prog_force.py) todennäköisesti on koodi, joka suoritetaan heti tuonnin yhteydessä.

        Esimerkiksi näin:
        ---
        # prog_force.py

        def main():
            print("Lasketaan voima...")

        main() # <- Tämä suoritetaan HETI, kun moduuli tuodaan!
        ---
        Tuo tarkoittaa, että main() ajetaan automaattisesti heti, kun teet import prog_force.

        Korjaus: käytä
        if __name__ == "__main__"
        -rakennetta moduuleissa

        Muuta prog_force.py ja prog_one_oloinacci_number.py seuraavasti:
        ---
        # prog_force.py

        def main():
            print("Lasketaan voima...")

        if __name__ == "__main__":
            main()
        ---

        Mitä if __name__ == "__main__" tekee?
        – Kun suoritat tiedoston suoraan, __name__ on "__main__" , main() ajetaan.
        – Kun tiedosto tuodaan moduulina, __name__ ei ole "__main__", mitään ei ajeta automaattisesti.

        Näin import ei enää laukaise main()-funktiota itsestään.

        Ok. Onko tuo "huonoa suunnittelua" jos importtaa tiedoston vasta siellä kohtaa pääohjelmassa missä se tulee ajaa?


      • Anonyymi
        Anonyymi kirjoitti:

        Ok. Onko tuo "huonoa suunnittelua" jos importtaa tiedoston vasta siellä kohtaa pääohjelmassa missä se tulee ajaa?

        Yleensä tapana on tuoda "moduulit" heti alussa. Tietysti jos niitä ei suoriteta kuin kerran, niin silloin ei ole niinkään merkitystä.


    • Anonyymi

      Muistaakseni ei Import tarvitse jos koko koodi on samassa tiedostossa.

      • Anonyymi

        Jep, ei. Mutta tuossa molemmat aliohjelmat on omissa tiedostoissaan. Tarkennetaan nyt että alotin koodin opiskelemisen perjantaina eli viisi päivää sitten. Ei oikein vielä taitu mutta tässä sitä värkätessä oppii. Ja kiva ku ihmiset jelppii aina kun tulee seinä vastaan :)

        Oon aiemmin ohjelmoinut harrastuksena Basicilla ja html:llä. Tekussa oli C++ käytössä (sitä inhoan). Insinöörityön tein Lispillä ja Nokian tukiasemien DSP:tä värkkäilin prosessorin omalla assemblyllä. Se oli mukavaa hommaa :)


    • Anonyymi

      Phéèniks- hidaste ilman kalsareita.

    • Anonyymi

      Googlettamalla Python Vanhala2020 löytyy mielestäni melko kattava, selkeä ja yksityiskohtainen ohjelmointiopas

    • Anonyymi

      En ole päälooppia(main) määritellyt tuon DEF avulla vaan esimerkiksi näin:
      # ------MAIN--------------------------------------------------
      while running:
      iPvm.tee()
      eHiirenkoord.tee()
      iDark.tee()

      Tekoäly:
      "Python. Tarvitseeko main-looppi määritellä DEF-avulla?"
      Ei ole pakko määritellä main-looppia def-avainsanalla, mutta se on erittäin yleinen ja suositeltava tapa.

      Pythonissa def luo funktion – ja usein ohjelmissa, kuten graafisissa käyttöliittymissä tai peleissä, kirjoitetaan main_loop()-funktio, joka sisältää pääsilmukan. Esimerkiksi:

      python
      def main_loop():
      running = True
      while running:
      # Käsitellään tapahtumia, piirretään ruutu jne.
      pass

      main_loop()
      Mutta yhtä hyvin voit kirjoittaa pääsilmukan ilman funktiota suoraan tiedoston pääosaan:

      python
      running = True
      while running:
      # Tapahtumat ja logiikka
      pass
      Silti funktion käyttö tuo monia hyötyjä: parempaa rakenteellisuutta, uudelleenkäytettävyyttä ja helpottaa testaamista. Riippuu siis ohjelman luonteesta.

    • Anonyymi

      Onnistui!

      Nyt on pääohjelmatiedosto jonka alussa esitellään:

      import prac_force
      import prac_oloinacci

      Ja jossa on while-silmukka joka oottelee kumpi valitaan.:

      while True:

      print("Start main program")

      loop = input("Calculate Force: enter ´f´. Calculate Oloinacci number: enter ´o´: ")
      if loop == "f":
      prac_force.force()
      print(loop)
      elif loop == "o":
      prac_oloinacci.oloinacci()
      print(loop,loop)
      else:
      break


      Noiden force ja oloinacci -tiedostojen alussa esitellään niiden aliohjelmat, esim force:

      import prac_start
      import prac_fo_inquiry
      import prac_fo_calculation
      import prac_fo_answer_length
      import prac_fo_print
      import prac_end

      Samoin niissä while-silmukassa pollataan parametrit, esim force:

      def force():

      hello = "Welcome to Force Calculation! :)"
      prac_start.start_module(hello)
      while True:

      quantity = "mass"
      unit = "[kg]"
      answer_mass = prac_fo_inquiry.inquiry_module(quantity,unit)

      quantity = "acceleration"
      unit = "[m/s^2]"
      answer_acceleration = prac_fo_inquiry.inquiry_module(quantity,unit)

      force = prac_fo_calculation.calculation_module(answer_mass, answer_acceleration)

      answer_length = prac_fo_answer_length.answer_length_module(answer_mass,answer_acceleration,force)

      prac_fo_print.print_module(answer_mass,answer_acceleration,force,answer_length)

      contin = input("Do you want repeat calculation? \nIf yes, press enter. Otherwise give n: ")
      if contin == "n":
      break

      bye = "Thank you for using Force Calculation Program. Good bye! :)"
      prac_end.end_module(bye)


      Mulla oli varmaan vain joku käpy juuri sen main-rakenteen kanssa kanssa. Nyt kun nimesi nuo 1. tason aliohjelmat forceksi ja oloinacciksi tuntuu homma toimivan.

      • Anonyymi

        Sinun koodisi näyttää jotenkin turhan monimutkaiselta ja epäselkeältä. Tietysti se on normaalia kun aloittaa koodaamisen. Enkä vieläkään tajua että miksi noita Importteja on keskellä koodia, enkä sitä että miksi koko koodi ei voi olla samassa fileessä.


      • Anonyymi
        Anonyymi kirjoitti:

        Sinun koodisi näyttää jotenkin turhan monimutkaiselta ja epäselkeältä. Tietysti se on normaalia kun aloittaa koodaamisen. Enkä vieläkään tajua että miksi noita Importteja on keskellä koodia, enkä sitä että miksi koko koodi ei voi olla samassa fileessä.

        Importithan on nyt ihan koodin alussa. Välillä ne oli koodin seassa koska sekoilin main -mokkulan kanssa enkä saanut silloin niitä toimimaan koodin alussa.

        Koodi ei voi olla samassa filessä ainoastaan siksi koska opettelen nyt tekemään aliohjelmia ja tiedostonkäsittelyä. Lisäsin nyt muuten tiedostoon kirjoittamisen...

        Helpointahan on tehdä nuo yhtenä filenä ja niin teinkin ihan ensin. Nyt vain muutin koodia niin että alussa voi valita laskeeko forcen vai oloinaccin. Ja jota ainoan toiminnallisen mokkulan omaan tiedostoonsa. Eihän noita opi jos ei kokeile...

        Kiitoksia vielä kaikille :)


      • Anonyymi
        Anonyymi kirjoitti:

        Importithan on nyt ihan koodin alussa. Välillä ne oli koodin seassa koska sekoilin main -mokkulan kanssa enkä saanut silloin niitä toimimaan koodin alussa.

        Koodi ei voi olla samassa filessä ainoastaan siksi koska opettelen nyt tekemään aliohjelmia ja tiedostonkäsittelyä. Lisäsin nyt muuten tiedostoon kirjoittamisen...

        Helpointahan on tehdä nuo yhtenä filenä ja niin teinkin ihan ensin. Nyt vain muutin koodia niin että alussa voi valita laskeeko forcen vai oloinaccin. Ja jota ainoan toiminnallisen mokkulan omaan tiedostoonsa. Eihän noita opi jos ei kokeile...

        Kiitoksia vielä kaikille :)

        Juu ok. Minä en ole mikään ammattilainen, katson koodia siltä pohjalta mitä olen oppinut.
        Sen olen oppinut että kommentointia kannattaa käyttää. Aikaa kun kuluu niin ei välttämättä muista kaikkea. Ja hyvä IDE pitää olla.


    • Anonyymi

      Sellainen kysymys vielä että kuinka pieniksi palasiksi ohjelma kannattaa pilkkoa? Itselläni on nyt omat aliohjelma-tiedostot forcelle ja oloinaccille, Ja niiden aliohjelmille kaikille omansa. Esim print- ja calculation- mokkuloille. Nyt voin käyttää sekä start- että end-mokkuloita molemmille, forcelle ja oloinaccille. Vien vain kutsussa oikean parametrin tulostettavaksi.

      • Anonyymi

        Älä laita mitään eri tiedostoihin kun ohjelma on pieni niin se voi olla kokonaan samassa tiedostossa. Toki jos se paisuu niin eri asia ehkä.


      • Anonyymi

        Koodia ei pidä metrinmitalla tehdä, vaan miettiä toiminnallisuuksien kautta kuinka jakaa moduuleihin.


      • Anonyymi
        Anonyymi kirjoitti:

        Älä laita mitään eri tiedostoihin kun ohjelma on pieni niin se voi olla kokonaan samassa tiedostossa. Toki jos se paisuu niin eri asia ehkä.

        Ok.


    • Anonyymi

      Poistin Windowsin.

    Ketjusta on poistettu 4 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. En minä kyllä enää odota sinua

      Olet siellä sen harmaan kanssa. Niin, annoit minun nähdä lämpimät tunteesi siitä huolimatta. Se merkitsi kyllä paljon. O
      Ikävä
      38
      1930
    2. Taas pedofiliatuomio Haapaveelle

      Vastenmielisiä ja vakavia rikostapauksia pikkupaikkakunnan alueellekin näyttää riittävän. Tämän alan rikoksien tuomiot
      Haapavesi
      38
      1491
    3. Jos joku luulee että kaikki käy

      Sanon vain tämän. Minun kanssani ei neuvotella. Minun kanssani eletään tasavertaisesti. Jos se on liikaa, niin ovi rinn
      Ikävä
      60
      1485
    4. Joka kolmas työtön on työkyvytön

      Viime vuonna työnhakuvelvoitteen ulkopuolella oli noin kolmannes työttömistä työnhakijoista. Huhheijaa, mihin suomalais
      Maailman menoa
      169
      1373
    5. Sakin hivutus - ilmiö

      Miten tuollainen tuollainen ilmiö kuin ”sakin hivutus” syntyy? Mitä syitä ilmiön syntymiseen tarvitaan? Onko sakissa jok
      80 plus
      68
      1229
    6. Ei ole rohkeutta tulla jututtamaan

      Voidaan me nähdä ja tervehtiä, sitäkin harvoin, mutta iso kynnys on edes mennä lähelle ja kysyä kuulumisia. Ymmärrät var
      Tunteet
      8
      1211
    7. Julkinen saunatilanne Haapavedellä, tämä on täyttä paskaa!

      Eilen Haapaveden uimahallin saunassa koettu tilanne oli täysin käsittämätöntä ja helvetin järkyttävää. Ladyboy harjoitti
      Haapavesi
      19
      886
    8. Me ei voida olla yhdessä

      Järki päähän ja realiteetit huomioon ottaen.
      Ikävä
      58
      848
    9. Mitä tapahtuu?

      Mitä säpäkän risteyksessä on tapahtunut kun poliiseja, ambulansseja ja kopteri paikalla?
      Outokumpu
      13
      834
    10. Kuhmon K-kaupan vanhenevat hapannaamat kassoilla

      Pitemmän aikaa olen ihmetellyt kaverin kanssa miksi Kuhmon K-kaupassa on aina tympeimmät kassattöntekijät? Kesällä tulee
      Kuhmo
      14
      795
    Aihe