Ga naar hoofdinhoud

Exponenten in Python: een uitgebreide gids voor beginners

Beheers exponenten in Python met verschillende methoden, van ingebouwde functies tot krachtige bibliotheken zoals NumPy, en pas ze toe in praktijksituaties voor een dieper begrip.
· 9 min lezen

Verken met AI

Machtverheffen is fundamenteel in allerlei programmeergebieden, van data-analyse tot algoritmeontwerp. Toepassingen zijn onder andere het analyseren van exponentiële patronen in grote datasets zoals socialmediatrends en het uitvoeren van wiskundige berekeningen zoals samengestelde groei of rentevoeten.

Daarnaast speelt machtverheffen een cruciale rol in Machine Learning (ML) en Kunstmatige Intelligentie (AI), vooral in neurale netwerken en beeldherkenning. Het is daarom essentieel om te begrijpen hoe je in Python effectief met exponenten rekent.

In deze gids verkennen we verschillende manieren om machtverheffen in Python uit te voeren. We bekijken ingebouwde functies, functies uit de math-module en die uit de Numpy-bibliotheek. Elke methode heeft zijn voordelen. Wil je een voorsprong nemen, je begrip verdiepen en expert worden, schrijf je dan in voor onze skill track Python Programming Fundamentals. 

Exponenten in Python

Python biedt meerdere manieren om exponenten te berekenen:

  • **: De dubbele-asterisk-operator (**) is de eenvoudigste en basale optie voor machtverheffen. Bijvoorbeeld, x ** y berekent x tot de macht y.

  • pow(): Deze ingebouwde functie neemt twee argumenten: de basis en de exponent. Ze geeft het resultaat terug van het verheffen van de basis tot de exponent. Er is ook een optioneel derde argument voor modulaire exponentiatie. Voorbeeld: pow(x, y).

  • math.pow(): Deze functie uit de math-module lijkt op pow(), maar geeft altijd een drijvendekommagetal terug. Ze neemt twee argumenten, die allebei floats of integers kunnen zijn. Voorbeeld: math.pow(x, y).

  • math.exp(): Nog een functie uit de math-module; deze retourneert de natuurlijke exponentiële waarde van een getal, oftewel e tot de macht van het argument. Voorbeeld: math.exp(argument).

  • np.power(): Deze functie uit de NumPy-bibliotheek is bedoeld voor werken met arrays of matrices. Ze voert elementgewijze machtverheffing uit. Voorbeeld: np.power(array, exponent).

Basis van exponenten in Python

De dubbele-asterisk-operator (**) is de meest rechttoe-rechtaan manier om in Python machtverheffen te berekenen. Deze operator verheft de linkeroperand (basis) tot de macht van de rechteroperand (exponent). Hij wordt ook wel de power- of exponent-operator genoemd.

Wil je je Pythonvaardigheden verbeteren en leren coderen als een echte programmeur, bekijk dan de track Python Programming.

Positieve exponent

In dit codefragment laten we zien hoe je machtverheffen met positieve exponenten berekent. Bijvoorbeeld, 2 tot de macht 3 wordt berekend als 2 × 2 × 2, wat 8 oplevert. Evenzo wordt -10 tot de macht 4 berekend als -10 × -10 × -10 × -10, wat 10000 oplevert.

base = 2
exponent = 3
print(base**exponent)  # Output: 8

base = -10
exponent = 4
print(base**exponent)  # Output: 10000

Negatieve exponent

Deze code berekent het resultaat van het verheffen van een basis tot een negatieve exponent. Bijvoorbeeld, 5 tot de macht -2 is gelijk aan 0,04. Evenzo levert 25 tot de macht -5 een zeer kleine waarde op die in wetenschappelijke notatie wordt weergegeven (1.024e-07).

base = 5
exponent = -2
print(base**exponent) # 0.04

base = 25
exponent = -5
print(base**exponent) # 1.024e-07

Een getal verheffen tot een negatieve exponent is gelijk aan het nemen van het omgekeerde (reciproque) van het getal verheven tot de positieve exponent.

Een getal verheffen tot een negatieve exponent

