course

Funktioner är en grundläggande del av programmeringsspråket Python: du har kanske redan stött på och använt några av de många fantastiska funktionerna som är inbyggda i Python eller som följer med dess biblioteksekosystem. Som data scientist behöver du dock ständigt skriva egna funktioner för att lösa problem som din data ställer dig inför.
Den här handledningen använder Python 3-syntax. Alla exempel fungerar på Python 3.10+ och har uppdaterats för att spegla moderna konventioner (f-strängar, typanvisningar, endast positionella och endast nyckelordsparametrar). Den aktuella stabila versionen är Python 3.14.
För att enkelt köra all exempelkod i den här handledningen själv kan du skapa en DataLab-arbetsbok gratis som har Python förinstallerat och innehåller alla kodexempel. För mer övning i att skriva Python-funktioner, kolla in den här praktiska DataCamp-övningen eller prova vår kurs Python Data Science Toolbox!
Funktioner i Python
Du använder funktioner i programmering för att paketera en uppsättning instruktioner som du vill använda upprepade gånger eller som, på grund av sin komplexitet, bättre kapslas in i ett delprogram och anropas vid behov. Det betyder att en funktion är en kodsnutt skriven för att utföra en angiven uppgift. För att utföra den uppgiften kan funktionen behöva ett eller flera indata, eller inga alls. När uppgiften är utförd kan funktionen returnera ett eller flera värden, eller inga.
Det finns tre typer av funktioner i Python:
-
Inbyggda funktioner, såsom
help()för att be om hjälp,min()för att få minsta värdet,print()för att skriva ut ett objekt till terminalen,… Du hittar en översikt med fler av dessa funktioner här. -
Användardefinierade funktioner (UDF:er), som är funktioner som användare skapar för att hjälpa sig själva; och
-
Anonyma funktioner, som också kallas lambda-funktioner eftersom de inte deklareras med det vanliga nyckelordet
def.
Funktioner vs. metoder
En metod avser en funktion som är del av en klass. Du kommer åt den med en instans eller ett objekt av klassen. En funktion har inte den här begränsningen: den avser helt enkelt en fristående funktion. Det betyder att alla metoder är funktioner, men inte alla funktioner är metoder.
Fundera på det här exemplet, där du först definierar en funktion plus() och sedan en klass Summation med en metod sum():
Om du nu vill anropa metoden sum() som är del av klassen Summation behöver du först definiera en instans eller ett objekt av den klassen. Så, låt oss definiera ett sådant objekt:
Kom ihåg att den här instansieringen inte är nödvändig när du vill anropa funktionen plus()! Du skulle kunna köra plus(1,2) i DataCamp Light-kodblocket utan problem!
Parametrar vs. argument
Parametrar är namnen som används när du definierar en funktion eller metod, och som argumenten mappas till. Med andra ord: argument är det som skickas in till ett funktions- eller metodanrop, medan koden i funktionen eller metoden refererar till argumenten via deras parameternamn.
Titta på följande exempel och gå tillbaka till DataCamp Light-blocket ovan: du skickar två argument till metoden sum() i klassen Summation, även om du tidigare definierade tre parametrar, nämligen self, a och b.
Vad hände med self?
Det första argumentet till varje klassmetod är alltid en referens till den aktuella instansen av klassen, vilket i det här fallet är Summation. Enligt konvention kallas det här argumentet self.
Allt detta betyder att du inte skickar referensen till self i det här fallet eftersom self är parameternamnet för ett implicit skickat argument som refererar till instansen genom vilken en metod anropas. Det sätts in implicit i argumentlistan.
Hur du definierar en funktion: användardefinierade funktioner (UDF:er)
De fyra stegen för att definiera en funktion i Python är följande:
-
Använd nyckelordet
defför att deklarera funktionen och följ upp med funktionsnamnet. -
Lägg till parametrar till funktionen: de ska stå inom parentes efter funktionsnamnet. Avsluta raden med ett kolon.
-
Lägg till satser som funktionen ska exekvera.
-
Avsluta din funktion med en return-sats om funktionen ska ge något resultat. Utan return-sats kommer din funktion att returnera objektet
None.
Naturligtvis blir dina funktioner mer komplexa efter hand: du kan lägga till for-loopar, flödesstyrning,… och mer för att göra dem mer finmaskiga:
def hello():
name = input("Enter your name: ")
if name:
print(f"Hello {name}")
else:
print("Hello World")
hello()
I funktionen ovan ber du användaren ange ett namn. Om inget namn anges skriver funktionen ut ”Hello World”. Annars får användaren ett personligt ”Hello”-svar.
Kom ihåg också att du kan definiera en eller flera funktionsparametrar för din UDF. Du lär dig mer om detta i avsnittet om funktionsargument. Dessutom kan du returnera ett eller flera värden som resultat av din funktion, eller inget alls.
Return-satsen
Observera att eftersom du skriver ut något i din UDF hello(), behöver du egentligen inte returnera det. Det blir ingen skillnad mellan funktionen ovan och denna:
Men om du vill fortsätta arbeta med resultatet av din funktion och prova några operationer på det, behöver du använda return-satsen för att faktiskt returnera ett värde, såsom en sträng, ett heltal,…. Tänk på följande scenario, där hello() returnerar strängen "hello", medan funktionen hello_noreturn() returnerar None:
Den andra funktionen ger ett fel eftersom du inte kan utföra några operationer med ett None. Du får ett TypeError som säger att du inte kan göra multiplikationsoperationen för NoneType (det None som är resultatet av hello_noreturn()) och int (2).
Tips funktioner avslutas omedelbart när de stöter på en return-sats, även om det innebär att de inte returnerar något värde:
En annan sak som är värd att nämna när du arbetar med return-satsen är att du kan använda den för att returnera flera värden. För att göra detta använder du tuples.
Kom ihåg att denna datastruktur liknar listor: den kan innehålla flera värden. Tuples är dock oföränderliga (immutable), vilket betyder att du inte kan ändra några värden som lagras i dem! Du skapar dem med hjälp av parenteser (). Du kan packa upp tuples till flera variabler med hjälp av komma och tilldelningsoperatorn.
Kolla in följande exempel för att förstå hur din funktion kan returnera flera värden:
Observera att return-satsen return sum, a skulle ge samma resultat som return (sum, a): den förra packar faktiskt sum och a i en tuple under huven!
Hur du anropar en funktion
I föregående avsnitt har du redan sett många exempel på hur du kan anropa en funktion. Att anropa en funktion betyder att du kör funktionen som du har definierat – antingen direkt från Python-prompten eller via en annan funktion (som du kommer att se i avsnittet ”Nästade funktioner”).
Anropa din nyskapade funktion hello() genom att helt enkelt köra hello(), precis som i DataCamp Light-blocket nedan:
Hur du lägger till docstrings till en Python-funktion
En annan väsentlig aspekt av att skriva funktioner i Python: docstrings. Docstrings beskriver vad din funktion gör, till exempel vilka beräkningar den utför eller vilka returvärden den har. Dessa beskrivningar fungerar som dokumentation för din funktion så att den som läser din funktions docstring förstår vad den gör utan att behöva följa all kod i funktionsdefinitionen.
Funktionsdocstrings placeras direkt på raden efter funktionshuvudet och omsluts av tredubbla citattecken. En lämplig docstring för din funktion hello() är ’Skriver ut ”Hello World”’.
def hello() -> None:
"""Prints "Hello World"."""
print("Hello World")
Observera att docstrings kan vara längre än det som ges här som exempel. Om du vill studera docstrings mer i detalj är det bäst att kolla några Github‑repon för Python-bibliotek som scikit-learn eller pandas, där du hittar gott om exempel!
Typanvisningar
Nära besläktat med docstrings — och nästan lika vanligt i modern Python-kod — är typanvisningar. Sedan Python 3.5 kan du annotera din funktions parametrar och returvärde med de typer de förväntas ha. Här är det enklaste möjliga exemplet:
def plus(a: int, b: int) -> int:
return a + b
: int efter varje parameter säger ”detta ska vara ett heltal”, och -> int efter parenteserna säger ”den här funktionen returnerar ett heltal”. Python själv verkställer inte dessa annoteringar vid körning — du kan fortfarande skicka en sträng till plus() och Python klagar inte förrän något går sönder. Men verktyg som mypy, pyright och typkontrollerna som är inbyggda i redigerare som VS Code och PyCharm använder dessa tips för att fånga buggar innan du ens kör din kod.
För mer komplexa typer kan du använda inbyggda generics direkt (Python 3.9+) eller importera från modulen typing:
def greet(names: list[str]) -> None:
for name in names:
print(f"Hello {name}")
def find_user(user_id: int) -> dict | None:
# returns the user dict, or None if not found
...
Funktionsargument i Python
Tidigare lärde du dig skillnaden mellan parametrar och argument. Kort sagt: argument är det som ges till ett funktions- eller metodanrop, medan koden i funktionen eller metoden refererar till argumenten via deras parameternamn. Det finns fyra typer av argument som Pythons UDF:er kan ta:
- Standardargument
- Obligatoriska argument
- Nyckelordsargument
- Variabelt antal argument
Standardargument
Standardargument är de som får ett standardvärde om inget argumentvärde skickas vid funktionsanropet. Du kan tilldela detta standardvärde med tilldelningsoperatorn =, precis som i följande exempel:
Obligatoriska argument
Som namnet antyder är de obligatoriska argumenten i en UDF sådana som måste vara med. Dessa argument behöver skickas vid funktionsanrop och i exakt rätt ordning, precis som i följande exempel:
Du behöver argument som mappar till både parametern a och b för att anropa funktionen utan att få fel. Om du byter plats på a och b blir resultatet inte annorlunda, men det kan det bli om du ändrar plus() till följande:
Nyckelordsargument
Om du vill försäkra dig om att du anropar alla parametrar i rätt ordning kan du använda nyckelordsargument i funktionsanropet. Du använder dessa för att identifiera argumenten med deras parameternamn. Låt oss ta exemplet ovan för att göra detta tydligare:
Observera att genom att använda nyckelordsargument kan du också byta ordning på parametrarna och ändå få samma resultat när du kör din funktion:
Variabelt antal argument
I fall där du inte vet det exakta antalet argument du vill skicka till en funktion kan du använda följande syntax med *args:
Asterisken (*) placeras före variabelnamnet som håller värdena för alla icke‑nyckelordsargument. Notera här att du lika gärna hade kunnat skicka *varint, *var_int_args eller något annat namn till funktionen plus().
Tips: prova att ersätta *args med ett annat namn som inkluderar asterisken. Du kommer att se att koden ovan fortsätter att fungera!
Du ser att funktionen ovan använder den inbyggda Python-funktionen sum() för att summera alla argument som skickas till plus().
Globala vs. lokala variabler
Generellt har variabler som definieras inne i en funktionskropp ett lokalt omfång (scope), och de som definieras utanför har ett globalt omfång. Det betyder att lokala variabler definieras inom ett funktionsblock och bara kan nås inuti den funktionen, medan globala variabler kan nås av alla funktioner som kan finnas i ditt skript:
Du kommer att se att du får ett NameError som säger att name 'total' is not defined när du försöker skriva ut den lokala variabeln total som definierades inne i funktionskroppen. Variabeln init, å andra sidan, kan skrivas ut utan problem.
Endast positionella och endast nyckelordsparametrar
Sedan Python 3.8 kan du ta mer kontroll över hur argument måste skickas genom att använda två speciella markörer i din funktionssignatur: / och *. Allt före / kan endast skickas positionellt; allt efter * kan endast skickas som nyckelord.
def greet(name, /, greeting="Hello", *, punctuation="!"):
print(f"{greeting} {name}{punctuation}")
Så här spelar det ut vid anropsplatsen:
greet("Alice") # works
greet("Alice", greeting="Hi") # works
greet("Alice", "Hi", punctuation="?") # works
greet(name="Alice") # TypeError: name is positional-only
greet("Alice", "Hi", "?") # TypeError: punctuation is keyword-only
Varför skulle du vilja detta? Två huvudskäl.
För det första låter endast positionella parametrar dig byta namn på dem senare utan att bryta någons kod — eftersom ingen får använda parameternamnet som nyckelord kan du fritt ändra det.
För det andra tvingar endast nyckelords parametrar anropare att vara explicita med vad de skickar, vilket gör anrop mer läsbara när du har flera valfria flaggor eller inställningar.
Kort sagt: det är ett rent sätt att upprätthålla avsikt.
Anonyma funktioner i Python
Anonyma funktioner kallas också lambda-funktioner i Python eftersom du istället för att deklarera dem med det vanliga nyckelordet def använder nyckelordet lambda.
I DataCamp Light-blocket ovan är lambda x: x*2 den anonyma eller lambda-funktionen. x är argumentet, och x*2 är uttrycket eller instruktionen som utvärderas och returneras. Det speciella med den här funktionen är att den saknar namn, till skillnad från exemplen du har sett i den första delen av den här funktionshandledningen. Om du skulle skriva ovanstående funktion som en UDF skulle resultatet bli följande:
def double(x):
return x*2
Låt oss titta på ett annat exempel på en lambda-funktion där du arbetar med två argument:
Du använder anonyma funktioner när du behöver en namnlös funktion under en kort period som skapas vid körning. Specifika sammanhang där detta är relevant är när du arbetar med filter(), map() och reduce():
Funktionen filter() filtrerar, som namnet antyder, den ursprungliga indatalistan my_list baserat på kriteriet >10. Med map() å andra sidan tillämpar du en funktion på alla element i listan my_list. I detta fall multiplicerar du alla element med 2.
Observera att funktionen reduce() är en del av biblioteket functools. Du använder denna funktion kumulativt på elementen i listan my_list, från vänster till höger, och reducerar sekvensen till ett enda värde, 55, i det här fallet.
Att använda main() som en funktion i Python
Om du har erfarenhet av andra programmeringsspråk som Java vet du att funktionen main krävs för att köra funktioner. Som du har sett i exemplen ovan är detta inte nödvändigt i Python. Men att inkludera en main()-funktion i ditt Python-program kan vara praktiskt för att strukturera din kod logiskt – alla de viktigaste komponenterna samlas i den här funktionen main().
Du kan enkelt definiera en main()-funktion och anropa den precis som du har gjort med alla andra funktioner ovan:
Men som det är nu kommer koden i din main()-funktion att köras när du importerar den som en modul. För att se till att detta inte händer anropar du funktionen main() när __name__ == '__main__'.
Det betyder att koden i blocket ovan blir:
Observera att förutom funktionen __main__ finns också funktionen __init__ som initierar en instans av en klass eller ett objekt. Enkelt uttryckt fungerar den som en konstruktor eller initialiserare och anropas automatiskt när du skapar en ny instans av en klass. Med den funktionen tilldelas det nyss skapade objektet parametern self, vilket du såg tidigare i den här handledningen. Ta en titt på följande exempel:
class Dog:
"""A simple Dog class.
Args:
legs: Number of legs so that the dog can walk.
color: The color of the fur.
"""
def __init__(self, legs: int, color: str) -> None:
self.legs = legs
self.color = color
def bark(self) -> str:
return "bark" * 2
if __name__ == "__main__":
dog = Dog(4, "brown")
print(dog.bark())
Fortsätt öva på Python-funktioner
Grattis! Du har tagit dig igenom den här korta handledningen om funktioner i Python. Om du vill repetera annat grundläggande material i Python-programmering, missa inte Data Types for Data Science, en kurs där du befäster och övar dina kunskaper om listor, ordböcker, tuples, mängder och datum/tider.
Vanliga frågor om Python‑funktioner
Vad är en funktion i Python?
En funktion är ett återanvändbart kodblock som utför en specifik uppgift. Den kan ta indata, bearbeta dem och returnera utdata.
Hur definierar du en funktion i Python?
För att definiera en funktion i Python använder du nyckelordet def, namnger din funktion, lägger till valfria parametrar inom parentes, skriver din kod och returnerar valfritt ett värde.
Vad är skillnaden mellan funktioner och metoder i Python?
Funktioner är fristående, men metoder tillhör klasser. Alla metoder är funktioner, men inte alla funktioner är metoder.
Vilka typer av funktioner finns i Python?
Python har inbyggda funktioner (som print()), användardefinierade funktioner (dina egna skapelser) och anonyma funktioner (kortlivade lambda-funktioner).
Vad är skillnaden mellan parametrar och argument?
Parametrar är platshållare i din funktionsdefinition, och argument är de faktiska värden du skickar när du anropar funktionen.
Vad är en lambda‑funktion?
En lambda‑funktion är en enradig, namnlös funktion för snabba uppgifter.
Varför använda funktionen __main__?
Funktionen __main__ håller din kod organiserad och säkerställer att specifika delar bara körs när skriptet körs direkt, inte när det importeras.
Vad är skillnaden mellan globala och lokala variabler?
Globala variabler fungerar överallt, medan lokala bara lever inuti sin funktion.