Gå til innhold

[Python] Kan denne koden forkortes


Gjest Slettet+6132

Anbefalte innlegg

Gjest Slettet+6132
Skrevet (endret)


 

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
Videoannonse
Annonse
Skrevet (endret)

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
Gjest Slettet+6132
Skrevet

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!

Skrevet (endret)

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
Skrevet

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
Skrevet

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)

Pass på at denne ødelegger listen din.

Gjest Slettet+6132
Skrevet (endret)

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

Endret av Slettet+6132
Skrevet (endret)

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
Skrevet (endret)

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
Skrevet

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.

  • Liker 2
Skrevet (endret)

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
Skrevet (endret)

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
Skrevet (endret)

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
Skrevet (endret)

Nåja, det er ganske lett å se hva som skjer. :------)

:rofl:

DIRTY.

 

 

- God natt!

Endret av warpie

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...