Tên khi định nghĩa và dữ liệu khi gọi
Trong `def hieu(a, b):`, `a` và `b` là **tham số**. Với `hieu(9, 4)`, 9 và 4 là **đối số**; theo thứ tự, a nhận 9 và b nhận 4. Mã sau dùng một hàm cho hai bộ dữ liệu:
```python
def hieu(a, b):
return a - b
print(hieu(9, 4))
print(hieu(4, 9))
```
Hai dòng là `5` và `-5`. Đảo đối số có thể đổi kết quả. Nếu lời gọi thiếu một đối số bắt buộc, Python báo `TypeError` thay vì tự lấy 0.
Bài luyện
Trong `def hieu(a, b): ...`, a và b gọi là gì?
Đối số nằm ở lời gọi.
Chúng là tên khai báo khi định nghĩa hàm.
Giá trị trả về do return cung cấp.
Tên hàm là hieu.
Lời giải
`a`, `b` xuất hiện trong phần định nghĩa `def`, nên là tham số.
Bài luyện
`hieu(4, 9)` cho giá trị nào?
Đó là hieu(9,4).
a=4, b=9 nên a-b=-5.
Đó là phép cộng.
Có đủ hai đối số.
Lời giải
Hai đối số theo thứ tự gán a=4, b=9; hàm trả `4-9=-5`.
Bài luyện
Nếu gọi `hieu(9)` với định nghĩa trong bài, kết quả nào đúng?
Không thể tính khi thiếu b.
Python không mặc định b=0.
Hàm không kịp trả None.
Định nghĩa đòi hai đối số, lời gọi chỉ có một.
Lời giải
`hieu(a,b)` cần hai đối số bắt buộc. Chỉ đưa 9 cho a, thiếu b nên Python báo `TypeError`.
Tách công việc có thể gọi nhiều lần
Ví dụ cần tính tổng các số dương trong hai danh sách. Đưa phần lặp vào một hàm; danh sách A chỉ được **đọc**, không bị thay đổi:
```python
def tong_duong(A):
s = 0
for x in A:
if x > 0:
s = s + x
return s
print(tong_duong([3, -1, 5]))
print(tong_duong([-2, 0]))
```
Kết quả là `8` và `0`. Hàm nhận một list mỗi lần gọi; nếu không có số dương, tổng tích lũy giữ 0.
Bài luyện
`tong_duong([-2, 0])` trả số nào?
-2 không dương.
Không phần tử nào lớn hơn 0 nên s giữ 0.
Không lấy trị tuyệt đối.
Hàm có return s.
Lời giải
Vòng lặp xét -2 và 0, cả hai không thỏa `x>0`. Biến s vẫn là 0 và được trả về.
Đang học