Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  9 1393
Hei,

situasjonen jeg sliter med er å klare å skriv en kode hvor man bare har lov til å skrive inn et tall, som ikke er en string, men en Integer.

Det vil si, at jeg trenger noe som ligner på .isalpha(), som er for strings, men noe som er for integer. Da snakker jeg ikke om .isdecimal() eller .isdigit(), fordi det kommer jo bare ut som en string.

Noen tips?
Denne skal fungere:

Kode

def is_int(str):
    try:
        int(str)
        return True
    except ValueError:
        return False
Diverse resultat:

Kode

is_int('5') # True
is_int('5a') # False
is_int('5.0') # False
is_int('5,0') # False
Sist endret av steili; 18. oktober 2013 kl. 02:13.
Trådstarter
Den fungerer ypperlig! Takk for hjelpen. Gjenstår det bare litt struktur endring så er alt på gli
Sitat av Talabo Vis innlegg
Hei,

situasjonen jeg sliter med er å klare å skriv en kode hvor man bare har lov til å skrive inn et tall, som ikke er en string, men en Integer.

Det vil si, at jeg trenger noe som ligner på .isalpha(), som er for strings, men noe som er for integer. Da snakker jeg ikke om .isdecimal() eller .isdigit(), fordi det kommer jo bare ut som en string.

Noen tips?
Vis hele sitatet...
Vil du at den skal ta inn kun integers, eller er floats også ok?
steinarlimas løsning vil godta alt som kan evalueres til int, og ikke bare ints. Hvis du derimot bare vil ha ints, så kan du bruke denne:

int_p = lambda n: type(n) == int
Python 2:
u"989898".isnumeric()

Python 3:
"87987897".isdigit() # godta bare siffer 0-9
"87987897".isdecimal() # denne godtar alt som lukter av tall
▼ ... over en uke senere ... ▼
Trådstarter
Sitat av Myoxocephalus Vis innlegg
Vil du at den skal ta inn kun integers, eller er floats også ok?
steinarlimas løsning vil godta alt som kan evalueres til int, og ikke bare ints. Hvis du derimot bare vil ha ints, så kan du bruke denne:

int_p = lambda n: type(n) == int
Vis hele sitatet...
Litt usikker på hvordan jeg skal bruke int_p = lambda n: type(n) == int ,
foreløbig sitter jeg på en halvferdig snitt av kodinga:

Kode

while 1:
    InNr=eval(input("Gjett et tall fra 0 til 100: "))
    if is_int(InNr) == False or (InNr > 0) == False or (InNr < 101) == False:
        print("Bare Tall fra 0 til 100!")
    else: break
    GenNr=random.randint(0,100)
    Count=1
    while InNr != GenNr:
        if InNr > GenNr:
            txt="%s er for hoyt, gjett igjen: "
        elif InNr < GenNr:
            txt="%s er for lavt, gjett igjen: "

        InNr=eval(input(txt %InNr))
som du ser så har jeg tatt ibruk

Kode

def is_int(str):
    try:
        int(str)
        return True
    except ValueError:
        return False
Python 2:
u"989898".isnumeric()

Python 3:
"87987897".isdigit() # godta bare siffer 0-9
"87987897".isdecimal() # denne godtar alt som lukter av tall
Vis hele sitatet...
Når jeg prøver å bruke xx.isdigit() så ender det opp bare med error, så enten bruker jeg den helt feil. Eller så er den ikke bygd opp for å aksepter feil.

Kode

while True:
    InNr = eval(input("Gjett et tall fra 0 til 100: ")) #Variabel navn bør ikke bli navngitt sånn. kan kalle den for f.eks guess.

    if (0 <= InNr <= 100) or not is_int(InNr): #Slik kan den skrives
        print("Bare tall fra 0 til 100!")
    else:#Her breaker du når brukeren faktisk skriver inn et tall.
        break
    GenNr=random.randint(0,100) #Igjen stygt og på feil format. number_to_guess er f.eks et bedre.
    Count=1 #count i stedenfor Count. Det er kun klassenavn som skal ha stor forbokstav
    while InNr != GenNr:
        if InNr > GenNr:
            txt="%s er for hoyt, gjett igjen: "
        elif InNr < GenNr:
            txt="%s er for lavt, gjett igjen: "

        InNr=eval(input(txt %InNr)) #her tar du input, men du sjekker ikke at det er et tall
                                    #slik som du absoultt skulle gjøre øverst.
                                    #Hva med å legge input til en funksjon?
Sitat av Talabo Vis innlegg
Litt usikker på hvordan jeg skal bruke int_p = lambda n: type(n) == int ,
Vis hele sitatet...
Det er en funksjon. I python kan du bruke lambda-uttrykk for å skrive funksjoner (basert uunnværlig hvis du vil drive med funksjonell programmering i python), så disse to uttrykkene er fullstendig ekvivalente.

Kode

f = lambda x: x**2

def g(x):
    return x**2
og kalles på eksakt samme måte; f(2) == g(2) == 4

Nå, min funksjon heter int_p (egentlig et misvisende navn, når jeg tenker meg om; det burde gis variabelen og ikke funksjonen, men skitt au), den tar inn et eller annet python-objekt n, og den returnerer enten True eller False. Dersom n er en int, så vil type(n) returnere int, og type(n) == int vil evalueres til True. Hvis n er noe annet enn int, så vil testen gi False. Den brukes akkurat som en hvilken som helst annen funksjon, her demonstrert i ipython:

Kode

In [1]: int_p = lambda n: type(n) == int

In [2]: int_p(2)
Out[2]: True

In [3]: int_p(2.0)
Out[3]: False

In [4]: int_p('hello')
Out[4]: False

In [5]: int_p(int_p)
Out[5]: False
Fordelen med en slik kode er at den er ekstremt robust; du kan slenge inn hva du vil, til og med en funksjon, og programmet vil kjøre like herlig. Det går også fort. Try/Except er geniale når de er nødvendige, men det er overraskende hvor ofte du kan slippe unna uten å ty til dem.
Trådstarter
ReaVen, takker for tips

Myoxocephalus, det der er uvurderlig informasjon, takker
Når det gjelder type() så skal man helst(aldri) ikke bruke den til type sjekking.
Arv fra "str" or "int" vil ikke type() fange opp,til dette er isinstance() bedre.
The most Pythonic way to check the type of an object is... not to check it.
Vis hele sitatet...
Hvorfor sier man dette?
etse tar opp dette idiomatisk python - Del 1
Det neste idiomet går under noe man kaller Duck typing i python. Dette handler om at man ikke bryr seg om typer av objekter og variabler i språket - og man skal bruke det til sin fordel
Vis hele sitatet...
Skal man først type sjekke gjøre det sparsomt og bruk isinstance(obj, some_type).
Det man helst ønsker og gjøre er og bruke objektet til det det er ment for,så får man heller fange opp feil med(try,except)

@Talabo ikke bruk eval() og se litt på PEP 8
Prøv og bruke bare engelsk når du koder.
Regner med du bruker Python 3?
Noe mer i denne stilen.

Kode

import random

secret_number = random.randint(1,100)
guess = 0
while guess != secret_number:
    guess = int(input("Take a guess: "))
    if guess > secret_number:
        print ("Lower")
    elif guess < secret_number:
        print ("Higher")

print('You guessed it! The number was {}'.format(guess))