TDP002 - Imperativ programmering

.
TDP002 - Imperativ programmering
Pythons standardbibliotek
Eric Elfving
Institutionen för datavetenskap
(Med exempel från docs.python.org)
25 augusti 2015
.....
Översikt
2/28
• Felhantering
• Pythons standardbibliotek - en översikt
Creative Commons 4.0
.....
Felhantering
3/28
Python baseras på "Duck Typing".
When I see a bird that walks like a duck and swims like a
duck and quacks like a duck, I call that bird a duck.
Creative Commons 4.0
.....
Felhantering
4/28
Detta leder till att vi kommer få fel som måste hanteras.
>>> int('Anna')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'Anna'
Här ser vi exempel på undantag (exceptions)
• Direkt ett undantag kastas avbryts nuvarande körning och vi
hoppar till närmsta hanterare
• Finns ingen hanterare avbryts programmet (programmet
"krashar")
Creative Commons 4.0
.....
Felhantering
5/28
• En hanterare introduceras med ett try-block
try:
val=int(input('Mata in ett tal: '))
except:
print('Skulle vara ett heltal!')
Creative Commons 4.0
.....
Felhantering
6/28
• Vi kan hantera olika fel på olika sätt.
try:
1/a
except TypeError:
print('a har fel typ!')
except NameError:
print('a finns inte!')
except ZeroDivisionError:
print('Kan inte dela med 0!')
except:
print('Annat fel')
• Likt if-satsen är det den första som stämmer som vi går in i.
Creative Commons 4.0
.....
Felhantering
7/28
• Vi kan hantera flera olika fel på samma sätt.
try:
1/a
except (TypeError, NameError):
print('a är dålig!')
except ZeroDivisionError:
print('Kan inte dela med 0!')
except:
print('Annat fel')
Creative Commons 4.0
.....
Felhantering
8/28
• Vi kan kasta undantag.
>>> raise NameError('Hejsan')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: Hejsan
Creative Commons 4.0
.....
Felhantering
9/28
• Mer läsning:
https://docs.python.org/3/tutorial/errors.html
Creative Commons 4.0
.....
Slumphantering
10/28
• Ibland vill man få kod att uppföra sig slumpmässigt
• Datorer har svårt att ge riktig slump men många språk har
pseudo-slump (en algoritm beräknar ett "slumpat" värde)
• Självklart finns det även i Python - modulen random
http://docs.python.org/3/library/random.html
Creative Commons 4.0
.....
Datumhantering
11/28
• Med hjälp av modulen datetime kan man på ett enkelt sätt
hantera datum och tider i Python.
• Det finns tre huvudtyper i modulen: date, time och
datetime (finns även typer för tidsskillnader och tidszoner)
http://docs.python.org/3/library/datetime.html
Creative Commons 4.0
.....
Lagring av data
12/28
• Textfiler är bra för att lagra data mellan körningar
• Det kan dock ställa till med problem
• Hur ska jag formatera datat?
• Vad händer om något är felformaterat?
• Med hjälp av pickle kan man på ett enkelt sätt dumpa data
till en fil för att sedan läsa in det igen
• pickle.dump(obj, file) lagrar värdet i obj i den, för
binär skrivning (wb), öppnade filen file
• pickle.load(file) Laddar de värden som tidigare
sparats i filen file och returnerar resultatet
res = {'Kalle': 4, 'Anna': 5}
file_name = 'resultat'
with open(file_name, 'wb') as f:
pickle.dump(res, f)
http://docs.python.org/3/library/pickle.html
Creative Commons 4.0
.....
Lagring av data
13/28
• pickle går inte alltid att lita på...
• Använd
endast data som du själv sparat ner eller från någon du litar på!
Warning: The pickle module is not intended to be
secure against erroneous or maliciously
constructed data. Never unpickle data received
from an untrusted or unauthenticated source.
Creative Commons 4.0
.....
Lagring av data
14/28
CSV
• Comma Separated Values
• Används ofta för att exportera tabelldata i flera olika program
• Har tyvärr ingen generell standard men kolumnvärden lagras
ofta separerat med en specifik separator (ofta komma)
import csv
with open('fil.csv') as f:
reader = csv.reader(f)
for row in reader:
print(row)
Listing 1: fil.csv
1, 3, 6
12, 7, 6
[1, 3, 6]
[12, 7, 6]
http://docs.python.org/3/library/csv.html
Creative Commons 4.0
.....
Lagring av data
15/28
json
• JavaScript Object Notation
• Ett transportformat baserat på javascript
• Används väldigt mycket på www
• Modulen json har ett gränssnitt som liknar pickle
Creative Commons 4.0
.....
Lagring av data
16/28
json
http://docs.python.org/3/library/json.html
Creative Commons 4.0
.....
Konfigurationsfiler
17/28
• Med hjälp av konfigurationsfiler kan användare ändra på ditt
programs funktionalitet utan att ändra i källkoden
• Modulen configparser kan läsa filer på INI-formatet
• Exempelfil:
http://docs.python.org/3/library/configparser.html
Creative Commons 4.0
.....
Konfigurationsfiler
18/28
http://docs.python.org/3/library/configparser.html
Creative Commons 4.0
.....
Kommandoradsargument
19/28
• I de flesta programmeringsspråk kan man skicka värden till
programmet när man startar det. Detta kallas
kommandoradsargument.
• Det "lättaste" sättet att få reda på
kommandoradsargumenten är med hjälp av sys.argv. Det
är en lista där varje element motsvarar ett argument.
#! /usr/bin/env python3
# -*- coding: utf-8 -*import sys
for arg in sys.argv:
print(arg)
$ chmod +x args.py
$ python3 args.py
args.py
$ ./args.py Hej mitt lilla program!
./args.py
Hej
mitt
lilla
program!
Creative Commons 4.0
.....
Kommandoradsargument
20/28
argparse
• Man kan även använda sig av modulen argparse
• Med argparse väljer man vilka flaggor och argument man
väntar sig och sedan sköter modulen tolkningen - man slipper
kontrollera och konvertera listelementen!
http://docs.python.org/3/library/argparse.html
Creative Commons 4.0
.....
Kommandoradsargument
21/28
argparse
Creative Commons 4.0
.....
Lösenordshantering
22/28
• Ibland vill man be användare mata in lösenord
• Vanligtvis använder vi input för indata men då kan ju andra
se vad jag matar in
• Modulen getpass är bra
• Likt input kan man ge en ledtext (normalt sätt skrivs
'Password: ' ut)
import getpass
pwd = getpass.getpass()
• Det finns även en funktion getuser som tar reda på vem
man är inloggad som
http://docs.python.org/3/library/getpass.html
Creative Commons 4.0
.....
Operativsystemsanrop
23/28
subprocess
• Ett anrop till ett systemkommando (eller ett annat program)
kan göras med subprocess.call. Vi får ett returvärde
som bör vara 0 om det gått bra.
• Som parameter tar call en lista som liknar sys.argv
>>> subprocess.call(["ls", "-l"])
0
>>> subprocess.call(["cat", "fil_som_inte_finns"])
1
• Vill vi komma åt utskrifter från program kan man använda sig
av check_output
>>> subprocess.check_output(["echo", "Hello World"])
b'Hello World\n'
http://docs.python.org/3/library/subprocess.html
Creative Commons 4.0
.....
Modulen os
24/28
• Modulen os har operativsystemsspecifika funktioner
• Vissa av funktionerna fungerar endast för specifika
operativsystem men de flesta fungerar lika oberoende av
operativsystem
• Några bra funktioner:
os.environ En dict-liknande typ som innehåller Pythons
miljövariabler
os.listdir(path) Utför ls i mappen path, ger en lista som
resultat
os.mkdir Skapar mapp
os.walk(path) Ger för varje mapp i path en tupel med
mappens sökväg och listor med mappar
respektive filer i denna mapp. walk går sedan
nedåt i trädet rekursivt.
http://docs.python.org/3/library/os.html
Creative Commons 4.0
.....
os.path
25/28
• os.path är en undermodul med funktioner för att hantera
filnamn på ett generellt sätt. Exempel:
• os.path.join(p1,p2) som slår samman sökvägarna p1
och p2 med ett för nuvarande operativsystems bra sätt (med
avsende på separator, '/' i Linux och '\' i windows)
• os.path.isfile(f) kontrollerar om f är en fil
• os.path.abspath(path) gör om path till en absolut
sökväg
http://docs.python.org/3/library/os.path.html
Creative Commons 4.0
.....
Webåtkomst
26/28
urllib
• Med urllib kan man komma åt information från webben
• I modulen urllib.request finns en funktion urlopen
som laddar en sida och ger ett fil-liknande värde som kan
hanteras som en textfil
import urllib.request
with urllib.request.urlopen('http://www.ida.liu.se') as page:
for line in page:
if '<title>' in line:
title = line.split('<title>')
title = title[1].split('</')
title = title[0]
print(line)
break
...
<title>IDA > Home</title>
...
IDA > Home
http://docs.python.org/3/library/urllib.html
Creative Commons 4.0
.....
Loggning
27/28
logging
• Med logging kan man på ett enkelt sätt logga information
om sin körning till fil
import logging
logging.basicConfig(filename='example.log',
level=logging.INFO)
logging.debug('This message does not go to the log file')
logging.info('But this should')
logging.warning('And this, too')
INFO:root:But this should
WARNING:root:And this, too
• Finns också stöd för eget format (t.ex. tidsstämplar osv)
http://docs.python.org/3/library/logging.html
Creative Commons 4.0
.
.
www.liu.se