Trường ĐH Công nghệ – Đại học Quốc gia Hà Nội
Đưa chú chim tới chú heo và tránh thuốc nổ TNT:
Vòng lặp for trong Python:
for i in range(3):
move_forward()
In từng phần tử của danh sách lst
print("The list contains:")
print(lst[0]) # in phần tử ở chỉ số 0
print(lst[1]) # in phần tử ở chỉ số 1
# ...
‼️ Vấn đề: Ta không biết phải dừng lại ở đâu!
Ta thường cần lặp lại hành động:
→ Cần một cách kiểm soát việc lặp dựa trên dữ liệu vào…
for <biến> in <dãy>:
<câu-lệnh-1>
...
<câu-lệnh-n>
for item in lst:
print(item)
for <biến> in <dãy>:
<câu-lệnh-1>
...
<câu-lệnh-n>
for item in lst:
print(item)
for x in seq:
body
print("The string contains:")
# in mỗi ký tự của chuỗi s trên một dòng
for char in s:
print(char)
💡 Các ký tự trong chuỗi được xem như là các phần tử của một dãy.
Hàng số 4 sẽ được thực thi bao nhiêu lần?
def mystery_function(s):
"""Điều kiện: s là chuỗi."""
for v in 'aeiou':
if v in s:
return True
return False
Hàng số 4 sẽ được thực thi bao nhiêu lần?
def mystery_function(s):
"""Điều kiện: s là chuỗi."""
for v in 'aeiou':
if v in s:
return True
return False
def avg(lst):
"""Trả về: trung bình của tất cả phần tử trong lst.
Điều kiện: lst là danh sách không rỗng
và mỗi phần tử là float hoặc int."""
# 1. Gán num bằng tổng của tất cả phần tử trong lst
# 2. Gán den bằng số lượng phần tử của lst
# 3. Trả về num/den
return 0
def avg(lst):
"""Trả về: trung bình của tất cả phần tử trong lst.
Điều kiện: lst là danh sách không rỗng
và mỗi phần tử là float hoặc int."""
# 1. Gán num bằng tổng của tất cả phần tử trong lst
num = 0 # TODO
# 2. Gán den bằng số lượng phần tử của lst
den = len(lst)
# 3. Trả về num/den
return 0
💡 Làm phần nào chắc chắn trước. Phần chưa rõ: đặt biến tạm thời.
# ...
# 1. Gán num bằng tổng của tất cả phần tử trong lst
num = 0
for x in lst:
num = num + x
# 2. ...
Thực thi:
def avg(lst):
"""Trả về: trung bình của tất cả phần tử trong lst.
Điều kiện: lst là danh sách không rỗng
và mỗi phần tử là float hoặc int."""
# 1. Gán num bằng tổng của tất cả phần tử trong lst
num = 0
for x in lst:
num = num + x
# 2. Gán den bằng số lượng phần tử của lst
den = len(lst)
# 3. Trả về num/den
return num/den
def avg(lst):
"""Trả về: trung bình của tất cả phần tử trong lst.
Điều kiện: lst là danh sách không rỗng
và mỗi phần tử là float hoặc int."""
num = 0 # biến tích luỹ (accumulator)
for x in lst:
num = num + x
den = len(lst)
return num/den
biến_tích_luỹ = <giá-trị-ban-đầu>
for item in seq:
...
biến_tích_luỹ = biến_tích_luỹ <toán-tử> item
...
# biến_tích_luỹ bây giờ chứa giá trị tích luỹ
num = 0
for x in lst:
num = num + x
# num bây giờ chứa tổng các phần tử trong lst
Xem file accumulators.py
def count(n):
"""In các số 1, 2, ..., n; mỗi số trên một dòng.
Điều kiện: n là số nguyên >= 1."""
# Tạo danh sách 1..n
# Lặp qua danh sách và in từng phần tử
pass
def count(n):
"""In các số 1, 2, ..., n; mỗi số trên một dòng.
Điều kiện: n là số nguyên >= 1."""
# Tạo danh sách [1, 2, ..., n]
nums = [1] # TODO
# Lặp qua danh sách và in từng phần tử
for num in nums:
print(num)
💡 Làm phần nào chắc chắn trước. Phần chưa rõ: đặt biến tạm thời.
# Tạo danh sách [1, 2, ..., n]
nums = [1] # TODO
# Tạo danh sách [1, 2, ..., n]
nums = []
for i in n:
nums.append(i)
>>> r = range(3)
>>> r
range(0, 3)
>>> list(r)
[0, 1, 2]
>>> list(range(1, 3))
[1, 2]
>>> len(r)
3
>>> r.start
0
>>> r.stop
3
>>> r[0]
0
>>> r[1]
1
# Tạo danh sách [1, 2, ..., n]
nums = list(range(1, n+1))
def count(n):
"""In các số 1, 2, ..., n; mỗi số trên một dòng.
Điều kiện: n là số nguyên >= 1."""
# Tạo danh sách [1, 2, ..., n]
nums = list(range(1, n+1))
# Lặp qua danh sách và in từng phần tử
for num in nums:
print(num)
def count(n):
"""In các số 1, 2, ..., n; mỗi số trên một dòng.
Điều kiện: n là số nguyên >= 1."""
# Tạo dãy số từ 1 đến n và in từng số
for num in range(1, n+1):
print(num)
def print_list(lst):
"""In từng phần tử trong lst, mỗi phần tử trên một dòng."""
for item in lst:
print(item)
def count(n):
"""In các số 1, 2, ..., n; mỗi số trên một dòng.
Điều kiện: n là số nguyên >= 1."""
# Tạo danh sách [1, 2, ..., n]
nums = list(range(1, n+1))
# In danh sách
print_list(nums) # gọi hàm phụ
def count(n):
"""In các số 1, 2, ..., n; mỗi số trên một dòng.
Điều kiện: n là số nguyên >= 1."""
print_list(list(range(1, n+1)))
⚠️ Lưu ý: Rút gọn số dòng không phải mục tiêu. Hãy ưu tiên cách viết dễ đọc cho người mới học.
def incr_list_wrong(nums):
"""Tăng thêm 1 cho mỗi phần tử trong nums.
Ví dụ: Biến đổi danh sách đầu vào [6,0,7] thành [7,1,8].
Điều kiện: Danh sách nums chỉ chứa số."""
# Lặp qua các phần tử trong nums, tăng chúng lên 1
# ⚠️ Cách này sai: chỉ thay đổi biến vòng lặp
for n in nums:
n = n + 1
>>> lst = [6, 0, 7]
>>> incr_list_wrong(lst)
>>> lst
[6, 0, 7]
for <var> in <seq>:
<statement>
...
<statement>
for item in lst:
print(item)
Mỗi vòng lặp gán phần tử kế tiếp của <seq> cho <var> rồi chạy thân vòng lặp.
def incr_list_wrong(nums):
for n in nums:
n = n + 1
lst = [6, 0, 7]
incr_list_wrong(lst)
>>> r = range(3)
>>> r
range(0, 3)
>>> list(r)
[0, 1, 2]
>>> r[0]
0
>>> r[1]
1
def incr_list(nums):
"""Tăng thêm 1 cho mỗi phần tử trong nums.
Ví dụ: [6,0,7] -> [7,1,8].
Điều kiện: nums chỉ chứa số."""
for i in range(len(nums)):
nums[i] = nums[i] + 1
>>> lst = [6, 0, 7]
>>> incr_list(lst)
>>> lst
[7, 1, 8]
def incr_list_wrong(nums):
for i in range(len(nums)):
nums[i] = nums[i] + 1
lst = [6, 0, 7]
incr_list_wrong(lst)
for item in lst:
# dùng item
print(item)
for idx in range(len(lst)):
# dùng lst[idx]
lst[idx] = lst[idx] + 1
Hàm enumerate(iterable, start=0) trả về một iterator của các bộ (index, item).
a = ["I", "am", "UET"]
# Lặp để lấy cả chỉ số và phần tử
for i, name in enumerate(a):
print(f"Index {i}: {name}")
# Đổi vị trí bắt đầu của chỉ số
for i, name in enumerate(a, start=1):
print(f"{i}) {name}")
# Chuyển thành danh sách các bộ (index, item)
pairs = list(enumerate(a))
print(pairs) # [(0, 'I'), (1, 'am'), (2, 'UET')]
| Dữ liệu | Tổ chức |
|---|---|
| Dàn ý bài luận | Gạch đầu dòng, gạch con, gạch con của gạch con |
| Nội dung cuốn sách | Chương, đoạn, câu, từ |
| Video | Khung hình (frame), điểm ảnh |
| Bảng tính | Hàng và cột |
💡 Đây đều là cấu trúc phân cấp: danh sách của danh sách, danh sách của danh sách của danh sách, …
Danh sách (list) trong Python:
→ Danh sách có thể chứa các danh sách khác
lst = [
[2, 4],
[3, 6, 9],
[4, 8, 12, 16]
]
Một bộ kiểm tra chính tả có thể xem bài thơ như danh sách lồng nhau:
[["The", "light", "of", "a", "candle"],
["Is", "transferred", "to", "another", "candle—"],
["spring", "twilight."]]
def print_list(lst):
"""In danh sách lst, mỗi phần tử trên một dòng."""
for word in lst:
print(word)
def print_haiku_with_helper(h):
"""In bài haiku h, một danh sách các danh sách chuỗi."""
for line in h:
print_list(line)
def print_haiku(h):
"""In bài haiku h, một danh sách các danh sách chuỗi."""
for line in h:
for word in line:
print(word)
| Vòng lặp | Biến vòng lặp | Dãy để lặp |
|---|---|---|
| Ngoài | line | h |
| Trong | word | line |
>>> h = [['The', 'light', 'of', 'a', 'candle'],
... ['Is', 'transferred', 'to', 'another', 'candle—'],
... ['spring', 'twilight.']]
>>> len(h) # độ dài danh sách ngoài
3
>>> len(h[0]) # độ dài danh sách trong đầu tiên
5
>>> h[2][0] # phần tử hàng 2, cột 0
'spring'
>>> h[2][1] = 'dawning' # gán phần tử hàng 2, cột 1
>>> b = [[9, 6], [4, 5], [7, 7]]
>>> x = b[:2] # sao chép *cấp trên cùng*
>>> x
[[9, 6], [4, 5]]
>>> x[0][0] = 100 # thay đổi phần tử bên trong
>>> b
[[100, 6], [4, 5], [7, 7]]
>>> b = [[9, 6], [4, 5], [7, 7]]
>>> x = b[:2]
>>> x[1].append(10)
>>> x
| NetID | A1 | A2 | A3 |
|---|---|---|---|
| abc1 | 100 | 95 | 97 |
| def2 | 100 | 80 | 92 |
[
['NetID', 'abc1', 'def2'],
['A1', 100, 100],
['A2', 95, 80],
['A3', 97, 92]
]
[
['NetID', 'A1', 'A2', 'A3'],
['abc1', 100, 95, 97],
['def2', 100, 80, 92]
]
Danh sách 2D: một danh sách của các danh sách
Hình chữ nhật: mọi danh sách con có cùng độ dài
Răng cưa: không phải hình chữ nhật
[['The', 'light', 'of', 'a', 'candle'],
['Is', 'transferred', 'to', 'another', 'candle—'],
['spring', 'twilight.']]
[['NetID', 'A1', 'A2', 'A3'],
['abc1', 100, 95, 97],
['def2', 100, 80, 92]]
def avg_tab(tab):
"""Trả về giá trị trung bình của tab, một danh sách 2D các số."""
sum = 0
count = 0
for inner_list in tab: # lặp theo hàng
for number in inner_list: # lặp theo phần tử trong hàng
sum = sum + number # tích luỹ tổng
count = count + 1 # tích luỹ số lượng
return sum / count
def add1_tab(tab):
"""Cộng 1 vào từng số trong tab (thay đổi trực tiếp tab)."""
for r in range(len(tab)): # chỉ số hàng
for c in range(len(tab[r])): # chỉ số cột
old_val = tab[r][c]
tab[r][c] = old_val + 1
def transpose(tab):
"""Trả về ma trận chuyển vị của tab.
Điều kiện: tab hình chữ nhật (mọi hàng cùng độ dài)."""
rows = len(tab)
cols = len(tab[0])
out = []
for c in range(cols):
row_new = []
for r in range(rows):
row_new.append(tab[r][c])
out.append(row_new)
return out