Import fra moduler

Python har en del innebygde funksjoner, slik som for eksempel print(), input(), int() og float().

En komplett liste over alle innebygde funksjoner finnes i Pythons dokumentasjon: https://docs.python.org/3/library/functions.html

Lista med innebygde funksjoner er imidlertid ganske kort. Grunnen er at det meste av funksjoner ligger i egne moduler, som kan hentes inn ved behov. Vil vi for eksempel beregne en kvadratrot, må vi importere funksjonen sqrt() fra en modul som heter math. math inneholder mange vanlige matematiske funksjoner, beskrevet i dokumentasjonen: https://docs.python.org/3/library/math.html

Hvis vi for eksempel vil beregne rota av 2, og bare skriver

x = sqrt(2)

i Python, vil vi få feilmeldingen "NameError: name 'sqrt' is not defined" fordi vi ikke har importert funksjonen sqrt().

Vi kan velge å importere en hel modul eller bare det innholdet vi har bruk for.

Eksempel 1:

Vi importerer funksjonen sqrt() fra modulen math, og bruker den til å beregne rota av 2:

from math import sqrt

x = sqrt(2)

Etter importen blir sqrt() tilgjengelig på samme måte som Pythons innebygde funksjoner.

Vi kan godt importere flere ting samtidig, ved hjelp av ei kommaseparert liste.

Eksempel 2:

Vi importerer de trigonometriske funksjoner sin(), cos() og tan().

from math import sin, cos, tan

En modul kan inneholde mer enn funksjoner. Modulen math inneholder for eksempel konstantene pi og e. Det er litt underlig, men disse konstantene følger ikke konvensjonen om at konstanter skal skrives med bare store bokstaver.

Eksempel 3:

Vi skal skrive Python-kode som leser inn omkretsen til en sirkel og beregner og skriver ut omkretsen med to desimaler. Siden π inngår i beregningen, importerer vi π fra modulen math.

from math import pi

radius = float(input("Oppgi radius: "))
omkrets = 2 * pi * radius
print(f"En sirkel med radius {radius:.2f} har omkrets ca. {omkrets:.2f}.")

Vi kan også importere en hel modul.

Eksempel 4:

Vi importerer hele modulen math, og bruker sqrt() til å beregne rota av 2.

import math

x = math.sqrt(2)

I eksempel 4 blir alt innhold i modulen importert. For å bruke en funksjon fra modulen må vi da angi modulnavnet med et punktum foran funksjonsnavnet, slik som i math.sqrt().

Oppgave 1:

I modulen random ligger funksjonen randint(), som genererer tilfeldige uniformt fordelte heltall mellom angitte grenser. randint(a, b) vil generere heltall større eller lik a og mindre eller lik b.

Importer og bruk denne funksjonen til å simulere terningkast, det vil si generere og skrive ut et tilfeldig tall som er 1, 2, 3, 4, 5 eller 6.

Det er mulig å gi en import et eget navn, et såkalt alias. Aliaset erstatter da det ekte navnet i koden vår. 

Se løsningsforslag

Eksempel 5:

Vi importerer funksjonene degrees() og radians() fra modulen math, og kaller dem henholdsvis deg() og rad().

from math import degrees as deg, radians as rad

I eksempel 5 ser vi at vi angir et alias ved hjelp av kodeordet as etterfulgt av aliasnavnet.

Oppgave 2:

Endre koden fra oppgave 1 slik at randint() blir importert med alias rint(), og bruk dette aliaset i koden.

Se løsningsforslag

Det er mulig å importere alt innhold i en modul ved hjelp av jokertegnet *. For eksempel vil koden

from math import *

importere alt innhold i modulen math. Dette innholdet kan vi så bruke uten å angi modulnavnet math, for eksempel sin(), cos() og tan().

import * ser vi ofte brukt i kode vi finner på nett eller i bøker, men vi skal overhodet ikke importere på denne måten, fordi det skaper uklarheter og risiko for konflikter i koden vår. Hvis vi for eksempel bruker funksjonen expm1(), vil det ikke framgå noen steder hvor funksjonen kommer fra, slik det gjør hvis vi importerer med from math import expm1, eller importerer med import math og bruker funksjonen som math.expm1(). Vi risikerer også å importere noe som heter det samme som noe vi har definert selv. Hvis vi for eksempel har en variabel som heter comb, og vi importerer hele modulen math, vil det bli konflikt mellom vår variabel comb og math-funksjonen comb(). import * frarådes også i stilguiden PEP 8.

Vi lister i stedet opp det innholdet vi vil importere, med syntaksen

from modulnavn import navn_1, navn_2, navn_3

eller importerer hele modulen, med syntaksen

import modulnavn

Når vi importerer hele modulen, unngår vi konflikter fordi vi må bruke modulnavnet som prefiks. Hvis vi for eksempel har en variabel som heter comb, og importerer med import math, vil det ikke bli konflikt mellom vår variabel comb og math-funksjonen comb() fordi math-funksjonen comb() må brukes som math.comb().

Ifølge stilguiden PEP 8 skal import gjøres øverst i koden, og skilles fra resten av koden med en blank linje, slik vi har gjort i denne artikkelen.

Kilder

    • Matthes A. (2019). Python Crash Course. no starch press