Introductie
Net als in andere programmeertalen werken for-loops in Python net even anders: ze gedragen zich meer als een iterator en minder als een for-keyword. In Python heb je geen C-achtige syntaxis for(i=0; i<n; i++), maar gebruik je for in n.
Je kunt ze gebruiken om te itereren over een reeks zoals een list, string, tuple, set, array, data frame.
Gegeven een lijst met elementen kun je met een for-loop over elk item in die lijst itereren en er iets mee doen.
Om over een reeks items te itereren gebruiken For-loops de range-functie. De range-functie geeft een nieuwe lijst met nummers in het opgegeven bereik terug, gebaseerd op de lengte van de sequentie.
Terwijl je over een sequentie itereert, kun je ook de indexen van de elementen gebruiken. Bepaal dan eerst de lengte van de lijst en iterereer vervolgens binnen het bereik van die lengte.
De for-loops in Python zijn nul-gebaseerd (zero-indexed).
Laten we snel naar de implementatie gaan.
Je kunt ook deze video bekijken voor een korte tutorial!
Begin gratis met Python leren
Introductie tot Data Science in Python
Loops implementeren
Om te beginnen: laten we de getallen van 1–10 printen. Omdat for-loops in Python nul-gebaseerd zijn, moet je bij elke iteratie één optellen; anders krijg je de waarden 0–9.
for i in range(10):
print (i+1)
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
Laten we over de letters van het woord Datacamp itereren met een for-loop en alleen de letter a printen.
for i in "Datacamp":
if i == 'a':
print (i)
# a
# a
# a
Stel, je wilt een lijst met elementen definiëren en die stuk voor stuk doorlopen.
sequence = [1, 2, 8, 100, 200, 'datacamp', 'tutorial']
for i in sequence:
print (i)
# 1
# 2
# 8
# 100
# 200
# datacamp
# tutorial
Maar wat als je de lengte van de lijst wilt bepalen en daarover wilt itereren? Gebruik dan de ingebouwde functie len en pas daarna range toe op die lengte.
Onthoud: range verwacht altijd een geheel getal.
sequence = [1, 2, 8, 100, 200, 'datacamp', 'tutorial']
for i in range(len(sequence)):
print (sequence[i])
# 1
# 2
# 8
# 100
# 200
# datacamp
# tutorial
Top! Maar waarom zou je len gebruiken als je ook direct for i in numbers kunt doen? Simpel: als je de indexen van de sequentie wilt gebruiken, bijvoorbeeld om een element van een bestaande lijst te wijzigen, heb je range(len(sequence)) nodig.
sequence = [1, 2, 8, 100, 200, 'datacamp', 'tutorial']
for i in range(len(sequence)):
element = sequence[i]
if type(element) == int:
sequence[i] = element + 4
print(sequence)
# [5, 6, 12, 104, 204, 'datacamp', 'tutorial']
Mooi toch? Je kon de elementen van de lijst aanpassen op basis van de if-voorwaarde.
Bekijk nu hoe je oneven getallen tussen 1 en 20 kunt printen. Daarvoor definieer je drie dingen in de range-functie: het startpunt, het eindpunt en de stapgrootte (het increment) waarmee de loop over de getallen 1–20 heen gaat.
for i in range(1,20,2):
print (i)
# 1
# 3
# 5
# 7
# 9
# 11
# 13
# 15
# 17
# 19
Geneste for-loop
for i in range(11):
for j in range(i):
print (i, end=' ')
print()
# 1
# 2 2
# 3 3 3
# 4 4 4 4
# 5 5 5 5 5
# 6 6 6 6 6 6
# 7 7 7 7 7 7 7
# 8 8 8 8 8 8 8 8
# 9 9 9 9 9 9 9 9 9
# 10 10 10 10 10 10 10 10 10 10
For-loop om over rijen en kolommen van een dataframe te itereren
import pandas as pd
iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
iris.head()
| sepal_length | sepal_width | petal_length | petal_width | species | |
|---|---|---|---|---|---|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
len(iris)
# 150
for i in range(len(iris)):
Class = iris.iloc[i,4]
if Class == 'versicolor' and i < 70:
print (Class)
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
Vervolgens tellen we twee op bij elke rij voor de kolommen sepal_length,sepal_width, petal_length en petal_width.
columns = ['sepal_length','sepal_width','petal_length','petal_width']
for indices, row in iris.iterrows():
for column in columns:
iris.at[indices,column] = row[column] + 2
iris.head()
| sepal_length | sepal_width | petal_length | petal_width | species | |
|---|---|---|---|---|---|
| 0 | 7.1 | 5.5 | 3.4 | 2.2 | setosa |
| 1 | 6.9 | 5.0 | 3.4 | 2.2 | setosa |
| 2 | 6.7 | 5.2 | 3.3 | 2.2 | setosa |
| 3 | 6.6 | 5.1 | 3.5 | 2.2 | setosa |
| 4 | 7.0 | 5.6 | 3.4 | 2.2 | setosa |
Itereren over een sequentie met een lambda-functie
Pythons lambda-functie is snel en krachtig vergeleken met de basale for-loop. Ze wordt veel gebruikt, vooral bij DataFrames. Je kunt je data verwerken met behulp van een Lambda-functie met heel weinig code. Soms is het alleen wat lastiger te lezen.
x = [20, 30, 40, 50, 60]
y = []
for v in x :
y += [v * 5]
print(y)
# [100, 150, 200, 250, 300]
Proberen we dit nu met een lambda- en map-functie.
Map neemt een functie (bijvoorbeeld een lambda-functie) en een sequentie x en geeft vervolgens een nieuwe sequentie terug.
x = [20, 30, 40, 50, 60]
y = map(lambda x: x * 5,x)
print(y)
# <map object at 0x4063cc8>
Die geeft een generator terug; om de output van de generator te krijgen, geef je de output door aan list.
x = [20, 30, 40, 50, 60]
y = map(lambda x: x * 5,x)
print(list(y))
# [100, 150, 200, 250, 300]
Laten we nu een stap terug doen en zowel de for-loop als de lambda/map()-combinatie bekijken. Je ziet dat het verschil zit in het toevoegen van map, lambda en het weglaten van "for" en "in". En bovendien kon je het in één regel schrijven.
Conclusie
Gefeliciteerd met het afronden van deze basis-tutorial over Python For-loops.
For-loops zijn de ruggengraat van elke programmeertaal en in Python zijn ze helemaal niet lastig om te schrijven; ze lijken qua leesbaarheid zelfs een beetje op gewone zinnen.
Wil je meer leren over for-loops in Python? Volg dan de cursus Python Data Science Toolbox (Part 2) van DataCamp.
Stel gerust je vragen over deze tutorial in de reacties hieronder.
