TDP002 - Imperativ programmering Strängar och IO Eric Elfving Institutionen för datavetenskap 23 augusti 2016 Översikt 2/18 • Inläsning och utskrift • Typkonvertering och strängformatering • Teckenkodning • Jobba med externa filer Creative Commons 4.0 Inläsning 3/18 • Program som gör beräkningar rätt är bra, program där användaren får styra är ofta bättre. • Därför är det bra att låta användaren mata in data. • I Python finns det "ett" sätt att låta användaren mata in data, input • input ger alltid en sträng som resultat • Till input kan man skicka en sträng som ledtext till användaren Creative Commons 4.0 Inläsning 4/18 input name = input('Mata in ditt namn: ') print("Hej " + name) price = input('Mata in pris: ') price = int(price) products = input('Antal produkter: ') products = int(products) inventory = price * products print('Totalt värde: ' + str(inventory)) Mata in ditt namn: Kalle Hej Kalle Mata in pris: 12 Antal produkter: 3 Totalt värde: 36 Creative Commons 4.0 Typomvandling 5/18 • Funktionerna int och float omvandlar en sträng till ett heltal respektive ett reellt tal • Båda funktionerna kräver att strängen endast innehåller ett numeriskt värde (på rätt format) • På samma sätt kan str omvandla ett värde till en strängrepresentation. Creative Commons 4.0 Utskrift 6/18 • print används oftast för att skriva ut saker på skärmen >>> print(1,2,3) 1 2 3 >>> print(1,2,3, ... sep='x', ... end=' slut !') 1x2x3 slut ! • print kan ta flera värden och skriver ut dem separerade med mellanslag och avslutar med ny rad ('\n') • Om man vill kan detta ändras med sep och end Creative Commons 4.0 Strängformatering 7/18 Funktionen format • print är bra på att skriva ut saker men ibland vill man att det ska se snyggare ut • Då är str.format() bra att ha • Man kan formatera strängar på flera sätt enligt http://docs.python.org/3/library/string.html#formatspec • Här tar vi upp en kortvariant • Liknar printf-språket en del men är väldigt sofistikerat! • Tar formatbeskrivning på formen {namn:format} Creative Commons 4.0 Strängformatering 8/18 name = input('Förnamn: ') surname = input('Efternamn: ') message = 'Hej {n} {s}!'.format(n=name,s=surname) print(message) name = input('Förnamn: ') surname = input('Efternamn: ') message = 'Hej {} {}!'.format(name,surname) print(message) Förnamn: Kalle Efternamn: Nilsson Hej Kalle Nilsson! Creative Commons 4.0 Strängformatering 9/18 Formatering av tal >>> pi = 3.141592 # eller math.pi >>> print('{}'.format(pi)) 3.141592 >>> print('{:.2f}'.format(pi)) 3.14 >>> print('{:06.3f}'.format(pi)) 03.142 Creative Commons 4.0 Strängformatering 10/18 Formatering av tal print('Tabell över tal i olika talbaser\n' + '='*32) print(' Bin Oct Dec Hex') for num in range(17): print('{0:5b}{0:5o}{0:5d}{0:5X}'.format(num)) T a b e l l över t a l i o l i k a t a l b a s e r ================================ B i n Oct Dec Hex 0 0 0 0 1 1 1 1 10 2 2 2 11 3 3 3 100 4 4 4 101 5 5 5 110 6 6 6 111 7 7 7 1000 10 8 8 1001 11 9 9 1010 12 10 A 1011 13 11 B 1100 14 12 C 1101 15 13 D 1110 16 14 E 1111 17 15 F 10000 18 16 10 Creative Commons 4.0 Strängformatering 11/18 Formatering av tal print('Tabell över tal i olika talbaser\n' + '='*32) print(' Bin Oct Dec Hex') formatstr = '' for f in 'bodX': formatstr += '{{0:5{c}}}'.format(c=f) for num in range(17): print(formatstr.format(num)) Creative Commons 4.0 Teckenkodning 12/18 • Teckenkodningen är kopplingen mellan det tecken man ser på skärmen och hur det tecknet lagras i datorns minne. • "Vanliga" tecken såsom de vi har på tangentbordet ryms gott och väl i en byte (det räcker ju till hela 256 tecken). • När webben blev större blev det jobbigare att klara sig med endast 256 tecken. Bara japanerna har över 3000 tecken som de tycker man bör kunna efter grundskolan (I ett av deras skriftspråk). Creative Commons 4.0 Teckenkodning 13/18 Unicode • Unicode en global teckenmängd utan specificerad intern representation. • Sedan version 3 är alla strängar I Python kodade i UTF-8. • UTF-8 är en implementation av unicode som tar olika mycket plats beroende på vilket tecken som lagras. • Om du vill ha ett tecken som inte finns på tangentbordet går det att kopiera från tabeller som finns i http://www.unicode.org/charts/ • I python kan man även använda sig av teckenkoden: '\u00AE' ⇒ ® eller alternativt namnet: '\N{registered sign}' Creative Commons 4.0 Filhantering 14/18 • Ibland får man indata lagrat with open('minfil.txt') as f: for line in f: for word in line.split(): print(word, end='_') print() på en fil • Filer öppnas lättast med with open(...) • Som standard går det endast att läsa från filen Creative Commons 4.0 Filhantering 15/18 Teckenkodning • Vanligtvis öppnar python filer med den teckenkodning som är standard på ditt system • Det kan ändras med encoding-parametern om man vet att filen har en specifik teckenkodning with open('minfil.txt', encoding='latin1') as f: for line in f: for word in line.split(): print(word, end='_') print() Creative Commons 4.0 Filhantering 16/18 Filmoder • Om man vill ändra sättet with open('minfil.txt', mode='r') as f: for line in f: print(line.strip()) Filmod r w a w+ man öppnar filen på (t.ex. för att kunna skriva till den) byter man ut 'r' mot något annat enligt nedanstående tabell Egenskap Öppna för läsning Öppna för skrivning (trunkerar innehållet) Öppna för skrivning i slutet Öppna för läsning och skrivning Creative Commons 4.0 Filhantering 17/18 Skriva till fil with open('minfil', 'w') as f: for val in range(3): f.write(str(val)) with open('minfil', 'w') as f: for val in range(3): print(val, file=f) • Man kan skriva till filer öppnade med 'w' eller 'a' • Man kan göra det med write, men det är lättare med print och file-parametern Creative Commons 4.0 www.liu.se