In Python geeft de **-operator een ZeroDivisionError als je 0.0 tot een negatieve macht verheft, omdat delen door nul ongedefinieerd is.

base = 0
exponent = -5
print(base**exponent)

De uitvoer is:

ZeroDivisionError in Python

Drijvende-komma-exponent

De codevoorbeelden laten zien dat Python het resultaat correct berekent van het verheffen van een positieve basis zoals 2 tot een fractionele exponent zoals 1,5. Het gebruik van een negatieve basis met een fractionele exponent levert echter een complex getal op.

base = 2
exponent = 1.5
print(base**exponent) # 2.8284271247461903

base = -0.25
exponent = 1.25
print(base**exponent) # (-0.12500000000000003-0.125j)

Dieper duiken: ingebouwde functies

Python biedt diverse ingebouwde functies voor het berekenen van exponenten, maar we focussen op twee: pow() en math.pow(). Op het eerste gezicht lijken deze functies op elkaar, maar er zijn belangrijke verschillen.

pow()

De functie pow() neemt twee verplichte argumenten: basis en exponent. Optioneel accepteert pow() een derde argument om de modulus van de exponentiële waarde te berekenen. De syntaxis is als volgt: pow(base, exp, mod), waarbij 'mod' de modulus is. Deze functie retourneert de rest van de machtverheffing.

Eenvoudige machtverheffing

Voor basale berekeningen geef je simpelweg de basis en exponent aan de functie, vergelijkbaar met de **-operator.

r = pow(2, 3)
print(r) # 8

r = pow(4, -10)
print(r) # 2.56e-06

Machtverheffen met floats

In de onderstaande code gebruiken we drijvende-kommagetallen voor zowel bases als exponenten, waarvan sommige negatief zijn. Deze aanpak werkt vergelijkbaar met de **-operator.

r = pow(3.5, 2)
print(r)  # 12.25

r = pow(3.5, -2)
print(r)  # 0.08163265306122448

r = pow(3.5, 3.2)
print(r)  # 55.08301986166747

r = pow(-3.5, -3.3)
print(r)  # (-0.009414432347757688+0.012957854474952653j)

r = pow(-3.5, 3.3)
print(r)  # (-36.698070584660925-50.510560868902246j)

Let op: Als je te maken hebt met eenvoudige machtverheffing zonder modulaire berekeningen, is de **-operator een beknoptere en beter leesbare oplossing dan de functie pow().

Modulaire exponentiatie

De optionele modulusparameter van de pow()-functie is zeer waardevol bij modulaire exponentiatie. Dit is vooral nuttig in cryptografie of bij grote getallen, omdat modulaire exponentiatie efficiënter is. Bijvoorbeeld, bij het berekenen van 3 tot de macht 4 modulo 5 is het resultaat 1, aangezien 81 modulo 5 gelijk is aan 1.

r = pow(3, 4, 5)
print(r)  # 1

r = pow(123, 456, 789)
print(r)  # 699

r = pow(2, -3, 7)
print(r)  # 1

r = pow(-13, 8, 62)
print(r)  # 7

Je vraagt je misschien af waarom pow() direct gebruiken voor modulaire exponentiatie efficiënter is dan pow(base, exp) % mod of (base**exp) % mod. De ingebouwde pow()-functie is specifiek ontworpen voor deze bewerking, terwijl de andere methoden onnodige tussentijdse berekeningen uitvoeren. Dit kan een aanzienlijk verschil in performance maken, vooral bij grote waarden.

import timeit

start_pow_mod = timeit.default_timer()
pow(500000000, 3000, 4000)
stop_pow_mod = timeit.default_timer()

pow_mod_time = stop_pow_mod - start_pow_mod

print("Time using pow(base, exp, mod): ", pow_mod_time)

start_pow_other = timeit.default_timer()
pow(500000000, 3000) % 4000
stop_pow_other = timeit.default_timer()

pow_other_time = stop_pow_other - start_pow_other

print("Time using pow(base, exp) % mod:", pow_other_time)


start_aestrisk = timeit.default_timer()
(500000000**3000) % 4000
stop_aestrisk = timeit.default_timer()

aestrisk_time = stop_aestrisk - start_aestrisk

print("Time using (base ** exp) % mod: ", aestrisk_time)


