Tråd bedømmelse:
  • 0 Stemmer - 0 Gennemsnit
  • 1
  • 2
  • 3
  • 4
  • 5
Hjælp med simpel kode
25-04-2014, 18:46
#1
Hjælp med simpel kode
Hej.
Den eneste fejl i denne kode er at hvis du skriver brugernavnet fejl fortsætter den ikke med at loppe. Jeg er igang med at lære python, men kan ikke rigtig finde ud af hvordan jeg får det gjort. Jeg kan ikke rigtig finde ud af hvordan man læser keys fra dictionarys. Nogle der kan hjælpe?

Kode:
def check():
    data = ({'test':'123','mads':'123','lasse':'lasse'})
    input_username = raw_input('Username: ')
    input_password = raw_input('Password: ')

    while input_password != data[input_username]:
        print "username or password is incorrect try again"
        input_username = raw_input('Username: ')
        input_password = raw_input('Password: ')
    print "Du er nu logget ind"
        
check()
Find alle beskeder fra denne bruger
Citer denne besked i et svar
25-04-2014, 18:53
#2
RE: Hjælp med simpel kode
Den fortsætter da fint:
Kode:
$ python test.py
Username: test
Password: 1234
username or password is incorrect try again
Username: test
Password: 134
username or password is incorrect try again
Username: test
Password: 123
Du er nu logget ind
$
Find alle beskeder fra denne bruger
Citer denne besked i et svar
25-04-2014, 19:02
#3
RE: Hjælp med simpel kode
Det gør det så længe man bruger et brugernavn der er der.
Hvis jeg skriver et brugernavn der ikke er der eks polle
Så hopper den ud. Det vil jeg have rettet :)
Find alle beskeder fra denne bruger
Citer denne besked i et svar
25-04-2014, 21:27 (Denne besked var sidst ændret: 25-04-2014, 21:29 af Doctor Blue.)
#4
RE: Hjælp med simpel kode
Selvom du kunne gøre det med exception handling, så vil jeg måske hellere foreslå en lidt anderledes struktur. Det er nemlig ikke en særlig smart opstilling hvis du ikke ved om indekset eksisterer.

I stedet bør du oprette en liste med bruger objekter.
Herefter kan du så loope igennem listen ved hjælp af et for loop.

def check(self, userlist, inuser, inpass):
for user in userlist:
if user['username'] == inuser:
if user['password'] == inpass:
return true
else:
return false
return false

users = [
{"username": "test", "password": "123"},
{"username": "lasse", "password": "lasse"}
]

input_username = raw_input('Username: ')
input_password = raw_input('Password: ')

if check(users, input_username, input_password):
print "Du er nu logget ind"
else:
print "Brugernavn/password er forkert"

Selvom det at loope i det ikke er så pænt, så kan jeg anbefale at bruge en database eller et hashmap hvor du kan bruge BTREE indeksering til hurtige opslag, men du lærer selvfølgelig stadig :)
Mine løsninger er altid meget alternative, jeg er ikke så god til at slå søm i med en skruetrækker, så jeg bruger bare en database af en art til den type opgaver.
Mangler du hjælp?
Regler |  E-mail (PGP)
Besøg denne brugers hjemmeside Find alle beskeder fra denne bruger
Citer denne besked i et svar
26-04-2014, 11:55 (Denne besked var sidst ændret: 26-04-2014, 12:43 af kiksen.)
#5
RE: Hjælp med simpel kode
Rettede lige lidt i din kode før jeg kunne få den til at virke true = True, false = False
Og self hvor du laver funktionen skulle ikke være der, man inputter jo kun 3 argumenter nederst i linje 18

Men 1000 tak, det var meget lærerigt!

Arbejdede lidt videre på din kode og nu har jeg fået den til at loppe også.


def check(userlist, inuser, inpass):
for user in userlist:
if user['username'] == inuser:
if user['password'] == inpass:
return True
else:
return False
return False

users = [
{"username": "test", "password": "123"},
{"username": "lasse", "password": "lasse"}
]

input_username = raw_input('Username: ')
input_password = raw_input('Password: ')

if check(users, input_username, input_password):
print "Du er nu logget ind"

else:
while check(users, input_username,input_password) == False :
print "Wrong Username/Password"
input_username = raw_input('Username: ')
input_password = raw_input('Password: ')
print "Du er nu logget ind"


Find alle beskeder fra denne bruger
Citer denne besked i et svar
27-04-2014, 00:20 (Denne besked var sidst ændret: 27-04-2014, 00:30 af Doctor Blue.)
#6
RE: Hjælp med simpel kode
(26-04-2014, 11:55)kiksen Skrev: Rettede lige lidt i din kode før jeg kunne få den til at virke true = True, false = False
Og self hvor du laver funktionen skulle ikke være der, man inputter jo kun 3 argumenter nederst i linje 18

