[Python] Terug gaan naar het begin van een script

Pagina: 1
Acties:
  • 1.670 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • MaiorDomus
  • Registratie: Maart 2003
  • Laatst online: 03-06 18:06
Ik heb in python een leuk simulatie programma geschreven..
nou heb ik die gecompiled maar als ik de exe vraag dan voer ik de inputs in draait het programma even en geeft die de resulaten razendsnel weer maar dan! sluit het programma zich razendsnel af dan heb je te weinig tijd om de resultaten te lezen... (dit heb ik trouwens wel lichtelijk opgelost met time.sleep(hoeveelheid seconden) maar dat vind ik ook niet een geweldige oplossing ik heb liever dat het er gewoon constant op blijft staan..

ik zoek een commando waarmee het beeld dus blijft staan en het liefst dan met iets als een restart commando

dus iets als

input("wil je het programma opnieuw starten (j/n)?: ")
en als je dan j geeft dat die dan opnieuw start en anders gewoon afsluit.. :)

maar ik vind dus nergens op internet een soort van go home of zo'n dergelijke functie.. echt heel onhandig

ik kan ook niet het hele programma gaan definen (met def) want volgens mij gaat dat niet met de waardes en inputs die ik er in heb gezet.. :X


ik vraag me dus af of iemand dit probleem eerder is tegen gekomen en een oplossing weet? :)

Sorry onderwerptitel vergeten! *schaamt zich* :| wat ben ik toch weer een koe }:O

[ Voor 7% gewijzigd door MaiorDomus op 14-01-2006 16:32 ]


Acties:
  • 0 Henk 'm!

  • terabyte
  • Registratie: September 2001
  • Laatst online: 01-02 19:45

terabyte

kan denken als een computer

gewoon alles in een oneindige loop stoppen. Als het programma niet opnieuw opgestart moet worden, dan break je er gewoon uit.

Acties:
  • 0 Henk 'm!

  • MaiorDomus
  • Registratie: Maart 2003
  • Laatst online: 03-06 18:06
laat maar helemaal verholpen :) hardstikke bedankt.. blijkbaar was het allemaal heel simpel :)

[ Voor 138% gewijzigd door MaiorDomus op 14-01-2006 17:03 ]


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 07-06 13:37
GoTAProblem schreef op zaterdag 14 januari 2006 @ 16:49:
laat maar helemaal verholpen :) hardstikke bedankt.. blijkbaar was het allemaal heel simpel :)
Dan ben ik toch wel benieuwd hoe je het wel hebt opgelost.

Acties:
  • 0 Henk 'm!

  • terabyte
  • Registratie: September 2001
  • Laatst online: 01-02 19:45

terabyte

kan denken als een computer

basic:

Python:
1
2
3
4
5
6
7
8
def voer_programma_uit():
    print "het programma wordt nu uitgevoerd"

while True:
    voer_programma_uit()
    retval = raw_input('Programma nog een keer uitvoeren? (j/n): ')
    if retval == 'n':
        break


advanced:

Python:
1
2
3
4
5
6
7
8
9
10
def voer_programma_uit():
    print "het programma wordt nu uitgevoerd"

while True:
    voer_programma_uit()
    retval = None
    while retval not in ["j", "n"]:
        retval = raw_input('Programma nog een keer uitvoeren? (j/n): ')
    if retval == 'n':
        break

Acties:
  • 0 Henk 'm!

  • Mithrandir
  • Registratie: Januari 2001
  • Laatst online: 22:33
is een infinite loop wel zo mooi hier? Kun je niet beter als de persoon 'ja' typt het programma opnieuw laten draaien via een shell commando?

Het werkt het zelfde, maar is netter volgens mij.

Verbouwing


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07-06 15:50
Je kunt de applicatie ook gewoon in een command shell starten (ik kan zo wel raden dat je een Windows-gebruiker bent: WIN-R, cmd, enter).

Trouwens, ik wist niet dat bij de laatste spellingshervorming de hoofdletters afgeschaft waren?

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Mithrandir schreef op zaterdag 14 januari 2006 @ 17:57:
is een infinite loop wel zo mooi hier? Kun je niet beter als de persoon 'ja' typt het programma opnieuw laten draaien via een shell commando?

Het werkt het zelfde, maar is netter volgens mij.
Netter? In plaats van flow control die de programmeertaal je biedt, een extern programma (een shell) aanroepen waar je minder controle op hebt :?

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

Anoniem: 13428

kenneth schreef op zaterdag 14 januari 2006 @ 18:44:
[...]


