Kod optimering/förbättring :)

Här diskuteras programmering och utveckling
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

Kod optimering/förbättring :)

Inlägg av ZerQ »

Hejsan Jag har återigen så smått börjat på med python programmering. Kom inte så långt förra gången men tänkte försöka satsa lite mer denna gång...

Har skrivit ett enkelt program men skulle vilja ha lite tips på vad jag kan optimera, ändra eller bara göra snyggare. Så svårt att hitta lösningar när man sitter hemma och pular själv.

Kod: Markera allt

####################################################################################################
# Programmerare: J L
# Datum: 27/7 - 2010
# Programbeskrivning:
#       Detta program beräknar vad det behövs för förkopplingsmotstånd till att driva en lysdiod
#       baserat på dom värden för spänningsfall, inspänning och strömtålighet som lysdioden har.
####################################################################################################
# Variabel deklarering och tilldelning av startvariabler
Mot1 = 0
Mot2 = 0
E12 = [10, 12, 15, 18, 22, 39, 47, 56, 68, 82, 100, 120, 150, 180, 220, 270, 330, 390, 470, 560,
       680, 820, 1000, 1200, 1500, 1800, 2200, 2700, 3300, 3900, 4700, 5600, 6800, 8200, 10000,
       12000, 15000, 18000, 22000, 27000, 33000, 39000, 47000, 56000, 68000, 82000, 100000, 120000,
       150000, 180000, 220000, 270000, 330000, 390000, 470000, 560000, 680000,
       820000, 1000000]

####################################################################################################
# Funktionsblock
####################################################################################################
# definiera en funktion som hämtar in och gör en beräkning av moståndet
def UserInput():
    # Deklarera och tilldela 4 variabler
    a, b, c, d = 0, 0, 0, 0
    li = []
    # ta in uppgifterna som behövs för att beräkna motståndet till lysdioden
    print 'Vänligen ange volt och önskad ström i milliampere för din lysdiod.'
    while True:
        try:
            a = float(raw_input('Inspänning i volt: '))
            b = float(raw_input('Önskat spänningsfall över lysdioden: '))
            li = CompVolt(a, b)
            c = int(raw_input('Ange max ström i milliampere som din lysdiod tål: '))
            break
        except ValueError:
            print 'Du har inte angett ett giltigt värde, endast tal kan anges. Försök igen.'
    
    # Beräknar motståndet och skriver ut svaret i terminalen
    d = (li[0] - li[1]) / (c / 1000.0)
    print 'Motståndet som behövs blir: ', d, 'Ohm'
    return d

# Definiera en funktion som kontrollerar att in och spänningsfallet inte är fel
def CompVolt(a, b):
    li = []
    if a < b:
        while True:
            try:
                print 'Du har angett ett för stort värde på spänningsfallet, eller för litet på inspänningen.'
                a = float(raw_input('Inspänning i volt: '))
                b = float(raw_input('Önskat spänningsfall över lysdioden: '))
                break
            except ValueError:
                print 'Du har inte angett ett giltigt värde, endast tal kan anges. Försök igen.'
    else:
        li.append(a)
        li.append(b)
        return li

# Definiera en funktion som jämför och tar fram ett motstånd ur standard serien
def FixedValue(Mot1, E12):
    i = 0
    while i < len(E12):
        if E12[i] < Mot1:
            i += 1
        else:
            return E12[i]
    
# Definiera en funktion som ger svaret i ohm, K-ohm eller M-ohm
def Kohm(Mot2):
    i = 0
    if Mot2 >= 10 and Mot2 <=999:
        print 'Vi väljer ett motstånd ur E12 serien på ', Mot2, 'Ohm.'
    elif Mot2 >= 1000 and Mot2 <= 9999:
        print 'Vi väljer ett mostånd ur E12 serien på ', Mot2 / 1000.0, 'Kohm.'
    elif Mot2 >= 10000 and Mot2 <= 99999:
        print 'Vi väljer ett mostånd ur E12 serien på ', Mot2 / 10000.0, 'Kohm.'
    elif Mot2 >= 100000 and Mot2 <= 999999:
        print 'Vi väljer ett mostånd ur E12 serien på ', Mot2 / 10000.0, 'Kohm.'
    elif Mot2 >= 1000000 and Mot2 <= 9999999:
        print 'Vi väljer ett mostånd ur E12 serien på ', Mot2 / 10000.0, 'Kohm.'
    else:
        print 'Vi väljer ett mostånd ur E12 serien på ', Mot2 / 1000000.0, 'Mohm.'


####################################################################################################
# Huvudprogram
####################################################################################################
Mot1 = UserInput()
Mot2 = FixedValue(Mot1, E12)
Kohm(Mot2)
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

Re: Kod optimering/förbättring :)

Inlägg av Lars »

I CompVolt() så kan du köra return [a, b] istället, det blir både kortare och tydligare. Du kan t.o.m. använda en tuppel istället för en lista, return (a, b). Men jag vet inte om man vinner något på det.

FixedValue() kan implementeras på en rad:

Kod: Markera allt

def FixedValue(Mot1, E12):
   return [x for x in E12 if x >= Mot1][0]
Fast det blir väl mest väldigt otydligt :) Både min och din variant saknar felhantering för fallet när Mot1 är större än största värdet i E12. En lite snyggare variant ser ut så här:

Kod: Markera allt

def FixedValue(Mot1, E12):
   for x in E12:
      if x >= Mot1:
         return x
   print "ERROR"
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

Re: Kod optimering/förbättring :)

Inlägg av ZerQ »

Tjopps

Jag städade lite i koden och följde ditt tips i FixedValue funktionen. Vart mycket bättre kod på det viset. Tackar för det.
Lika med CompVolt funktionen, den gjorde jag också om så det följer ditt exempel visste faktiskt inte att man kunde returnera en lista på det viset.

Rotade fram mer om det på nätet så nu sitter den biten bättre också. :)

Skall börja med att flytta ut felhanterings delen ur både CompVolt och UserInput funktionerna till en egen fel-funktion. Känns lite onödigt att ha samma kod i princip på 2 ställen, bättre att ha det samlat i 1 funktion.
Skriv svar

Återgå till "Programmering och webbdesign"