And.rs Skrevet 24. november 2012 Del Skrevet 24. november 2012 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
Lycantrophe Skrevet 24. november 2012 Del Skrevet 24. november 2012 Det står jo i feilmeldingen: du kan ikke summer int og None. Python er sterkt typet. Tips: Bruk så du får med indentering. Lenke til kommentar
dabear Skrevet 24. november 2012 Del Skrevet 24. november 2012 (endret) Hvorfor gjøre det så vanskelig? >>> y1 = datetime.date(2012,2,1) >>> y2 = datetime.date(2013,1,1) >>> d = y2-y1 >>> d datetime.timedelta(335) >>> d.days 335 Endret 24. november 2012 av dabear Lenke til kommentar
Foxboron Skrevet 24. november 2012 Del Skrevet 24. november 2012 Hvorfor gjøre det så vanskelig? >>> y1 = datetime.date(2012,2,1) >>> y2 = datetime.date(2013,1,1) >>> d = y2-y1 >>> d datetime.timedelta(335) >>> d.days 335 Kanskje fordi det er en skole oppgave med restriksjoner? Lenke til kommentar
Lycantrophe Skrevet 24. november 2012 Del Skrevet 24. november 2012 (endret) Selv da er det håpløst. Forståelig om han er ny, men allikevel. Endret 24. november 2012 av Lycantrophe Lenke til kommentar
And.rs Skrevet 24. november 2012 Forfatter Del Skrevet 24. november 2012 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
Lycantrophe Skrevet 24. november 2012 Del Skrevet 24. november 2012 (endret) 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 24. november 2012 av Lycantrophe Lenke til kommentar
snippsat Skrevet 24. november 2012 Del Skrevet 24. november 2012 (endret) 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 24. november 2012 av SNIPPSAT Lenke til kommentar
Lycantrophe Skrevet 24. november 2012 Del Skrevet 24. november 2012 (endret) 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 24. november 2012 av Lycantrophe Lenke til kommentar
snippsat Skrevet 25. november 2012 Del Skrevet 25. november 2012 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
Lycantrophe Skrevet 25. november 2012 Del Skrevet 25. november 2012 (endret) 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 25. november 2012 av Lycantrophe Lenke til kommentar
Terrasque Skrevet 22. desember 2012 Del Skrevet 22. desember 2012 (endret) 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 22. desember 2012 av Terrasque Lenke til kommentar
mannen_fra_england Skrevet 26. desember 2012 Del Skrevet 26. desember 2012 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå