Giới thiệu
Giống như các ngôn ngữ lập trình khác, vòng lặp for trong Python hơi khác ở chỗ chúng hoạt động giống một bộ lặp (iterator) hơn là chỉ là một từ khóa for. Trong Python, không có cú pháp kiểu C như for(i=0; i<n; i++) mà bạn dùng for in n.
Chúng có thể được dùng để lặp qua một chuỗi thuộc kiểu list, string, tuple, set, array, data frame.
Với một danh sách phần tử, vòng lặp for có thể được dùng để lặp qua từng mục trong danh sách đó và thực thi.
Để lặp qua một dãy mục, vòng lặp For dùng hàm range. Hàm range trả về một danh sách mới gồm các số trong khoảng được chỉ định dựa trên độ dài của chuỗi.
Khi lặp qua một chuỗi, bạn cũng có thể dùng chỉ số của phần tử trong chuỗi để lặp, nhưng mấu chốt là trước tiên tính độ dài của danh sách rồi lặp trong phạm vi độ dài này.
Vòng lặp for trong Python bắt đầu từ chỉ số 0.
Hãy nhanh chóng chuyển sang phần triển khai.
Bạn cũng có thể xem video này để có hướng dẫn nhanh!
Bắt đầu học Python miễn phí
Nhập môn Khoa học Dữ liệu với Python
Triển khai vòng lặp
Đầu tiên, hãy in ra các số từ 1–10. Vì vòng lặp for trong Python đánh chỉ số từ 0 nên bạn sẽ cần cộng thêm một ở mỗi lần lặp; nếu không, kết quả sẽ là 0–9.
for i in range(10):
print (i+1)
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
Hãy lặp qua chuỗi của từ Datacamp bằng vòng lặp for và chỉ in chữ cái a.
for i in "Datacamp":
if i == 'a':
print (i)
# a
# a
# a
Giả sử bạn muốn định nghĩa một danh sách phần tử và lặp qua từng phần tử một.
sequence = [1, 2, 8, 100, 200, 'datacamp', 'tutorial']
for i in sequence:
print (i)
# 1
# 2
# 8
# 100
# 200
# datacamp
# tutorial
Nhưng nếu bạn muốn tìm độ dài của danh sách rồi mới lặp qua thì sao? Bạn sẽ dùng hàm dựng sẵn len cho việc đó và sau đó áp dụng range lên kết quả độ dài.
Hãy nhớ rằng range luôn kỳ vọng một giá trị nguyên.
sequence = [1, 2, 8, 100, 200, 'datacamp', 'tutorial']
for i in range(len(sequence)):
print (sequence[i])
# 1
# 2
# 8
# 100
# 200
# datacamp
# tutorial
Tuyệt! Nhưng tại sao cần dùng hàm len khi bạn có thể dùng trực tiếp for i in numbers? Câu trả lời rất đơn giản. Nếu bạn muốn sửa đổi hoặc làm việc với chỉ số của chuỗi, như thay đổi phần tử trong một danh sách hiện có, thì bạn sẽ cần range(len(sequence)).
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']
Ngầu phải không? Bạn đã có thể sửa đổi các phần tử của danh sách dựa trên điều kiện if.
Bây giờ hãy xem cách in ra các số lẻ từ 1 đến 20. Để làm được điều này, bạn sẽ phải xác định ba thứ trong hàm range: điểm bắt đầu, điểm kết thúc và giá trị gia tăng (hoặc bước nhảy) mà vòng lặp sẽ tăng dần trong khoảng 1–20.
for i in range(1,20,2):
print (i)
# 1
# 3
# 5
# 7
# 9
# 11
# 13
# 15
# 17
# 19
Vòng lặp For lồng nhau
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
Vòng lặp For để lặp qua các hàng và cột của dataframe
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
Tiếp theo, hãy cộng thêm hai vào mọi hàng của các cột sepal_length,sepal_width, petal_length và 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 |
Lặp qua một chuỗi với hàm Lambda
Hàm lambda của Python nhanh và mạnh hơn so với vòng lặp for cơ bản. Nó được dùng rộng rãi, đặc biệt khi làm việc với DataFrame. Bạn có thể xử lý dữ liệu nhờ hàm Lambda với rất ít mã. Tuy nhiên, đôi khi nó cũng khó hiểu.
x = [20, 30, 40, 50, 60]
y = []
for v in x :
y += [v * 5]
print(y)
# [100, 150, 200, 250, 300]
Bây giờ, hãy thử cách này với hàm lambda và map.
Map nhận vào một hàm, chẳng hạn một hàm lambda, và một chuỗi x, rồi trả về một chuỗi mới.
x = [20, 30, 40, 50, 60]
y = map(lambda x: x * 5,x)
print(y)
# <map object at 0x4063cc8>
Nó trả về một hàm sinh (generator) và để lấy kết quả từ generator, bạn truyền đầu ra đó làm đối số cho list.
x = [20, 30, 40, 50, 60]
y = map(lambda x: x * 5,x)
print(list(y))
# [100, 150, 200, 250, 300]
Giờ hãy nhìn lại cả cách dùng vòng lặp for và kết hợp lambda/map(). Bạn sẽ thấy khác biệt nằm ở chỗ thêm map, lambda, và bỏ đi "for" và "in". Và bạn cũng đã có thể viết xong chỉ trong một dòng.
Kết luận
Chúc mừng bạn đã hoàn thành hướng dẫn cơ bản về vòng lặp For trong Python.
Vòng lặp For là xương sống của mọi ngôn ngữ lập trình, và với Python, dùng vòng lặp For hoàn toàn không khó để viết, hơn nữa còn khá giống viết một câu tiếng Anh.
Nếu bạn muốn tìm hiểu thêm về vòng lặp for trong Python, hãy học khóa Python Data Science Toolbox (Phần 2) của DataCamp.
Vui lòng đặt câu hỏi liên quan đến hướng dẫn này trong phần bình luận bên dưới.