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?

14

81

    Vastaukset

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

      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
        UUSI

        Tuo on rikki kokonaan, koska puuttuu sisennykset ym.


      • Anonyymi
        UUSI

        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
      UUSI

      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
        UUSI

        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
        UUSI
        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
        UUSI
        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
        UUSI
        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
      UUSI

      Muistaakseni ei Import tarvitse jos koko koodi on samassa tiedostossa.

      • Anonyymi
        UUSI

        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
      UUSI

      Phéèniks- hidaste ilman kalsareita.

    • Anonyymi
      UUSI

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

    • Anonyymi
      UUSI

      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.

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

    Luetuimmat keskustelut

    1. Miten hyvin tunnet kaivattusi?

      Mikä hänessä kiehtoo? Asiallisia vastauksia kiitos. 🙋🏻‍♂️
      Ikävä
      147
      6999
    2. Mies, mua jotenkin kiinnostaa

      Että osaatko sä ollenkaan höllätä? Ootko aina kuin persiille ammuttu karhu. Pohtimassa muiden vikoja?
      Ikävä
      150
      5906
    3. Ootko nainen jotenkin

      Epävarma ulkonäöstäsi
      Ikävä
      125
      5086
    4. Moi kuumis.

      Just ajattelin sua. Oot mun rauha, turva ja lämpö. Olet monia muitakin asioita, mut noita tartten eniten. Pus.
      Ikävä
      44
      4627
    5. Milloin olisi sinun ja kaivattusi

      Kaunein päivä? Kamalin hetki? Miksi? Kumpaa pyrit muistelemaan? Kumpi hallitsee mieltäsi?
      Ikävä
      55
      4028
    6. Oletko joutunut kestämään

      Mitä olet eniten joutunut kestämään?
      Ikävä
      67
      3198
    7. Itkin oikeasti aamulla taas

      Haluaisin niin kertoa miltä musta tuntuu. Oon jotenkin hajalla. Tarvitsin ees jonkun joka ymmärtää.
      Ikävä
      55
      3120
    8. Minun rakkaani.

      Haluaisin käden mitan päähän sinusta. Silleen, että yltäisin koskettamaan, jos siltä tuntuu. Olen tosi huono puhumaan, m
      Ikävä
      25
      2822
    9. Where are you

      Now 🫂☕️🩷
      Ikävä
      42
      2384
    10. Naiselle hyvää viikkoa

      olet edelleen sydämessäni. Toivon sinulle myötätuulta mitä ikinä teetkään🪢
      Ikävä
      16
      2313
    Aihe