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.
  12 1044
Jeg har laget dette for å vise hva jeg prøver på:

Kode

a = input()
b = input()
c = input()

r = ['a','b','c']
empty = 0

for i in range(len(r)):
    if r[i] in locals() or r[i] in globals():
        print r[i], "exists"
    else:
        global empty
        empty = empty + 1
    
print empty
Loopen sjekker hvor mange variabler som ikke eksisterer.

Problemet er at hvis brukeren ikke setter inn et tall, kommer det en SyntaxError som stopper programmet.

Jeg løste det med "try, except SyntaxError", men det er sannsynligvis ikke den beste måten å gjøre noe så enkelt på. Hvordan kan jeg ellers gjøre det?

Takker for alle svar.
One of the good guys
2rs1's Avatar
except er ikke nødvendigvis en dårlig måte å gjøre det på, men hva er det du skal bruke a, b og c til?

evt.:
input(None) -> error
raw_input(None) -> ''
Sist endret av 2rs1; 2. november 2010 kl. 21:44.
Takk for svar!

Jeg holder på å lage bevegelseskalkulator. a, b og c skal være variablene for akselerasjon osv, men det var lettere å lage et nytt eksempel.

Da bruker except. Ser ut til at det kan virke fint.

Men det dukket opp en nytt spørsmål:
Jeg laget en funksjon "doNothing()" fordi jeg trengte en funksjon som ikke gjorde noe. Finnes det noe annet som gjør det samme?
Jeg holder på å lage bevegelseskalkulator. a, b og c skal være variablene for akselerasjon osv, men det var lettere å lage et nytt eksempel.
Vis hele sitatet...
Ser ikke helt hvorfor du må sjekke global og local namespace(for variabler) på den måten for og lage bevegelseskalkulator.

Jeg laget en funksjon "doNothing()" fordi jeg trengte en funksjon som ikke gjorde noe. Finnes det noe annet som gjør det samme?
Vis hele sitatet...
Tror du må forklarere bedere på hva du prøver og gjøre og hvorfor dette må løses med doNothing() funksjon.
Nå virker denne funksjonen fint, med mindre jeg bruker den for å finne "velocity". Da får jeg denne feilmeldingen:

"local variable 'v' referenced before assignment"

Denne feilmeldingen betyr etter hva jeg at forstått at v allerede er en global variabel, men det har den ikke.

Håper noen kan se gjennom funksjonen og forklare hva feilmeldingen betyr.

Kode

#If velocity is constant:

def vConst():
    ans = 0
    while ans!=1:
        print "Enter 2 two values, leave the one you want to find blank."

        try:
            d = input("Distance: >")
        except SyntaxError:
            doNothing()

        try:
            v = input("Velocity: >")
        except SyntaxError:
            doNothing()

        try:
            t = input("Time:     >")
        except SyntaxError:
            doNothing()

        varlist = ['d','v','t']
        empty = 0

# Checking how many variables is not set
        for i in range(len(varlist)):
            if varlist[i] in locals() or varlist[i] in globals():
                doNothing()
            else:
                empty = empty + 1

# If one variable is left empty and the two others exists,
# Motion formula is used.
# ans = 1 -> loop will not be repeated
        if empty == 1:
            if ('v' and 't') in (locals() or globals()):
                motionformulas.findD(v,t)
                ans = 1
            elif ('d' and 't') in (locals() or globals()):
                motionformulas.findV(d,t)
                ans = 1
            elif ('v' and 'd') in (locals() or globals()):
                motionformulas.findT(v,d)
                ans = 1
            else: print "Error: 1..."
        else: print "Error: 2..."


    print ""
    print "Do you want to do another calculation?"
    global new
    new = input("Yes (1) or no (0)")
Hvis v ikke blir satt (du får en exception), vil du heller ikke kunne gjøre noe med variabelen.
Sitat av tobbe654 Vis innlegg
Jeg laget en funksjon "doNothing()" fordi jeg trengte en funksjon som ikke gjorde noe. Finnes det noe annet som gjør det samme?
Vis hele sitatet...
jeg vet ikke i hvilken sammenheng. Men også når jeg skriver kode og lage IF-statements som jeg enda ikke har tenkt å implementere, skriver jeg bare pass.

Kode

if true:
    pass
Takker for svar

