Gå til innhold

Trenger hjelp ang en feilmelding? (Python nybegynner)


Anbefalte innlegg

Har foreløpig skrevet dette for en kode som skal telle antall dager mellom to datoer (inkl skuddår):

 

daysOfMonths = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def Choosemonth(month):

if month == 1:

return daysOfMonths[0]

if month == 2:

return daysOfMonths[1]

if month == 3:

return daysOfMonths[2]

if month == 4:

return daysOfMonths[3]

if month == 5:

return daysOfMonths[4]

if month == 6:

return daysOfMonths[5]

if month == 7:

return daysOfMonths[6]

if month == 8:

return daysOfMonths[7]

if month == 9:

return daysOfMonths[8]

if month == 10:

return daysOfMonths[9]

if month == 11:

return daysOfMonths[10]

if month == 12:

return daysOfMonths[11]

 

 

def leap_year(yearX):

sumYear = 0

if yearX % 400 == 0:

sumYear = sumYear + 1

if yearX % 100 == 0:

sumYear = sumYear

if yearX % 4 == 0:

sumYear = sumYear + 1

else:

sumYear = sumYear

yearX = yearX + 1

return sumYear

 

def days(year1, month1, day1, year2, month2, day2):

countDays = 0

month = 0

n = 0

while year1 < year2:

leap = leap_year(year1)

month = Choosemonth(month1 + n)

if leap == 1:

if month == 28:

month = month + 1

countDays = countDays + month

n = n + 1

if n > 11:

n = 0

year1 = year1 + 1

month = 0

return countDays

 

print (days(2012,2,1,2013,1,1))

 

Men jeg får denne feilmeldingen så fort jeg endrer "month1" i input til over verdien 1. Dvs om jeg vil sjekke antall dager mellom januar og januar fungerer det fint. Men sett at jeg endrer til f. eks februar til januar dukker denne opp:

 

Traceback (most recent call last):

File "C:/Users/André/Desktop/Python/DaysOld.py", line 64, in <module>

print (days(2012,2,1,2013,1,1))

File "C:/Users/André/Desktop/Python/DaysOld.py", line 55, in days

countDays = countDays + month

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

 

 

Jeg er ikke ferdig med koden (tar f. eks ikke høyde for dager osv enda). Men synes det merkelig at det ikke skal gå. Trenger derfor en input på hva jeg kan forandre.

 

Obs! Skriver dette i litt hast så om det e behov for en bedre forklarting av koden kan jeg legge til det i morgen...

Lenke til kommentar
Videoannonse
Annonse

Stemmer at det er en oppgave med restriksjoner. Jeg vet det finnes funksjoner for dette men skal som sagt løse oppg uten disse. Jeg er på min andre mnd med Python hvor jeg prøver å lære koding ved siden av en fulltidsjobb. Fint om du utdyper hva du mener med håpløst. Spør om noe jeg lurer på og er helt ærlig ikke interessert i noe annet enn et svar relatert til det.

Lenke til kommentar

Vel, redundans for noe. For eksempel choosemonth:

 

def choosemonth( month ):
if month == 2: return 28
elif month < 8 and month % 2 == 1: return 31
elif month > 7 and month % 2 == 0: return 31
elif month < 13: return 30
else: return -1

Der -1 indikerer error.

 

Alternativt en som bruker samme logikk som din:

 

def choosemonth( month ):
   longs = [ 1, 3, 5, 7, 8, 10, 12 ]
   shorts = [ 2, 4, 6, 9, 11 ]

   if month == 2: return 28
   elif month in longs: return 31
   elif month in shorts: return 30
   else: return -1

Endret av Lycantrophe
Lenke til kommentar

Bruk print som hjelp,kan være til mye hjelp når du er ny.

print countDays,month # ? ?

Denne setter du inn i linjen før feilen.

 

Tippe:

>>> 0 + None
Traceback (most recent call last):
 File "<interactive input>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

 

Du vet hvordan en if blokk virker?

Viss "leap" alt annet enn "== 1",hva gjør if blokken.

 

Ser du har fått et par bra forslag @Lycantrophe

Her et til som bruker listen du har laget.

def choose_month(month):  
  for index,last_day in enumerate(daysOfMonths, 1):
      if month == index:
          return last_day

 

