TDP002 - Imperativ programmering - Strängar och IO

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