SharedSage genom exempel / Iteration.sagewsOpen in CoCalc
Author: Robert Nyqvist

Iteration

Ibland behöver man upprepa exekveringen av t.ex. en beräkning. Med while upprepas koden som hör till while-satsen så länge ett logiskt uttryck är sant. Den kod som ingår i while-satsen ska skrivas med indrag.
k = 1 while k < 5 : print 'k =', k k = k + 1 print u'Ingår inte i while-satsen'
k = 1 k = 2 k = 3 k = 4 Ingår inte i while-satsen
Om det logiska uttrycket är falskt redan från början kommer inte koden i while-satsen att exekveras.
k = 10 while k < 5 : print 'k =', k k = k + 1 print u'Ingår inte i while-satsen'
Ingår inte i while-satsen
Nästlade iterationer är möjligt. Tänk på att man i koden markerar med olika storlek på indragen till vilken iteration koden ingår. I koden nedan utnyttjar vi att om man multiplicerar en textsträng med ett positivt heltal nn så konkatenerar Sage nn kopior av textsträngen.
a = 1 while a <= 5 : b = a while b <= 5 : b = b + 1 print 'a' * a, 'b' * b a = a + 1
a bb a bbb a bbbb a bbbbb a bbbbbb aa bbb aa bbbb aa bbbbb aa bbbbbb aaa bbbb aaa bbbbb aaa bbbbbb aaaa bbbbb aaaa bbbbbb aaaaa bbbbbb
Med break kan vi avbryta en iteration.
a = 1 while a <= 5 : b = a - 1 while b <= 5 : b = b + 1 if is_prime(b) : break # avrbyt iterationen (gå ut till den yttre iterationen) print 'a' * a, 'b' * b a = a + 1
a b aaaa bbbb
Med continue hoppar man över resten av aktuellt iterationssteg.
a = 1 while a <= 5 : b = a - 1 while b <= 5 : b = b + 1 if is_prime(b) : continue print 'a' * a, 'b' * b a = a + 1
a b a bbbb a bbbbbb aa bbbb aa bbbbbb aaa bbbb aaa bbbbbb aaaa bbbb aaaa bbbbbb aaaaa bbbbbb
Då det i förväg är givet hur många iterationer man vill utföra kan man använda kommandot for istället.
for k in [1, 4, 0, -10, 'Sage'] : print 'k =', k
k = 1 k = 4 k = 0 k = -10 k = Sage
for k in [-2..2] : print 'k =', k
k = -2 k = -1 k = 0 k = 1 k = 2
for k in range(10) : print 'k =', k
k = 0 k = 1 k = 2 k = 3 k = 4 k = 5 k = 6 k = 7 k = 8 k = 9
for t in 'CoCalc' : print t.upper()
C O C A L C
För större listor bör man använda xrange, som är lik range men som är anpassad att vara snabbare och mer minneseffektiv vid iterationer.
S = 0 for k in xrange(100000) : S = S + k S
4999950000
Det går bra att itererar över en ordlista.
udda = {1:'ett', 3:'tre', 5:'fem', 7:'sju', 9:'nio'} for k in udda.keys() : print k
1 3 9 5 7
for v in udda.values() : print v
ett tre nio fem sju
for k, v in udda.iteritems() : print 'k =', k, ', v =', v
k = 1 , v = ett k = 3 , v = tre k = 9 , v = nio k = 5 , v = fem k = 7 , v = sju
Även for-satser går att nästla och avbryta med break eller continue.