Det er mulig at jeg gjør dette på en veldig tungvint måte, men det er mest for læring.
Funksjonen som jeg la inn i innlegget over var funksjonen når velocity er konstant. Det er en annen funksjon hvis v ikke er konstant, men jeg konsentrerer meg først om denne.

Sitat av raze Vis innlegg
Hvis v ikke blir satt (du får en exception), vil du heller ikke kunne gjøre noe med variabelen.
Vis hele sitatet...
Og derfor lagde jeg min egen exception: doNothing. Da skal jeg heller ikke bruke variablen lenger.
Jeg får ikke exception'en når ikke v blir satt, men etter at jeg har satt alle variablene.

Spørsmålet nå hvorfor dette virker for d og t, men ikke for v.

Sitat av etse Vis innlegg
jeg vet ikke i hvilken sammenheng. Men også når jeg skriver kode og lage IF-statements som jeg enda ikke har tenkt å implementere, skriver jeg bare pass.

Kode

if true:
    pass
Vis hele sitatet...
Det var det jeg lette etter. Jeg må lese tutorialen
Sist endret av tobbe654; 3. november 2010 kl. 00:06.
Syens hele koden din er merkelig og feilbehandlig skal ikke gjøres på den måten.

Kode

def doNothing():
    pass

try:
    v = input("Velocity: >")
    print v
except SyntaxError:
    doNothing()
Jeg quoter Zen of Python:
Errors should never pass silently.
Unless explicitly silenced.

I koden over vil SyntaxError passere stille hverker bruker eller du vil vite at en SyntaxError har skjedd.
Og skal du ikke fange opp f.eksp "NameError" viss bruker taster inn en bokstav?
Heisann!
Du gjør dette på en veldig kreativ måte, det liker jeg ser du må ha tenkt mye på det for å løse det sånn.
Det er en del grep du kan gjøre for å gjøre det mer effektivt og ryddig.

Du kan fint bytte doNothing() ut med pass, og du trenger ikke sjekke om 'd' 'v' og 't' er i namespacen, om du øverst i funksjonen gir de fek.s verdien Null altså d=Null så er den deklarert og du slipper feilmeldinger på det, du kan også senere sjekke if d==Null. Null er veldig praktisk og mye mer en navnet Null skulle tilsi.
Du kan også bytte ut input() med raw_input() da vil du ikke få feilmelding uansett hva brukeren skriver inn, men det kommer inn som en string, så du må konvertere det til en int eller float etterpå med feks.
try:
d = float(d)
except ValueError:
pass
Sist endret av kidz; 3. november 2010 kl. 00:27.
Som Kidz er inne på og bruke raw_input() er en bedere løsning.
Aldrig bruke input() i python 2.x er et godt råd,fordi input() bruker eval() for og kunne returnere en integer.
I python 3 har dette blitt forandret så det finnes kun input() som returnerer string(samme som raw_input python 2.x)

Her satt opp noe du kan de på.
Her kommer det en melding til bruker når feil input skjer,det mulig og lage stille løsning viss du må ha det.

Kode

def user_input():
    while True:
        try:
            d = float(raw_input("Distance: >"))
            v = float(raw_input("Velocity: >"))
            t = float(raw_input("Time:     >"))
            return d,v,t
        except (ValueError,SyntaxError):
            print 'Only number for input,try again'
            #print ''  #no message about error
            #send_somewhere(traceback.format_exception(*sys.exc_info()))  #Possibly to send error without user notice this
            
print user_input()
Sist endret av snippsat; 3. november 2010 kl. 02:01.
Fin løsning snippsat, OT, må bare si at rendringene dine i 3d galeriet er helt fantastisk bra!
Takker for tilbakemeldinger.
Er nesten ferdig med den nå. I modulen: motionformulas er det bare en lang rekke med formler som jeg ikke er helt ferdig med.

Kode

from motionformulas import *

#If velocity is constant:

def fConst():
    ans = 0
    while ans < 1:

        print ""
        print "Enter 2 two values, leave the one that you want to find blank."
        print ""

        var = ['d','v','t'] # contains the variables,
        value = ['','',''] # the values for d, v and t
        names = ['Distance: (m)   >', 'Velocity (m/s): >', 'Time (s):       >']

        for i in range(len(var)):
            try:
                value [i] = float(raw_input(names[i]))
            except (ValueError):                # If input is not a number,
                print var[i], "is left empty."  # variable will be left empty

        empty = value.count('') # how many fields that was left empty
        emptyvar = value.index('') # index of the empty variable

        d = value[0]
        v = value[1]
        t = value[2]