print(
    f"Speed comparison: pow(base, exp, mod) was {pow_other_time / pow_mod_time} times faster than pow(base, exp) % mod and {aestrisk_time/pow_mod_time} times faster than (base ** exp) % mod"
)

De uitvoer is:

modulaire exponentiatie in Python

De functie pow() kan afhankelijk van de situatie verschillende fouten genereren.

# Trying to take the modulo of complex numbers raises a ValueError.
print(pow(2 + 3j, 4, 5))  # ValueError: complex modulo

# Taking the third argument is not allowed if the second argument is negative.
print(pow(10, -11, 4))  # ValueError: base is not invertible for the given modulus

# If the first or second argument is a float, the third argument is not allowed.
print(pow(2.4, 3, 4))  # TypeError: pow() 3rd argument not allowed unless all arguments are integers

# Passing any argument as a string results in a TypeError.
print(pow(2, 4, '3'))  # TypeError: unsupported operand type(s) for pow(): 'int', 'int', 'str'

math.pow()

De functie math.pow(x, n) verheft x tot de macht n. De math.pow() zet de argumenten om naar floats en geeft het resultaat terug als nauwkeurige drijvendekomma-exponentiatie. Deze precisie is cruciaal in bijvoorbeeld data-analyse en wetenschappelijk rekenen, waar nauwkeurigheid vooropstaat.

Hier is de eenvoudige code. De functie math.pow() geeft een drijvendekommawaarde terug, terwijl de functie pow() een integerwaarde teruggeeft.

import math
print(math.pow(6, 3))  # 216.0
print(pow(6, 3))  # 216

De functie math.pow() accepteert geen imaginaire getallen.

can't convert complex to float TypeError in Python

De math.pow() accepteert geen negatieve bases met fractionele exponenten, omdat dit een ValueError oplevert.

math domain error ValueError in Python

Bibliotheken inzetten voor geavanceerde exponenten

Voor geavanceerde taken met machtverheffen, zoals het vinden van de exponentiële waarde van een getal of het berekenen van elementgewijze machtverheffing in arrays of matrices, kun je twee functies gebruiken: np.power() en math.exp() .

np.power()

In Python ben je voor machtverheffen niet beperkt tot ingebouwde functies. Python heeft een krachtige bibliotheek, NumPy, die een breed scala aan wiskundige bewerkingen op arrays mogelijk maakt. Soms moet je machtverheffen over volledige arrays uitvoeren; daarvoor is np.power() bedoeld. Het is ontworpen voor elementgewijze machtverheffing van arrays.

import numpy as np
r = np.power([2, 4, 8], 2)
print(r)  # [4, 16, 64]

r = np.power([2, 4, 8], [1, 2, 3])
print(r)  # [4 64 4096]

r = np.power([[2, 3, 4], [5, 6, 7]], [1, 2, 3])
print(r) # [[2 9 64] [5 36 343]]

De functie np.power() accepteert geen negatieve exponent.

import numpy as np
r = np.power([2, 4, 8], -2)
print(r)

De uitvoer is:

ValueError bij proberen te machtsverheffen in Python

Als je probeert een negatief getal tot een niet-integer macht te verheffen, geeft NumPy een NaN (Not a Number) terug.

image7.png

math.exp()

De functie math.exp(x) berekent de exponentiële waarde van x, wat overeenkomt met het verheffen van het getal van Euler e tot de macht x. Het getal van Euler is ongeveer 2,71828, en in wiskundige notatie wordt deze bewerking weergegeven als e^x.

import math
x = 2
r = math.exp(x)
print("Exponential of", x, ":", r) # 7.38905609893065

Een belangrijk kenmerk van math.exp(x) is de flexibiliteit. De functie kan overweg met positieve getallen, negatieve getallen en zelfs drijvende-kommagetallen.

import math
print(math.exp(-2))  # 0.1353352832366127
print(math.exp(-2.5))  # 0.0820849986238988
print(math.exp(2.5))  # 12.182493960703473

Praktische toepassingen en voorbeelden

Machtverheffen is een fundamentele bewerking in de wiskunde met talloze toepassingen in data-analyse en wetenschappelijk rekenen.