Men 1000 tak, det var meget lærerigt!

Arbejdede lidt videre på din kode og nu har jeg fået den til at loppe også.


def check(userlist, inuser, inpass):
for user in userlist:
if user['username'] == inuser:
if user['password'] == inpass:
return True
else:
return False
return False

users = [
{"username": "test", "password": "123"},
{"username": "lasse", "password": "lasse"}
]

input_username = raw_input('Username: ')
input_password = raw_input('Password: ')

if check(users, input_username, input_password):
print "Du er nu logget ind"

else:
while check(users, input_username,input_password) == False :
print "Wrong Username/Password"
input_username = raw_input('Username: ')
input_password = raw_input('Password: ')
print "Du er nu logget ind"



Jeg er pænt rusten i mit Python så der kan snildt være nogle ting der er skrevet forkert. Det er også fint nok at du skal patche det, så lærer du også lidt af det, hehe :)
Det der self parameter jeg har klemt ind i funktionen er en vane fra at skrive classes hvor det generelt er en fordel. Det skal naturligvis væk når der ikke er nogen class og det alligevel ikke bliver brugt ^^
Mit Python bliver altid skrevet på en måde der minder lidt om PHP og så sidder jeg og patcher på det derefter fordi der er mange ting jeg overser, som du nok også har opdaget efterhånden ;)

EDIT: Jeg har lige en anden løsning, der kommer om lidt :)
Som jeg nævnte før så fandtes der sikkert en bedre løsning. Nu faldt det mig lige ind hvad jeg tænkte på.
Hvis vi skal bygge videre på den kode du har lavet, som nok er mere optimal end mit loop, så kan vi lige lave nogle småting om for at undgå problemer.

def check():
data = ({'test':'123','mads':'123','lasse':'lasse'})
input_username = raw_input('Username: ')
input_password = raw_input('Password: ')

while data.get(input_username) != None and input_password != data.get(input_username):
print "username or password is incorrect try again"
input_username = raw_input('Username: ')
input_password = raw_input('Password: ')
print "Du er nu logget ind"

check()

data.get(input_username) gør præcis det samme som din metode, med den ene forskel er at den returnerer None (null-type objekt tror jeg nok) hvis nøglen ikke eksisterer i din dictionary (protip: arrays med tekst-nøgler heder dictionaries (dict) og arrays med heltalsnøgler er lister).
Jeg ville måske stadig strukturere koden anderledes, men det er flueknepperi og slet ikke det spørgsmålet handler om, så det lader vi være med at pille ved :)
Mangler du hjælp?
Regler |  E-mail (PGP)
Besøg denne brugers hjemmeside Find alle beskeder fra denne bruger
Citer denne besked i et svar
27-04-2014, 09:15
#7
RE: Hjælp med simpel kode
Her er en version uden gentagen kode:
def login():
data = {'test':'123', 'mads':'123', 'lasse':'lasse'}
def check(user, password):
return user in data and data[user] == password
while not check(raw_input('Username: '), raw_input('Pasword: ')):
print 'Forkert brugernavn eller password'
print 'Du er nu logget ind'

login()
Find alle beskeder fra denne bruger
Citer denne besked i et svar
27-04-2014, 10:02
#8
RE: Hjælp med simpel kode
1000 tak for alle svar, det har hjulpet mig meget
Find alle beskeder fra denne bruger
Citer denne besked i et svar
27-04-2014, 11:44
#9
RE: Hjælp med simpel kode
(27-04-2014, 09:15)BlimBlamBlar Skrev: Her er en version uden gentagen kode:
def login():
data = {'test':'123', 'mads':'123', 'lasse':'lasse'}
def check(user, password):
return user in data and data[user] == password
while not check(raw_input('Username: '), raw_input('Pasword: ')):
print 'Forkert brugernavn eller password'
print 'Du er nu logget ind'

login()

Hvorfor definerer du check inde i login?
Mangler du hjælp?
Regler |  E-mail (PGP)
Besøg denne brugers hjemmeside Find alle beskeder fra denne bruger
Citer denne besked i et svar
27-04-2014, 19:50
#10
RE: Hjælp med simpel kode
(27-04-2014, 11:44)Doctor Blue Skrev: Hvorfor definerer du check inde i login?

Jeg holder funktionen lokal fordi den ikke giver mening andre steder...for at undgå clutter i det globale scope. lidt ligesom private member funktioner.
Find alle beskeder fra denne bruger
Citer denne besked i et svar
« Ældre | Nyere »




User(s) browsing this thread: 1 Gæst(er)