# ans = 1 -> loop will not be repeated
        print ""
        if empty == 1:
            if emptyvar == 0:       # If d is empty -> findD()
                findD(v,d)
                ans = 1
            elif emptyvar == 1:     # If v is empty -> findV()
                findV(d,t)
                ans = 1
            elif emptyvar == 2:     # If t is empty -> findT()
                findT(d,v)
                ans = 1
            else: print "Error: ..."
        else:
            print "Error: Too many fields were left empty. Try again"
            print ""


    print ""
    print "Do you want to do another calculation?"
    global new
    new = input("Yes (1) or no (0)")


#If velocity is not constant:

def fNotConst():

    names =  ['Distance (m):           >', 'Acceleration (m/s**2):  >']
    names += ['Final velocity (m/s):   >', 'Initial velocity (m/s): >']
    names += ['Time (s):               >']

# Will find the object in a list
# and change the value the same index to 'find' in another list
    def find(obj,search_list,change_list):
        x = obj
        y = search_list.index(x)
        change_list[y] = 'find'

    ans = 0
    while ans!=1:
        print ""
        print "Distance:            d"
        print "Acceleration:        a"
        print "Final velocity:      vf"
        print "Initial velocity:    vi"
        print "Time:                t"
        print ""

        x = str(raw_input("Which variable do you want to find? > "))

        var = ['d','a', 'vf', 'vi', 't'] # contains the variables,
        value = ['','','','',''] # the values for d, a, vf, vi and t

        find(x, var, value)     # Will make x equal 'find' in value

        print "Enter the values that you know,"
        print "at least 3 values are needed."

        for i in range(len(var)):
            if value[i] != 'find':
                try:
                    value [i] = float(raw_input(names[i]))
                except (ValueError):                # If input is not a number,
                    print var[i], "is left empty."  # variable will be left empty

        empty = value.count('') # how many fields that was left empty
        try:
            emptyvar = value.index('') # index of the empty variable
        except ValueError: pass

        d = value[0]
        a = value[1]
        vf = value[2]
        vi = value[3]
        t = value[4]

        print d,a,vf,vi,t

        if empty <= 1:
            if d == 'find':
                print "skal finne d"
                if a == '':
                    AFindD(vi,vf,t)
                    ans = 1
                elif vf == '':
                    VfFindD(vi,t,a)
                    ans = 1
                elif vi == '':
                    ViFindD(vf,t,a)
                    ans = 1
                elif t == '':
                    TFindD()
                    ans = 1

            elif a == 'find':
                print "skal finne a"
                if d == '':
                    DFindA(vf,vi,t)
                    ans = 1
                elif vf == '':
                    VfFindA()
                    ans = 1
                elif vi == '':
                    ViFindA()
                    ans = 1
                elif t == '':
                    TFindA()
                    ans = 1

            elif vf == 'find':
                print "skal finne vf"
                if a == '':
                    AFindVf()
                    ans = 1
                elif d == '':
                    DFindVf(vi,a,t)
                    ans = 1
                elif vi == '':
                    ViFindVf()
                    ans = 1
                elif t == '':
                    TFindVf(vi,a,d)
                    ans = 1

            elif vi == 'find':
                print "skal finne vi"
                if a == '':
                    AFindVi()
                    ans = 1
                elif vf == '':
                    VfFindVi()
                    ans = 1
                elif d == '':
                    DFindVi(vf,a,t)
                    ans = 1
                elif t == '':
                    TFindVi()
                    ans = 1

            elif t == 'find':
                print "skal finne t"
                if a == '':
                    AFindT()
                    ans = 1
                elif vf == '':
                    VfFindT()
                    ans = 1
                elif vi == '':
                    ViFindT()
                    ans = 1
                elif D == '':
                    DFindT(vf,vi,a)
                    ans = 1


            else: print "Error: No variable was selected to be found, try again"

        else:
            print "Error: Too many fields were left empty"
            print "       or written in one format, try again"

    print ""
    print "Do you want to do another calculation?"
    global new
    new = input("Yes (1) or no (0)")

new = 1
while new == 1:
    print "Is the velocity constant?"
    const = input("Yes (1) or no (0) > ")
    if const == 1:
        fConst()
    elif const == 0:
        fNotConst()
    else:
        print "ERROR"