Gå til innhold

[Python] Kan denne koden forkortes


Gjest Slettet+6132

Anbefalte innlegg

Gjest Slettet+6132


 

import datetime
mone = ['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desmeber']
moneint = [1,2,3,4,5,6,7,8,9,10,11,12]
def run():
x=0 ; sjekk=False ; month = datetime.datetime.now().month
while True:
if x == 12:
break
else:
if sjekk == False:
if moneint[x] == month:
print mone[x] + " <-- "
x=x+1 ; sjekk=True
else:
print mone[x] ; x=x+1
else:
print mone[x]
x=x+1
x = raw_input("")
run()

run()
Endret av Slettet+6132
Lenke til kommentar
Videoannonse
Annonse

Eit forslag:

import datetime
mone = ['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desmeber']
def run():
   month = datetime.datetime.now().month
   for m,mon in enumerate(mone):
    if m+1 == month:
	    print mon + "			   <-- "
    else:
	    print mon  
run()

Endret av Torbjørn T.
  • Liker 1
Lenke til kommentar
Gjest Slettet+6132

Eit forslag:

import datetime
mone = ['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desmeber']
def run():
	 month = datetime.datetime.now().month
	 for m,mon in enumerate(mone):
		 if m+1 == month:
			 print mon + "			   <-- "
		 else:
			 print mon  
run()

 

 

Takk!

Lenke til kommentar

Ja, her kan du gjøre ting mye enklere. Kodestilen din her ligner mer på hvordan man gjør ting i C/C++ eller Java. Python har syntaks og funksjoner som lar deg iterere over lister på en mye enklere måte enn å måtte indeksere manuelt (som man ville gjort med en array).

 

Koden din kan f.eks. gjøres slik:

 

edit: for sein ja :/. se koden til Torbjørn T. ovenfor.

Endret av Jaffe
Lenke til kommentar

Beste måten er vel slik:

import datetime

months = ['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desember']
months[datetime.datetime.now().month-1] += '			   <-- '
print '\n'.join(months)

Men hvis du vil løse det med bare to linjer:

import datetime
print '\n'.join([m if i != datetime.datetime.now().month-1 else m+'			   <-- ' for i, m in enumerate(['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desember'])])

  • Liker 1
Lenke til kommentar
Gjest Slettet+6132

Må bare spør i det samme; Har dere noen spesielle tutorials på nettet dere vil anbefale?

Endret av Slettet+6132
Lenke til kommentar

Ett tips i tilfeller hvor du trenger både nummer og element, da er enumerate() flott:

 

...

from datetime import datetime
months = ['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desember']
this_mnt = datetime.now().month
data = [m + '\t\t<===' if i==this_mnt-1 else m for i,m in enumerate(months)]
print '\n'.join(data)

 

Akkurat samme greia bare forenklet / lettere å lese for de som ikke er så vandt med python:

from datetime import datetime
months = ['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desember']
this_mnt = datetime.now().month

for i,month in enumerate(months):
   print (month if i!=this_mnt-1 else month + ' \t\t<===')

 

.......

Om norsk månedsnavn ikke er nødvendig så kan du gjøre slik (2 linjer, ca 180 tegn):

from datetime import (datetime,date)
print ('\n'.join([m if (m!=datetime.now().strftime("%B")) else (m+'\t\t<===') for m in (date(2000,j,1).strftime('%B') for j in range(1,13))]))

 

.......

Klarte du å skrive den koden i førstepost (helt selv), så tror jeg ikke tutorials er noe for deg lengre, da er det bare å vende deg til Python syntaksen/stilen. Alle tutorials jeg har sett tar deg bare frem til det punktet du er på nå, og ikke lengre... Kanskje du har flaks å finner noen stilguider for Python...

Endret av warpie
Lenke til kommentar

Hvorfor kaller dere now().month for HVER iterasjon? Det er heller ingen grunn til å generere tupler for å sammenligne.

Be my guest... :)

 

han ba om kort kode, vi ga han det. kun snakk om 12 iterasjoner.. det skader ikke, er liten grunn til å optimalisere ved å lage en variabel for now().month. Jeg endret dette uansett i min siste endring, da for å skape litt oversikt.

Endret av warpie
Lenke til kommentar

Liten grunn? Du sparer 12 funksjonskall på 12 iterasjoner. Det er ganske mye grunn, selv om eksempelet er trivielt. Det er verken mye tydeligere eller spesielt mer elegant å gjøre kallet inne i loopen.

Skal vi gjøre noe annet (mer kompleks) en det så er det nødvendig å unngå dyre funksjonskall... Hadde antall iterasjoner økt en del, eller at denne loopen skal itereres over, så er det også en sak. Men dette er virkelig ikke en situasjon hvor det trenger å bli tatt hensyn til.

Å gjøre koden mer elegant er en annen sak, men det var ikke temaet.

 

Jeg er absolutt enig i tankegangen, men ikke i akkurat denne ENKLE sammenhengen.

Endret av warpie
Lenke til kommentar

Et par kommentarer enumerate('', 1) kan ta argument om start,da slipper man og gjøre ting som month+1 og kun bruke month.

mon + "				   <-- 
 

Korte ned og bruke "string formatting" ser bredere ut,da er ny type anbefalt '{}'.format().

Torbjørn sin kode er grei,kan forandre kode med forslag over.

import datetime

mone = ['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desmeber']
month = datetime.datetime.now().month
for index,mon in enumerate(mone, 1):
if index == month:
	print '{:15}<--'.format(mon)
print mon
 

 

Tull og tøys,men her en linje :ph34r:

print '\n'.join('{:15}<--'.format(m) if i == __import__("datetime").datetime.now().month\
else m for i,m in enumerate(['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desember'],1))
 

 

Med ."diskusjon.no" sin ikke fungerende indentering og skrevet mer i C/C++ /Java stil ble det ikke så pent dette ;)

Raymond Hettinger hadde en bra video(PyCon US 2013) om kode stil i Python,kan være vært og se på.

Transforming Code into Beautiful, Idiomatic Python

Endret av Øystein
Lenke til kommentar

Tull og tøys,men her en linje :ph34r:

print '\n'.join('{:15}<--'.format(m) if i == __import__("datetime").datetime.now().month\
else m for i,m in enumerate(['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desember'],1))

Tell me you just didn't do that! Det der vare bare skittent...

Endret av warpie
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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...