Wil je de basis van data-analyse met Python onder de knie krijgen, bekijk dan de cursus Introduction to Python for Data Science.

Stel dat je een CSV-bestand hebt met gegevens over hoofdsom, rentevoet en looptijd voor meerdere rijen. Je kunt de samengestelde rente voor elke rij berekenen met een van de hierboven besproken methoden.

Principal,Rate,Years
1000,0.05,5
2000,0.03,10
1500,0.08,3
3000,0.06,7
2500,0.04,9
1800,0.07,4
2200,0.025,6
3500,0.09,2
2800,0.035,8
4000,0.02,5

Hier is de code:

import csv


def compound_interest(principal, rate, years):
    return principal * (1 + rate) ** years


# Read data from CSV file

data = []
with open("data.csv", newline="") as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        row["Compound Interest"] = compound_interest(
            float(row["Principal"]), float(row["Rate"]), int(row["Years"])
        )
        data.append(row)
# Write data to a new CSV file with compound interest column

output_file = "data.csv"
fieldnames = ["Principal", "Rate", "Years", "Compound Interest"]

with open(output_file, mode="w", newline="") as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for row in data:
        writer.writerow(row)
print("Compound interest calculations saved to", output_file)

Het resultaat is:

samengestelde rente berekenen in Python

Mooi! Je hebt voor alle rijen de samengestelde rente berekend en opgeslagen in een aparte kolom. Je kunt deze gegevens gebruiken voor verdere analyse. Op dezelfde manier zijn er honderden andere use-cases waarin machtverheffen veel wordt gebruikt, zoals het modelleren van bevolkingsgroei in de tijd.

Conclusie

In deze gids hebben we vijf verschillende methoden verkend om exponenten in Python te berekenen, elk met unieke voordelen. Je kunt ze inzetten in veel praktische scenario's, zoals het bepalen van samengestelde rente, het modelleren van bevolkingsgroei en meer.

  • Dubbele-asterisk-operator (**): Eenvoudig en direct voor dagelijks gebruik.
  • pow(): Veelzijdig met een optionele "modulus"-truc.
  • math.pow(): Nauwkeurige resultaten als drijvendekommagetallen.
  • np.power(): Krachtig voor arrays met foutafhandeling.
  • math.exp(): Speciaal gereedschap voor het berekenen van de exponentiële waarde.

Wil je je statistische skills ontwikkelen en leren hoe je met Python gegevens verzamelt, analyseert en tot accurate conclusies komt, bekijk dan de cursus Introduction to Statistics in Python.

Satyam Tripathi

Auteur

Satyam Tripathi

Veelgestelde vragen over exponenten in Python

Wanneer moet ik math.pow() gebruiken in plaats van de **-operator in Python?

Gebruik math.pow() wanneer je precieze drijvendekommaresultaten nodig hebt voor wetenschappelijke of data-analyse-doeleinden. Als eenvoud je doel is en de berekening geen drijvendekommatische precisie vereist, volstaat de **-operator.

Kan Python omgaan met negatieve of fractionele exponenten?

Ja, Python ondersteunt negatieve en fractionele exponenten:

  • Negatieve exponenten: Gebruik de **-operator of pow() om het omgekeerde te berekenen van een getal verheven tot een positieve macht.
  • Fractionele exponenten: Gebruik de **-operator of math.pow(). Let op: een negatieve basis met een fractionele exponent resulteert in een complex getal.
Hoe wordt modulaire exponentiatie in Python geïmplementeerd, en waarom is die efficiënt?

Modulaire exponentiatie kan worden uitgevoerd met de functie pow() met drie argumenten: pow(base, exp, mod). Het is efficiënter dan (base**exp) % mod omdat pow() is geoptimaliseerd voor grote getallen en tussentijdse berekeningen vermindert.

Waarom geeft NumPy’s np.power() een fout bij negatieve exponenten?

np.power() is ontworpen voor array-berekeningen en ondersteunt geen negatieve exponenten omdat die deling impliceren, wat niet met alle arraytypes compatibel is. Gebruik voor zulke berekeningen alternatieven zoals ** of pow().

Onderwerpen

Gerelateerd