Gå til innhold

Anbefalte innlegg

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
Videoannonse
Annonse

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

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

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 av SNIPPSAT
Lenke til kommentar

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

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/python

import 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 av da_pretender
Lenke til kommentar

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 av jonnor
Lenke til kommentar

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

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

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()

 

forresten

jeg 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 av SNIPPSAT
Lenke til kommentar
  • 4 uker senere...

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

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 av SNIPPSAT
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...