Gå til innhold

[løst]Funksjon returnerer bare false, skal skjekke om verdien er et tall


Anbefalte innlegg

Hei! :)

def is_number(x):
try:
	x = str(float(x))
	return True
except ValueError:
	return False

 

Løste problemet... Kommer kanskje tilbake med flere spørsmål! ;)

Klikk for å se/fjerne innholdet nedenfor

 

Driver å leker meg litt med python.

 

Det jeg lurer på akkurat nå er: Hvorfor virker ikke denne delen?

 

def is_number(x):
try:
	x + 1
	return True
except TypeError:
	return False

 

Uansett hva jeg sender til den, returnerer den falsk... Har som sagt ikke så mye erfaring med python, men ut fra det jeg har lest om try/except, så forstår jeg ikke hva som er feil.

 

Hele koden:

Klikk for å se/fjerne innholdet nedenfor

#!/usr/bin/python

# masseenhter.py

def is_number(x):
try:
	x + 1
	return True
except TypeError:
	return False


poundratio = 0.45359237
ozratio = 0.028349523

print "Beregning av massenheter v0.1\n"

inn = raw_input("Skriv inn en masse(22kg/lb/oz):")
inn = inn.replace(',','.')

print is_number(inn[:-2])

verdi = inn[:-2]
verdi = float(verdi)

enhet = inn[-2:]
enhet = enhet.lower()

if enhet == 'lb':
kilo = verdi * poundratio
oz = kilo * ozratio
print verdi, 'pounds er', kilo, 'kg'
print verdi, 'pounds er', oz, 'oz'

if enhet == 'kg':
lb = verdi / poundratio
oz = verdi / ozratio
print verdi, 'kilogram er', lb, 'pound'
print verdi, 'kilogram er', oz, 'oz'

if enhet == 'oz':
kilo = verdi * ozratio
lb = kilo / poundratio
print verdi, 'oz er', kilo, 'kg'
print verdi, 'oz er', lb, 'lb'

 

Endret av Blackslash
Lenke til kommentar
Videoannonse
Annonse

hei, ser du har løst problemet ditt, men får allikevel lyst til å svare.

 

Det eneste som ikke kommer helt klart fram er om funksjonen skal returnere True på tall som er strenger, f.eks

 

is_number("123")

 

Hvis den ikke skal det, kan du vurdere to andre utveier:

 

def is_number(x):
return hasattr(x, '__abs__')

def is_number2(x):
return isinstance(x, int) or isinstance(x, float)

tests = [1, '1', 1.0, '1.0', 'a', 123456789876543234]

for test in tests:
print test, type(test), is_number(test)

print '\n'

for test in tests:
print test, type(test), is_number2(test)

 

Output her blir:

G:\groks>is_num.py

1 <type 'int'> True

1 <type 'str'> False

1.0 <type 'float'> True

1.0 <type 'str'> False

a <type 'str'> False

123456789876543234 <type 'long'> True

 

 

1 <type 'int'> True

1 <type 'str'> False

1.0 <type 'float'> True

1.0 <type 'str'> False

a <type 'str'> False

123456789876543234 <type 'long'> False

 

Som du ser blir den siste forskjellig. Det er fordi det ikke ligger noen test på datatypen long i is_number2().

Det kan løses med å legge til "or isinstance(x, long)".

 

I is_number() sjekker vi om argumentet har attributter som kjennetegner tall i python, f.eks __abs__(). I is_number2() sjekker vi om argumentet er en instans av int og float. Siste metode fører noen ganger galt avsted, som her.

 

I Python er det ofte ikke interessant hvilken datatype et objekt har, men hvilke metoder det byr på. Hvis det viktige f.eks er om objektet har metoden count(), er det enklest, og penest, og sjekke det, i stedet for å undersøke om objektet er det ene, andre, tredje osv. F.eks har både en streng og en liste metoden count():

 

In [1]: "1234".count("4")
Out[1]: 1

In [2]: [1, 2, 3 ,"4", 4].count("4")

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