Netter? In plaats van flow control die de programmeertaal je biedt, een extern programma (een shell) aanroepen waar je minder controle op hebt :?
Als het hem er louter om gaat om de resultaten te zien, is het toch stom om zo'n constructie te maken die een loop misbruikt? Als hij toch altijd op nee drukt... Dan kan hij beter vanuit de shell het programma starten (zoals het bedoeld is). Dan kun je het programma als je wilt tenminste ook één keer draaien. Als het dan meerdere keren moet, of 30 keer, of 15 keer, dan maak je dat in de shell. Dat is de juiste taakverdeling en abstractie; wielen opnieuw uitvinden is natuurlijk nergens voor nodig.

Acties:
  • 0 Henk 'm!

  • terabyte
  • Registratie: September 2001
  • Laatst online: 01-02 19:45

terabyte

kan denken als een computer

Als een simulatieprogramma gebruik maakt van een random seed die wordt geset adhv de tijd (in seconden), en je moet een simulatie meerdere keren draaien, en de simulatie is binnen een seconde afgelopen, dan heeft vanuit de shell opnieuw starten niet zoveel zin.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07-06 15:50
Daarom is het ook niet handig om de seed (alleen) op basis van de tijd te kiezen. Vaak wordt gekozen voor een combinatie van tijd en process id, maar aangezien Windows process id's al snel recycled (wat andere besturingssystemen zo lang mogelijk uitstellen) werkt dat ook niet zo goed. Verreweg de beste methode is om de seed uit een globale random number generator te halen, maar ook dat is onder Windows lastig.

Los hiervan is het vaak handig om de seed handmatig te kunnen kiezen (op de command line bijvoorbeeld), zodat simulaties deterministisch en dus verifieerbaar zijn. Als je dan honderd testcases uitvoert, gebruik je bijvoorbeeld simpelweg seed 1 tot en met 100.

Acties:
  • 0 Henk 'm!

  • terabyte
  • Registratie: September 2001
  • Laatst online: 01-02 19:45

terabyte

kan denken als een computer

Soultaker schreef op zaterdag 14 januari 2006 @ 22:29:
Los hiervan is het vaak handig om de seed handmatig te kunnen kiezen (op de command line bijvoorbeeld), zodat simulaties deterministisch en dus verifieerbaar zijn. Als je dan honderd testcases uitvoert, gebruik je bijvoorbeeld simpelweg seed 1 tot en met 100.
Je hebt volkomen gelijk, daarom zul je mij de oneindige loop zoals hierboven gepost nooit zien gebruiken.

Maar voor de TS lijkt het goed genoeg, ik bedoel, als het script niet in een eigen functie geplaatst kan worden, dan valt de extra viezigheid van de infinite loop ook wel mee vergeleken met de rest van de code.

Acties:
  • 0 Henk 'm!

  • MaiorDomus
  • Registratie: Maart 2003
  • Laatst online: 03-06 18:06
Sybr_E-N schreef op zaterdag 14 januari 2006 @ 17:33:
[...]

Dan ben ik toch wel benieuwd hoe je het wel hebt opgelost.
Ik heb het nou dus met de infinite loop manier opgelost.. functioneerd perfect en is voor mij goed genoeg :) En ja ik ben een Windows gebruiker maar volgens mij doet dat hier niet terzake (ik heb speciaal nou zelfs op mijn hoofdlettergebruik gelet ;) ) :? :P

er was slechts 1 probleem bij deze oplossing wanneer je letters wilt gebruiken moet je die eerst een waarde geven dus ik heb nou bijvoorbeeld als vraag:

Wil je stoppen? (j/n):

dan moet je eerst j een waarde hebben gegeven en n ook (overigens niet dezelfde waarde)
maar dan functioneerd het allemaal perfect :)


in code:

code:
1
2
3
4
5
6
7
8
9
while 1 == 1 # oneindige loop
** programma**

    j = 0 # J waarde geven, anders krijg je error bij input van hieronder
    n = 1 # N waarde geven, anders krijg je error bij input van hieronder
    stoppen = input("wil je stoppen? (j/n):") #Vragen of je het programma wilt stoppen of opnieuw wilt doen
    print "\n"          #Lege regel voor lay-out
    if stoppen == j:    #Als stoppen J(a) is, dan
        break           #Stoppen met het programma

Acties:
  • 0 Henk 'm!

  • terabyte
  • Registratie: September 2001
  • Laatst online: 01-02 19:45

terabyte

kan denken als een computer

GoTAProblem schreef op zondag 15 januari 2006 @ 17:48:

code:
1
2
3
4
5
6
7
8
9
while 1 == 1 # oneindige loop
** programma**

    j = 0 # J waarde geven, anders krijg je error bij input van hieronder
    n = 1 # N waarde geven, anders krijg je error bij input van hieronder
    stoppen = input("wil je stoppen? (j/n):") #Vragen of je het programma wilt stoppen of opnieuw wilt doen
    print "\n"          #Lege regel voor lay-out
    if stoppen == j:    #Als stoppen J(a) is, dan
        break           #Stoppen met het programma
• 1 == 1: gewoon vervangen door True, want 1 == 1 is een tautologie en het is niet zo'n nette statement...
• n = 1: deze statement is overbodig
• En wat je iemand (wellicht per ongeluk) niet j of n intikt maar iets anders?
• het gebruik van input is niet echt veilig. Wat als iemand daar een Python statement intikt (zeg, os.system('del *.*') of ('rm -rf /'). Gebruik dus gewoon standaard raw_input.

Conclusie: gewoon de 'basic' versie gebruiken die ik eerder heb gepost.

Acties:
  • 0 Henk 'm!

  • MaiorDomus
  • Registratie: Maart 2003
  • Laatst online: 03-06 18:06
• 1 == 1: gewoon vervangen door True, want 1 == 1 is een tautologie en het is niet zo'n nette statement... Hmm daar zit wel wat in :) bedankt!

• n = 1: deze statement is overbodig Helaas niet waar.. zonder deze statement krijg ik:
Traceback (most recent call last):
File "C:\programma.py", line 48, in ?
stoppen = input("wil je stoppen? (j/n):") #Vragen of je het programma wilt stoppen of opnieuw wilt doen
File "<string>", line 0, in ?
NameError: name 'n' is not defined


• En wat je iemand (wellicht per ongeluk) niet j of n intikt maar iets anders?
Dan loopt het programma vast en stopt die dus :+

• het gebruik van input is niet echt veilig. Wat als iemand daar een Python statement intikt (zeg, os.system('del *.*') of ('rm -rf /'). Gebruik dus gewoon standaard raw_input.
Kk wist helemaal niet dat die vorm van input zo te misbruiken was, dat is inderdaad wel handig om te weten. Ik zal het aanpassen maar het is voor mijn wiskunde leraar en die zal het wel niet misbruiken ;)

[ Voor 11% gewijzigd door MaiorDomus op 15-01-2006 19:53 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07-06 15:50
Mja, er staat in de documentatie ook gewoon: equivalent to eval(raw_input(prompt)) (type eens help(functie) in je interpreter). Hier eval() gebruiken is gewoon fout; dat is niet eens meer een kwestie van stijl. Als een programma met onverwachte invoer geconfronteerd wordt dan mag het afsluiten, maar zomaar random acties uitvoeren (zoals hier bijvoorbeeld de harde schijf formatteren, als een grapjas daar een commando voor invoert) is echt uit den boze.

Gebruik dus gewoon raw_input() en vergelijk het resultaat met 'y' en 'n', dan heb je ook je rare hacks met het definiëren van variabelen niet meer nodig (en crasht je programma niet als de gebruiker 'Y' of 'yes' invoert).

Ik snap trouwens niet waarom alle scripttalen het nodig vinden om eval() (en dus afgeleiden zoals deze input()) in de standaardmodulete stoppen. Het is absoluut geen functie die beginners moeten gebruiken; als je 'm toch wil aanbieden (wat handig kan zijn in sommige situaties) dan kan 'ie maar beter verstopt zitten in een obscure module die duidelijk maakt dat het geen speelgoed voor beginners is (die niet eens weten wat ze doen omdat ze te lam zijn om nog de twee (2) regels documentatie bij de functies die ze gebruiken te lezen).

[ Voor 46% gewijzigd door Soultaker op 15-01-2006 20:40 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Waarom niet gewoon onderaan je prog:

code:
1
input("Druk een Toets")


(of een andere functie die een character als input vraagt op de console, ben niet zo bekend met Python.)

[ Voor 44% gewijzigd door Grijze Vos op 15-01-2006 22:00 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • MaiorDomus
  • Registratie: Maart 2003
  • Laatst online: 03-06 18:06
Sorry hoor ik zag nergens in een omschrijving staan dat input zo gevaarlijk was..
Zal wel de enorm grote warnings niet gelezen hebben ofzo..

Daarnaast heb ik die functie gewoon van mijn leraar wiskunde gekregen waarvoor ik het maak.. dus tja..

en als reactie op die druk een toets ;):

het is een vraag of je wil herstarten of niet.. dus er moet een keuze zijn tussen 2 dingen :) en eigenlijk heb ik nou iets in die trant.. :)

[ Voor 6% gewijzigd door MaiorDomus op 15-01-2006 22:31 ]


Acties:
  • 0 Henk 'm!

  • DeMoN
  • Registratie: Maart 2001
  • Laatst online: 13-04 17:53

DeMoN

Pastafari

Op zich kan je prog ook wel wat korter :P
Dat definieren van die n en j hoeft niet als je hem tussen quotes zet (string dus gewoon)

code:
1
2
3
while 1:
    stoppen = raw_input("Wil je stoppen? (j/n):\n")
    if stoppen == "j": break

Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein


Acties:
  • 0 Henk 'm!

  • MaiorDomus
  • Registratie: Maart 2003
  • Laatst online: 03-06 18:06
Hey inderdaad :) als je raw_input gebruikt kan dat opeens wel ja.. :) handig om te weten dat variabelen dan geen waarde te hoeven hebben en je ze dus wel gelijk kan vergelijken.. :7

