tisdag 2 oktober 2012

Strängar

Variabeltypen string används för att lagra och manipulera text och textliknande teckenföljder.

En sträng anges omgiven av "-tecken eller '-tecken:
a="Hej!"
b='Hej!'

Speciella tecken

Tecknet \ ("backslash") är en så kallad escape character som används för att skriva tecken som annars skulle vålla problem då de krockar med hur koden normalt läses av programmet ex:
\"     ett "-tecken inuti en sträng omgiven av "-tecken
\'      ett '-tecken inuti en sträng omgiven av '-tecken
\n    ny rad
\t     tabulering

Hur skrivs då \  i en sträng? Jo som \\

Övning 1.23
Använd det interaktiva skalet och testa följande:
a) print("C:\\kalle\\Python")
b) print("Lars kallas \"Lasse\"")
c) print("Kalle\t200\nLisa\t1200")

Långa rader i koden

Det är  rekommenderat att ha radlängder på max 79 tecken i koden för att förenkla för den som ska läsa och klara alla editorer. Därför kan det finnas behov av att dela upp en sats eller en sträng i flera rader.
  • För uttryck som inte är strängar och som omges av (), [] eller {} görs radbyte genom ENTER
  • För att byta rad i strängar eller uttryck utan omgivande parenteser används \
Övning 1.24
Testa exemplet:

lang_text="Detta är en låg text så jag byter \
rad i koden trots att det är en rad utskriven."
print(lang_text)
print()
print( "Och nu blev den ännu längre: " +
       lang_text + " Så den inte får plats på en rad")

Manipulera strängar

Strängar (eng. strings) kan ses som en rad tecken efter varandra. I Python är tecknen numrerade från noll och uppåt till sista tecknet. Positionen för ett tecken kallas index. Sista tecknet i en sträng har index som är 1 mindre än strängens längd.

Funktionen len(s) ger längden på en sträng.

 För att komma åt delar av en sträng används:
Uttryck Beskrivning
s[i] Returnerar tecknet med index i
s[i:j] Returnerar strängen från och med i till (men ej lika med!) j
s[i:] Returnerar strängen från och med i
s[:i] Returnerar strängen till i
s[-j] Motsvarar s[len(s)-j]. Alltså tecknet j från slutet
s[-j:] Returnerar resten av strängen från och med tecknet j från slutet
s[:-j] Returnerar strängen fram till tecknet j från slutet


Obs! Att använda negativa index som i de tre sista varianterna är en indexering som många språk saknar. Det finns tex. varken i C, C++ eller Java.

Övning 1.25
Skriv och testa nedanstående program.

text="ABCDEFGHIJK"
print(text+"\tLängd="+str(len(text)))
print(text[2])
print(text[len(text)-1])
print(text[2:6])
print(text[2:])
print(text[:6])
print(text[-2])
print(text[-2:])
print(text[:-6])

Concatenering, att lägga ihop strängar

Att lägga strängar efter varandra till en ny längre sträng kallas concatenring (eng. concatenate) och görs med + så som du sett. Det går också att skapa en upprepad sträng med *-tecken.

Övning 1.26
Använd interaktiva skalet och testa följande:
a) print("husvagn"[:3]+"lastbåt"[-3:])
b) print("Ha"*5)

Du kan inte ändra i en sträng

Det går inte att ändra i en sträng, lägga till eller ta bort tecken efter att den skapats. Utan du måste skapa en ny sträng för detta  och tilldela den till den ursprungliga. Ex:

Lägga till sträng t först till s
s=t+s


Lägga till sträng t sist till s
s=s+t

Lägga till t vid index j
s=s[:j]+t+ s[j:]

Ta bort en del av s från och med index i till j
s=s[:i]+s[j:]

Uppgift 8
Skriv ett program som testar ovanstående strängmanipulationer. Välj själv lämpliga strängar för t och s.

Jämförelse av strängar och några bra strängmetoder

Att jämföra strängar i Python påminner om jämförelser mellan tal. Här följer de mest användbara jämförelserna:
Uttryck Beskrivning
s == t Sant om s är exakt lika som t
s != t Sant om något skiljer mellan s och t
s in t Sant om strängen s återfinns någonstans i t
s not in t Sant om strängen s inte återfinns någonstans i t


Notera: Det är skillnad på stora och små bokstäver när jämförelser sker.

Strängar är lite av både fågel och fisk i Python, och flera andra språk. De fungerar som vanliga variabler men de är också objekt. (Vi kommer att tala mycket mer om objekt senare i kursen.)

Så som objekt har strängar metoder som kan användas för att utföra olika åtgärder. För att använda en metod skrivs strängen eller strängvariabeln följt av . och sedan metoden. Ex:
"Hej".lower()
s.lower()
Den övre raden ändrar strängen "Hej" till "hej" den nedre gör motsvarande för innehållet i strängen s.