Ved feil verdi vil denne funksjonen returnerer None,eller kan du som@Lycantrophe gjør legg til så den returnerer -1.

 

Ohh hater

 tag system her på HW.
Endret av SNIPPSAT
Lenke til kommentar

Kan føye til at grunnen til at jeg bruker -1 i stedet for None er at -1 også er en int, så det vil ikke produsere samme feil som du fikk fra før (None + int). Dette er egentlig ikke positivt, da, om du gir programmet feil input bør det crash & burn, ikke feile i stillhet.

 

Du må uansett sjekke for riktig input.

Endret av Lycantrophe
Lenke til kommentar
Kan føye til at grunnen til at jeg bruker -1 i stedet for None er at -1 også er en int, så det vil ikke produsere samme feil som du fikk fra før (None + int). Dette er egentlig ikke positivt, da, om du gir programmet feil input bør det crash & burn, ikke feile i stillhet.

Nå gir den forklaring mer menig viss Python var et statisk skrevet språk der man må sørge for at alle returverdier er i samsvar med funksjonens type.

I et dynamisk språk.språk som Python er dette litt valgfritt.

 

produsere samme feil som du fikk fra før (None + int)

Nå er det vel dokumentert at None er verdien som blir returnert når en funksjon slutter uten en eksplisitt return verdi.

Da kan man fange det greit opp med if choose_month(val) is None:

 

Du må uansett sjekke for riktig input.

Ja og dette gjelder uavhengig av hva returen verdi til funksjonen er.

Lenke til kommentar

Nå gir den forklaring mer menig viss Python var et statisk skrevet språk der man må sørge for at alle returverdier er i samsvar med funksjonens type.

I et dynamisk språk.språk som Python er dette litt valgfritt.

Ja, men han kan ikke bare += med en None (som var grunnen til at han lagde denne tråden). Poenger er uansett at det må sjekkes for gyldig returverdi.

Nå er det vel dokumentert at None er verdien som blir returnert når en funksjon slutter uten en eksplisitt return verdi.

Da kan man fange det greit opp med if choose_month(val) is None:

Det er jeg enig i, men da foretrekker jeg en eksplisitt return på siste else. Enda enklere er faktisk if choosemonth( val ): /* something */

 

Alternativt håndter slike feil på en egen linje (days = choosemonth( val ); if not days: exit) slik at man slipper å få en ekstra indentering på hele resten av programmet sitt. Det er dårlig stil.

Endret av Lycantrophe
Lenke til kommentar
  • 4 uker senere...

Et lite eksempel på ting som kan gjøres annerledes (og fremdeles bruke nøyaktig samme logikk):

daysOfMonths = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

def Choosemonth(month):
 return daysOfMonths[month - 1] # Bonus : implicit value + range check. Vil raise en error ved feil input

 

Men, post koden med indentering, er nesten umulig å lese. "days" funksjonen klarer jeg ikke engang å pusle sammen. På de måtene jeg får den sydd sammen, så virker det som den har noen seriøse logiske brister. Men vanskelig å si. Gjetter på at du sender month > 12 inn til Choosemonth og derfor får None tilbake.

 

Men, når du kommer og spør hvordan du skal stoppe badekaret å ta inn vann når du krysser atlanteren, så vil nok de fleste prøve å fortelle deg at du kanskje bør prøve en annen tilnærming. Og dabear's løsning er absolutt den riktige. Bruk det som er der, det tar garantert hensyn til mer enn din kode, og har blitt testet av MANGE folk over flere år. Bruk heller tiden til å skape nye ting :)

 

Edit : Bruk exceptions for feil, forresten :)

Endret av Terrasque
Lenke til kommentar
def dager(date):
   (y,m,d) = date
   if y % 4 == 0:
    # feb skal fa 29 dager
    xs = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
   else:
    xs = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
   før    = sum(xs[:m-1]) + d # + (d-1) hvis du trenger ikke dette dag
   etter  = sum(xs[m:]) + (xs[m-1] - d)
   return (før,etter)


def mellom(dateA,dateB):
   (_,etter) = dager(dateA)
   (før,_) = dager(dateB)
   return etter + før


mellom((2012,2,1),(2013,1,1))

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å
×
×
  • Opprett ny...