Acties:
  • 0 Henk 'm!

  • DeMoN
  • Registratie: Maart 2001
  • Laatst online: 13-04 17:53

DeMoN

Pastafari

GoTAProblem schreef op maandag 16 januari 2006 @ 16:40:
Hey inderdaad :) als je raw_input gebruikt kan dat opeens wel ja.. :) handig om te weten dat variabelen dan geen waarde te hoeven hebben en je ze dus wel gelijk kan vergelijken.. :7
Waarmee heb je trouwens die .exe gemaakt?
py2exe? De keer dat ik dat gebruikt werkte het niet echt goed of zo :/

Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein


Acties:
  • 0 Henk 'm!

  • MaiorDomus
  • Registratie: Maart 2003
  • Laatst online: 03-06 18:06
nee met PyInstaller :) ging heel makkelijk

PyInstaller is een verbeterde versie van Gordon McMillan's Python Installer en ik vind het eigenlijk heel simpel en lekker werken.. slechts een paar stappen:

python Configure.py

python Makespec.py /path/to/yourscript.py /path/for/specfile.spec

python Build.py /path/for/specfile.spec

En dan wordt je programma gemaakt :) Eventueel kan je nog opties selecteren maar dat staat allemaal netjes in de uitleg :)

Je moet dit trouwens wel in cmd.exe invoeren! Dus in Dos! ;) en natuurlijk moet je in de python map staan en de goede paden gebruiken voor configure.py, makespec.py, build.py specfile.spec en je eigen script ;)

maar echt heel makkelijk :)

Acties:
  • 0 Henk 'm!

  • DeMoN
  • Registratie: Maart 2001
  • Laatst online: 13-04 17:53

DeMoN

Pastafari

GoTAProblem schreef op maandag 16 januari 2006 @ 20:38:
nee met PyInstaller :) ging heel makkelijk

PyInstaller is een verbeterde versie van Gordon McMillan's Python Installer en ik vind het eigenlijk heel simpel en lekker werken.. slechts een paar stappen:

python Configure.py

python Makespec.py /path/to/yourscript.py /path/for/specfile.spec

python Build.py /path/for/specfile.spec

En dan wordt je programma gemaakt :) Eventueel kan je nog opties selecteren maar dat staat allemaal netjes in de uitleg :)

Je moet dit trouwens wel in cmd.exe invoeren! Dus in Dos! ;) en natuurlijk moet je in de python map staan en de goede paden gebruiken voor configure.py, makespec.py, build.py specfile.spec en je eigen script ;)

maar echt heel makkelijk :)
Zal het eens proberen! Thx! :) ;)
En met DOS bedoel je natuurlijk de NT command omgeving, DOS is het niet meer
/mierenneukmodus :7

Gamertag: Cosmicv0id
"Het woord Gods is voor mij niets meer dan een expressie en het product van menselijke zwakheid. De Bijbel is een verzamelwerk van legendes die achtenswaardig zijn maar ook primitief en kinderachtig.'' - Albert Einstein


Acties:
  • 0 Henk 'm!

  • MaiorDomus
  • Registratie: Maart 2003
  • Laatst online: 03-06 18:06
Uiteraard bedoel ik dat :P Mierrenneuker.. probeer je alleen maar te helpen ;) :Y)

succes ermee! :)

[ Voor 11% gewijzigd door MaiorDomus op 16-01-2006 21:04 ]

Pagina: 1