da_pretender Skrevet 27. juli 2009 Del Skrevet 27. juli 2009 hi, jeg har begynt å lære Python på egenhånd og trenger litt hjelp med en WHILe-setning under kan dere se en enkelt kode jeg har laget jeg vil at når jeg taser verdi mindere enn 1 eller høyre enn 24 så skal programmet spørre meg om å taste inn time igjen; noe som den ikke gjør idag time_now = input('What is the hour now?\n>>') while int(time_now) < 1 & int(time_now) > 24: print ('You have entered an invalid hour') output_hour = print ('You have answered: ' + str(time_now)) import time now = time.localtime() print ('The time now is ' + str(now.tm_hour) + ':' + str(now.tm_min) + ':' + str(now.tm_sec)) hour = now.tm_hour if int(time_now) != int(hour): print ('No, the correct hour is ' + str(hour)) else: print ('Correct. The hour now is ' + str(time_now) + '.') status = 'You are supposed to be ' if hour < 8: print (str(status) + 'sleeping') elif hour < 9: print (str(status) + 'commuting') elif hour < 17: print (str(status) + 'working') elif hour < 18: print (str(status) + 'commuting') elif hour < 20: print (str(status) + 'eating') elif hour < 22: print (str(status) + 'resting') else: print (str(status) + 'sleeping') Lenke til kommentar
Vipera Skrevet 27. juli 2009 Del Skrevet 27. juli 2009 Vel for det første vil du aldri går inn i den while løkken din, for den sier at time_now må være mindre enn 1 og større enn 24 samtidig, du må bruke or i stedet for and(&) i løkken. For det andre vil du aldri komme ut av løkken hvis du først går inn i den, du må lese inn en ny time_now mens du er i løkken ellers vil den alltid ha samme verdi og løkken går evig Lenke til kommentar
JeffK Skrevet 27. juli 2009 Del Skrevet 27. juli 2009 (endret) edit: feil Endret 27. juli 2009 av JeffK Lenke til kommentar
terjeelde Skrevet 27. juli 2009 Del Skrevet 27. juli 2009 Kan ofte være greit å rett og slett restrukturere koden. Kanskje noe i retning av slik? time_now = 0 while time_now <1 or time_now >24: time_now = input('What is the hour now?\n>>') try: time_now = int(time_now) except: print "Please enter a number" time_now = 0 print "You have answered: %s" % time_now ... ... God tanke med while-løkker er ofte å skrive dem så nært til det du egentlig vil som mulig. Slik jeg skriver den over, så sier koden "loop til time_now er større enn 1, og mindre enn 24", og all koden som skal til for å sikre at det stemmer er stappet inn i while loopen. Like greit å spørre førstegang i koden også, istedet for å ha kode både innenfor og utenfor while-loopen som spør brukeren om å skrive inn. Slik forslaget mitt er kommer du inn i løkken fordi time_now begynner på 0. Den sjekker også at input er ett gyldig tall. Merk: input spiser fra brukeren, og *kjører det som kode*. Det betyr at den som skriver inn kan få programmet ditt til å gjøre akkurat som han/hun vil. eksempel: >>> time_now = input('what time is it? ') what time is it? 2+3 >>> time_now 5 >>> Lenke til kommentar
Vipera Skrevet 27. juli 2009 Del Skrevet 27. juli 2009 Merk: input spiser fra brukeren, og *kjører det som kode*. Det betyr at den som skriver inn kan få programmet ditt til å gjøre akkurat som han/hun vil. Dette er et godt poeng, og grunnen til at man aldri bør bruke input. Riktig måte er å bruke raw_input som tar inn det du skriver som en string uasnett hva det er, så kan du velge å gjøre hva du vil med stringen etter på(i dette tilfellet prøve å konvertere det til et tall) Det er ingen situasjoner der du egentlig trenger å bruke input, annet en hvis du virkelig vir at det du skriver inn skal kjøres som kode, noe du aldri bør har lyst til:P time_now = raw_input('what time is it? ') Lenke til kommentar
snippsat Skrevet 28. juli 2009 Del Skrevet 28. juli 2009 (endret) Ikke bruk "import time" mitt inne i programmet,import skal alltid øverst. Det er greit og bruke raw_input på 2.x versjoner. Python 3.x har har forandret raw_input/input til kun "input"(som alltid retunerer en string) En løsning med raw_input,fanger også keyboard error viss noen skriver inn bokstaver. while True: time_now = raw_input('What is the hour now?\n>>') try: if int(time_now) <=24 and int(time_now) >= 1: print 'You have answered: %s' % time_now break else: print'please enter a timeformat between(1-24)' except ValueError: print'Please enter a number' time_now = input('What is the hour now?\n>>')while int(time_now) < 1 & int(time_now) > 24: Bare et tips viss du lurer på hvilken datatype noe retunerer. Input retunerer en integer og og i neste linje bruker du (int time_now)altså ikke nødvendig. >>> time_now = input('What is the hour now?\n>>') >>> 5 5 >>> type(time_now) <type 'int'> >>> a = str(time_now) >>> a '5' >>> type(a) <type 'str'> >>> b = a.split() >>> b ['5'] >>> type(b) <type 'list'> >>> c = ''.join(b) >>> c '5' Endret 28. juli 2009 av SNIPPSAT Lenke til kommentar
Vipera Skrevet 28. juli 2009 Del Skrevet 28. juli 2009 FYI, Type sjekking i python har alltid vært noe å holde seg litt unna, og noe man helst ikke bør bli vant til å bruke. Av flere årsaker, blant annet at noen klasser er det som kalles old-style og noen new-style. Og type skjekking på disse kan ofte gi varierende resultater og er ofte en dårlig ide. Og det er alltid en annen måte å gjøre det på en type sjekking Lærte dette selv the hard way:P Lenke til kommentar
da_pretender Skrevet 29. juli 2009 Forfatter Del Skrevet 29. juli 2009 (endret) takk til alle jeg har kommet et steg videre nå trenger jeg litt hjelp med å få en feilmelding dersom jeg tsater inn en streg..jeg har lagt dette i WHILE-lop med får en error pga: while choice != 99 or isinstance (choice, int) det jeg prøver å gjøre er å si: så lenge choice er ikke 99 og en intiger [dvs ikke en streng] så skal programmet kjøre videre hvis ikke så skal den hoppe til siste linje og si: Innvalid Choice #!/usr/local/bin/pythonimport re, os, time choice = 0 now = time.localtime() print ('******************* Menu *********************') print ('Choose a case') print ('1.Return time') print ('2.Return date') print ('3.Write to a file') print ('4.Read from a file') print ('5.List files in the cuttent directory') print ('6:Rename a file') print ('99: Exit') print ('**********************************************') while choice != 99 or isinstance (choice, int): choice = int(input ('\n>>> ')) if int(choice) == 1: print ('You have chosen to return time') print (str(now.tm_hour) + ':' + str(now.tm_min) + ':' + str(now.tm_sec)) elif int(choice) == 2: print ('You have chosen to return date') print (str(now.tm_mday) + '/' + str(now.tm_mon) + '-' + str(now.tm_year)) elif int(choice) == 3: print ('You have chosen to write to a file') text_file = open("\Python31\progs\write_it2.txt", "w") text_file.write("Line 1\n") text_file.write("This is line 2\n") text_file.write("That makes this line 3\n") text_file.close() elif int(choice) == 4: print ('You have chosen to read a file') print ("\nReading the newly created file.") textfil = open ("\Python31\progs\write_it2.txt", "r") print (textfil.read()) textfil.close() elif int(choice) == 5: for root, dirs, files in os.walk('./'): for name in files: filename = os.path.join(root, name) print (filename) elif int(choice) == 6: rxin = input('enter a regex to search for:\n') foo = re.compile(rxin) newname = input('enter a new base name:\n') a = 0 for fname in os.listdir(os.getcwd()): allowed_name = re.compile(rxin).match if allowed_name(fname): a += 1 c = os.path.splitext(fname) b = (newname + str(a) + c[1]) os.rename(fname, b) elif int(choice) == 99: print ("Bye Bye") quit() else: print('Invalid choice') Endret 29. juli 2009 av da_pretender Lenke til kommentar
jonnor Skrevet 29. juli 2009 Del Skrevet 29. juli 2009 (endret) Forslag til en noe mer idiomatisk og renere implementasjon hvor jeg utnytter litt mer av Python sine "finesser", blandt en såkalt "dispatch dict" som holder informasjon om valgene. Her er det sikkert mange ting som er ukjent for deg, så tukl litt rundt med koden og spør dersom du ikke finner uttav hvorfor og hvordan det fungerer. Med vilje litt sparsommelig kommentert En liten oppgave kan være å legge inn resten av funksjonaliteten fra ditt script. Og så kan du modifisere koden slik at menyen blir vist på nytt etter hvert valg. Du kan også spørre deg selv om hvorfor jeg har flyttet "now" dit jeg har. Kode: import re, os, time, sys def print_current_time(): now = time.localtime() print ('You have chosen to return time') print (str(now.tm_hour) + ':' + str(now.tm_min) + ':' + str(now.tm_sec)) def print_current_date(): now = time.localtime() print ('You have chosen to return date') print (str(now.tm_mday) + '/' + str(now.tm_mon) + '-' + str(now.tm_year)) def quit(): print ("Bye Bye") sys.exit(0) if __name__ == '__main__': #init choices = { #key : (menu entry name, function) '1': ('Print time', print_current_time), '2': ('Print date', print_current_date), '99': ('Exit', quit), } print ('******************* Menu *********************') print ('Choose a case') for key, value in sorted(choices.iteritems()): print '%s. %s' % (key, value[0]) print ('**********************************************') #main loop while True: try: user_input = raw_input('\n>>> ') choices[user_input][1]() except KeyError: print('Invalid choice') Resultat: [jon@jon-laptop forum]$ python pycli-dispatchdict.py ******************* Menu ********************* Choose a case 1. Print time 2. Print date 99. Exit ********************************************** >>> 0 Invalid choice >>> 1 You have chosen to return time 14:27:31 >>> 2 You have chosen to return date 29/7-2009 >>> 3 Invalid choice >>> 99 Bye Bye [jon@jon-laptop forum]$ Endret 29. juli 2009 av jonnor Lenke til kommentar
da_pretender Skrevet 29. juli 2009 Forfatter Del Skrevet 29. juli 2009 takk joner for dette jeg hadde tenkt å gjøre det på slik måte etter at jeg har mestret noen av det som jeg har postet jeg tror jeg må legge fram at jeg gjør dette i windows miljø og når jeg bruker raw_input så får jeg en feilmelding jeg har kommet litt videre med å definere fuknsjoner allerede og nå trenger jeg litt hjelp..se skript under jeg prøver å lage noe som endrer navn på en eksisterende fil men vet ikke hvordan skal jeg bruke en loop her..altså når if not FileExists (rxin): print ('File ' + rxin + ' does not exist') så skal skriptet hopper tilbake til: print('enter a regex to search for:\n') rxin = input('>>> ') jeg stater ikke nytt emne side dette er også en WHILE-loop vio jeg tro print('enter a regex to search for:\n') rxin = input('>>> ') def FileExists (rxin): return len(glob.glob(rxin)) if FileExists (rxin): print ('File exists') if not FileExists (rxin): print ('File ' + rxin + ' does not exist') newname = input('enter a new base name:\n') os.rename(rxin, newname) Lenke til kommentar
da_pretender Skrevet 29. juli 2009 Forfatter Del Skrevet 29. juli 2009 forresten jeg fikk noen feilmeldinger her: print '%s. %s' % (key, value[0]) og jeg tok '%s' vekk fikk jeg en annen: Traceback (most recent call last): File "C:\Python31\menu.py", line 27, in <module> for key, value in sorted(choices.iteritems()): AttributeError: 'dict' object has no attribute 'iteritems' Lenke til kommentar
snippsat Skrevet 29. juli 2009 Del Skrevet 29. juli 2009 (endret) Dette blir rotete. Legg koden i code tag,ikke quote tag. Nå virker ikke indentation(4 plasser) Ser nå at du bruker python 3.x,jeg vil anbefale deg og holde deg til 2.x ennå. Alt info på nettet og bøker er for 2.x,dette er info du trenger. Ikke noe problem og ha 2.x og 3.x innstalert sammetidig. Når du lærer 2.x,så lærer du selvfølglig 3.x forandringene er ikke så store. Mange 3 part moduler virker bare på 2.x,som eksp wxpython som jeg bruker til gui. Du må begynne se funksjoner når du skal utvide koden og ha et meny system som du ønsker nå. Klasser kan du vente med,men funksjoner må du lære og bruke. Funksjoner er blokker av kode som gjør livet så mye lettere når koden blir litt større. Viser et eksempel,skrevet så den fungere for 3.x Tenk på det jeg sa om 2x-3x. import time def test1(): '''This function show now time''' a = time.localtime() now_time = time.strftime("%H:%M:%S", a) print(now_time) input("\nTrykk enter for meny") def test2(): '''Info about function''' print('My code') input("\nTrykk enter for meny") def menuloop(): '''Info about function''' while True: print('Welcome to my menu\n') print('(1) Show time now') print('(2) Choice 2') print('(q) Quit') choice = input('Enter your choice: ') if choice == '1': test1() elif choice == '2': test2() elif choice == 'q': exit() else: print('Not a correct choice:', choice) if __name__ == '__main__': menuloop() forrestenjeg fikk noen feilmeldinger her: QUOTE print '%s. %s' % (key, value[0]) Print er en blitt en funksjon i 3.x Da må det bli sånn. print ('%s. %s' % (key, value[0])) Eksp print 'hello world' # 2.x print ('hello world') # 3.x jeg tror jeg må legge fram at jeg gjør dette i windows miljø og når jeg bruker raw_input så får jeg en feilmelding Det er kun input i 3.x,raw_input er fjernet. input i 3.x retunere alltid en string. For int return int(input('')) Endret 29. juli 2009 av SNIPPSAT Lenke til kommentar
da_pretender Skrevet 24. august 2009 Forfatter Del Skrevet 24. august 2009 takk for all hjelp jeg har vært litt borte men er tilbake nå jeg utvider skriptet litt og trener litt hjelp igjen nå ønsker jeg å legge inn en funksjon hvor jeg kan velge språk [fortsettelse til SNIPPSAT sitt kommentar fra 29/07-2009 : 15:32]: print ('------------ L A N G U A G E ----------------')print ('1. Norsk bokmål') print ('2. English') print ('------------- L A N G U A G E ---------------') language = input('>> ') if language == '1': language == 'Norsk bokmål' else: language == 'English' print ('The language is ' + language) Dette retunerer alltid 1 eller 2 videre når jeg har valgt språk har jeg laget disse: def error_nob(): nob_oversikt = ' M E N Y ' nob_error01 = 'Valg er ikke riktig' def error_eng(): en_heading = ' M E N U ' eng_error01 = 'The choice is not correct' mening er at når jeg har valgt norsk bokmål som språk så skal meny på norsk komme print ('------------ ' + <her skal nob_oversikt komme> + '----------------')print ('1. Show time') print ('2. Show date') print ('99. Exit') print ('-------------' + <her skal nob_oversikt komme> + '---------------') hvordan får jeg dette til? Lenke til kommentar
snippsat Skrevet 25. august 2009 Del Skrevet 25. august 2009 (endret) def error_nob(): nob_oversikt = ' M E N Y ' nob_error01 = 'Valg er ikke riktig' def error_eng(): en_heading = ' M E N U ' eng_error01 = 'The choice is not correct' Dropp denne. Noe mere i denne stilen. def norsk_meny(): print('norsk meny') def english_menu(): print('english menu') def language_choice(): print ('------------ L A N G U A G E | SPRÅK ----------------') print ('1. Norsk bokmal') print ('2. English') print ('------------- L A N G U A G E | SPRÅK ---------------') while True: language = input('>> ') if language == '1': norsk_meny() break elif language == '2': english_menu() break else: print ('velg 1 eller 2 for språk | choice 1 or 2 for language') language_choice() Endret 25. august 2009 av SNIPPSAT Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå