Gå til innhold

Python - http://learnpythonthehardway.org - % (Modular arithmetic)


Anbefalte innlegg

Jeg har begynt på denne learnpythonthehardway og sliter litt med å forstå meningen med %(modulen?).

 

I oppgave 3 får vi blant annet denne:

 

print "Roosters", 100 - 25 * 3 % 4

 

Dette blir jo gjort om til 100 - ((25 * 3) % 4). Men etter hva jeg forstår så er ikke dette prosent men en form for modul. Altså med den modulen så forteller man at man bare skal telle til 4 før man begynner igjen på 1:

 

A familiar use of modular arithmetic is in the 12-hour clock, in which the day is divided into two 12-hour periods. If the time is 7:00 now, then 8 hours later it will be 3:00. Usual addition would suggest that the later time should be 7 + 8 = 15, but this is not the answer because clock time "wraps around" every 12 hours; in 12-hour time, there is no "15 o'clock". Likewise, if the clock starts at 12:00 (noon) and 21 hours elapse, then the time will be 9:00 the next day, rather than 33:00. Since the hour number starts over after it reaches 12, this is arithmetic modulo 12. 12 is congruent not only to 12 itself, but also to 0, so the time called "12:00" could also be called "0:00", since 0 ≡ 12 mod 12.

 

Men jeg skjønner liksom ikke hva som er hensikten med den i Python?

Lenke til kommentar
Videoannonse
Annonse

Jeg har begynt på denne learnpythonthehardway og sliter litt med å forstå meningen med %(modulen?).

 

I oppgave 3 får vi blant annet denne:

 

print "Roosters", 100 - 25 * 3 % 4

 

Dette blir jo gjort om til 100 - ((25 * 3) % 4). Men etter hva jeg forstår så er ikke dette prosent men en form for modul. Altså med den modulen så forteller man at man bare skal telle til 4 før man begynner igjen på 1:

 

A familiar use of modular arithmetic is in the 12-hour clock, in which the day is divided into two 12-hour periods. If the time is 7:00 now, then 8 hours later it will be 3:00. Usual addition would suggest that the later time should be 7 + 8 = 15, but this is not the answer because clock time "wraps around" every 12 hours; in 12-hour time, there is no "15 o'clock". Likewise, if the clock starts at 12:00 (noon) and 21 hours elapse, then the time will be 9:00 the next day, rather than 33:00. Since the hour number starts over after it reaches 12, this is arithmetic modulo 12. 12 is congruent not only to 12 itself, but also to 0, so the time called "12:00" could also be called "0:00", since 0 ≡ 12 mod 12.

 

Men jeg skjønner liksom ikke hva som er hensikten med den i Python?

 

Modulo er rest etter divisjon.

Lenke til kommentar
Gjest Slettet+9871234

Men jeg skjønner liksom ikke hva som er hensikten med den i Python?

 

Modulo operatoren finner resten. I ditt eksempel resten modulo 4. Det er uhyre viktig å kjenne operator presedens. Modulo operatoren er en kraftig og effektiv operator ofte brukt i tester og brukes også i nesten alle andre språk.

Lenke til kommentar

Og for å forklare hva vi mener med rest, bare sånn i tilfelle:

 

7 / 3 = 2

7 - (2*3) = 1, som er det samme som 7 % 3 = 1

 

En av mange små ting det kan brukes til:

for i in range(1000):
 if i % 10 == 0:
print "Herjer med %d" % (i,)
 tregFunksjon(i)

 

Det vil skrive ut en teller hver gang i er delelig på 10 - altså hver tiende iterasjon.

En annen ting det kan brukes til er hvis du vil gjøre noe f.eks. annenhver gang:

 


farger = ["white", "grey"]
linjenr=1
for linje in tekst:
 farge = farger[linjenr % 2]
 print "<tr style='background-color: %s'><td><tt>%d</tt><td>%s</tr>" % (farge, linjenr, linje)
 linjenr += 1

Endret av Djn
Lenke til kommentar

Modulo har et stort bruksområde innen programmering, dette vil du møte på så fort du har lært deg språket og begynner å kjøre en del loops.

