Strängar — och början till ett ”riktigt” program

En sträng är en rad av tecken, som du kan behandla i datorn. Ska du tilldela en variabel ett strängvärde så skriver du värdet inom ”fnuttar”.

saol

Strängar, strängar, strängar

 >>> a = 'abcd'
 >>> print a
 abcd

Du kan peka ut delar av strängen med index eller slicing ungefär som du kan peka ut delar av en lista.

 >>> print a[2]
 c
 >>> print a[2:3]
 c
 >>> print a[2:4]
 cd
 >>>
 len(a) 4

Du kan till och med addera och multiplicera strängar:

 >>> print 'The knights who said ' + 'Ni'
 The knights who said Ni
 >>> print 'Ni' * 3
 NiNiNi

Det finns en speciell stringmodul som innehåller lite mer finesser:

 >>> from string import *
 >>> print upper(a) ABCD
 >>> b = upper(a)
 >>> print b
 ABCD
 >>> print lower(b)
 abcd

Alla tecken har  ett siffervärde enligt ASCII-koden och du kan omvandla fram och tillbaka mellan siffervärdet och tecknet:

 >>> print chr(65)
 A
 >>> print ord('A')
 65
 >>>

Programexempel

Okej, jag tänkte vi skulle göra ett litet program som avgör om ett ord är ett palindrom. Det är sådana ord som ‘OTTO’ och meningen ‘NITALARBRALATIN’ det vill säga ord eller meningar som är, likadana om man vänder dem bakofram. Om vi förutsätter att vi redan har en funktion som heter bakofram() och som kan vända en sträng bakofram är det ganska enkelt:

is_palindrom()

 def is_palindrom(strng):
     return strng == bakofram(strng)

Det enda udda med den funktionen är att den returnerar ett ”sanningsvärde” , det vill säga true eller false. Egentligen är det inte mer udda än något annat, bara det att vi inte har gjort så förut…

Det är också lite fräckt att så där bara ”utgå ifrån” att funktionen bakofram() finns, fast jag inte har skrivit den och fast jag gissar att den inte finns färdig någon annanstans, men det får man göra, bara man skriver den sedan…

bakofram()

Men nu har vi alltså ingen funktion som heter bakofram(), så den får vi skriva också. Man skulle ju kunna bygga in det i palindromfunktionen, men då rör man ihop två olika saker och det är dumt. Tänk om man senare behöver något som vänder ett ord bakofram, då har man ju grötat ihop det med palindrom(). Dessutom är det lättare att testa och avlusa två separata funktioner.

Okej, en sträng bakofram börjar ju med det sista tecknet och fortsätter sedan med resten av strängen bakofram. Lite som att vränga en strumpa ut och in.

Är du med hur jag tänker? Jag tänker vända strängen med en rekursion bara för att jag tycker att det är så himla vackert!

 def bakofram(string):
     if string == '':
         return ''
     else:
         length = len(string)
         return string[length] + bakofram(string[0 : length])

Om du får kalla kårar av den här funktionen så kan du säkert skriva en egen med en while-loop, och den blir kanske till och med elegantare och effektivare vad vet jag?

Vi sätter ihop det till ett litet testprogram:

#!/usr/bin/python
def is_palindrom(strng):
     return strng == bakofram(strng)

def bakofram(string):
     if string == '':
         return ''
     else:
         length = len(string)
         return string[length] + bakofram(string[0 : length])

namn = 'rajnA nabrU vA'
print bakofram(namn)
print is_palindrom(namn)
print is_palindrom('nitalarbralatin')

Observera att testprogrammet här baserar sig på färdigskrivna teststrängar som jag ”hårdkodat” in i programmet, eftersom jag ännu inte har hittat på något sätt att mata in data, men det löser sig säkert…

Man varken kan, vill eller bör lösa alla problem på en gång. Steg för steg blir ditt program bättre och mer generellt användbart. Gapa inte över för mycket!

I nästa avsnitt gör vi om det här till något som närmar sig ett riktigt och användbart program. Kanske kan du impa på din svenskalärare genom att leta upp palindromen i Strindbergs texter? Öva ordentligt till dess.