Följande strängmetoder är ofta användbara:
metod Beskrivning
lower() Returnerar en sträng där alla bokstäver ändrats till gemener
upper() Returnerar en sträng där alla bokstäver ändrats till versaler
find(t)     Returnerar första index då strängen t återfinns. Om ingen hittas returneras -1.
count(t)     Returnera hur många gånger strängen t återfinns.
replace(s, t) Returnerar en sträng där alla förekomster av av strängen s bytts ut mot strängen t
strip() Returnerar en sträng där eventuella mellanslag först eller sist är borttagna
zfill(x); Returnerar en sträng där nollor fyller ut  till vänster om texten tills längden är x. Ex. "23".zfill(4) ger "0023"
format(a, ka) Strängformatering. a och ka är argument som används vid formateringen.

split(t)
Skapar en lista av strängar från den ursprungliga strängen. Uppdelade där strängen t förkommer. Mer om detta senare i kursen.


Överkurs: Detta är endast ett litet urval metoder och varianter på metoder. Läs mer här.

Övning 1.27
Testa följande program

s="IKEA"
t=s.lower()
print("s är: "+ s+"\nt är: "+t)

Notera att s behåller sitt värde "IKEA" .
Ändra programmet så att det byter "IKEA" i s till "ikea" istället för att skapa den nya variabeln t.


Övning 1.28
Ett program som summerar inskrivna tal och avslutas när man skriver n eller N. Skriv och testa.

sum=0

while True :
        try: 
            s=input("Skriv in ett tal. (n för att sluta) ")
            if s == "n" or s == "N": break
            sum=sum+float(s)
        except ValueError:
            print("Felaktig inmatning. Försök igen") 

print("Summan blir:" + str(sum))

Övning 1.29
Skriv ett program som returnerar första ordet ur en inskriven text.

Övning 1.30
Skriv ett program som skriver ut en inmatad sträng enligt nedanstående exempel:
Inmatad text: Hej alla glada
Utskrift:
H
He
Hej
Hej 
Hej a
... osv ...
Hej alla glad
Hej alla glada

Notera: Kontrollera så att programmet klarar strängar med ett tecken och att du inte får tomrad först i utskriften.

Övning 1.31
Skriv ett program som byter ut alla förekomster av hon och han till hen i en inmatad text.

Uppgift 1.8
Skriv ett program som skriver ut varje ord i en inmatad sträng på en egen rad.

Strängformatering

Det finns en mängd möjliga formateringar med hjälp av format-metoden. Vi ska titta på några. Syntaxen för strängformatering visas i följande exempel:

"Här är ett tal {0:0.2f} och här är ett tal {1:0.5e}".format(3454564, 3555564)

Resultatet blir (vilket du kan kontrollera med interaktiva skalet):

Här är ett tal 3454564.00 och här är ett tal 3.55556e+06

Klamrarna {} är platshållare som fylls i med innehållet från parentesen efter format.
Texten i klamrarna är en kod som talar om hur formateringen ska ske. Se nedanstående bild som visar vad de olika delarna betyder:

Notera: koden ovan är inte fullständig. Det finns ytterligare positioner som kan användas. Den täcker dock det viktigaste.
  • Index i formatlistan: Anger vilken position i parentesen, räknat från noll, som innehållet ska hämtas ur. Kan utelämnas. Om det utelämnas hämtas innehållet i ordningen de står i format-parentesen så att första klamern fylls med första innehållet, andra med andra osv.
  • Minimal längd: Anger det minsta antal tecken som innehållet ska ta upp. Om det blir tecken över fylls de med mellanslag. Kan utelämnas.
  • Precision: Anger antal decimaler eller värdesiffror för tal. Kan utelämnas.
  • Formateringstyp: Ytterligare information om formateringen för tal. Se nedanstående tabell för exempel.
Tecken Beskrivning
b För heltal: Binär form
d Heltal: Basen 10
f Flyttal: Bestämt antal decimaler och utan tiopotens
g Flyttal: Automatiskt byte till grundpotes för stora  eller små tal. När g används anger siffran bakom punkten antalet värdesiffror.
e Flyttal: Grundpotensform
x För heltal: Hexadecimal form


Övning 1.32
Använd interaktiva skalet och gör följande:
a) Skriv och testa: "{:6.2f}".format(3.1415)
b) Skriv och testa: "{:10}{:6d}".format("Invånare", 123)
c) Ta reda på vad 2000 blir hexadecimalt respektive binärt.
d) Skriv och testa: "{1}={0:0.3g}".format(12.234, "a")

Uppgift 1.9
Skriv ut ett "kvitto" enligt nedanstående. Decimalpunkterna ska hamna under varandra.

Godis      21.40
Kött      121.30
 ===============
Summa     142.70   

Inga kommentarer:

Skicka en kommentar