Se for deg en loop som skal kjøre en form for spørring, eller gjøre en annen oppgave for hver tredje runde. Da bruker jeg modulo: if i%3==0: compute()

- Alt som kan deles med 3 vil nå utføres: 0%3 = 3%3= 6%3 = 9%3 == 0

 

 

A familiar use of modular arithmetic is in the 12-hour clock, in which the day is divided into two 12-hour periods...

 

Blir vel noe slik han mener (forenklet for å spare tid):

class Timer:
def __init__(self, itr=48):
	self._run(itr)

def _run(self, itr):
	i = r = 0
	for x in range(itr):
		if r%2==0: set="am"
		else: set="pm"
		i=i+1

		time = str(i)+" "+set

		#jukser litt (no more time)
		if time == "12 pm": print "12 am"
		elif time == "12 am": print "12 pm"
		else: print time

		if i%12==0:
			i=0
			r=r+1
			print "-------------"
if __name__ == '__main__':
Timer(48) #iterations

 

Kjør koden så ser du hvordan modulo er fin å bruke (ps, indentation er feil grunnet diskusjon.no sin forferdelige kode-box).

 

Smådårlig kode som viser deg hva som må bli gjort for 12-timers klokke.

Endret av warpie
Lenke til kommentar

Ja, jeg har skjønt at jeg vil komme mer borti det etterhvert, så jeg har lagt det litt på hylla inntil videre. Vil absolutt anbefale denne boka, har kommet til ex5 og driver nå å "programmerer" en converter, hehe..

 

# convert from lbs to kg
value_in_lbs = 189
pound_in_kg = 0.45359237
convert = value_in_lbs * pound_in_kg
# the long way
print "%r in lbs is %f in kg." % (value_in_lbs, value_in_lbs * pound_in_kg)
# the short way
print "%r in lbs is %f in kg." % (value_in_lbs, convert)

Lenke til kommentar

Det er mange bra guider der ute, men om en ikke eksprimenterer, og utfordrer seg selv så sitter det bare i kjeldene tilfeller. Det å følge en mal uten å slippe seg fri er ingen god måte å lære på. (Sier vel bare at en guide er hva en gjør den til).

 

Finpusset litt på omformeren din! :)

converter.py

# -*- coding: utf-8 -*-
import sys

class Convert:
def __init__(self, weight, unit):
	self._convert(weight, unit)


def _convert(self, weight, unit):
		  #KG  - lbs  -  N
	kg = [1, 2.20462262, 9.80665]
	lbs= [0.45359237, 1, 4.44822162]
	N  = [0.101971621, 0.224808943, 1]

	forms = [kg, lbs, N]
	names = ["kilograms", "pounds", "newtons"]
	short = ["kg", "lbs", "N"]

	#Finne enheten som er valgt å regne fra
	i = short.index(unit)
	current = forms[i]

	for x in range(len(forms)):
		#konverter til:
		convTo = current[x]
		value = weight * convTo
		print "%d %s = %r in %s" % (weight, short[i], round(value,3), names[x])

if __name__ == '__main__':
	Convert(int(sys.argv[1]), sys.argv[2]) #kg, lbs or N

Har forsøkt å hardkode minst mulig, skal være lett å legge til enda en måleenhet nå.

 

For å kjøre så skriver du vekt, og en enhet: kg, lbs eller N

>>> python converter.py 60 kg
60 kg = 60 in kilograms
60 kg = 132.227 in pounds
60 kg = 588.399 in newtons

 

Selv om newton ikke er en masse-enhet, så trengte jeg enda en enhet å bruke for å gjøre eksempelet komplett. Ikke ork å kommenter det :p

Endret av warpie
Lenke til kommentar

@warpie: Hvorfor bruker du en class i eksemplene dine, hvorfor ikke bare en vanlig funksjon?

Har inget spesielt grunnlag for å bruke klasse. Er en vane, fint å klassifisere i tilfeller hvor det er (lengre) script med flere (sammenhengende) funksjoner. 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å
×
×
  • Opprett ny...