In ra khác với trả về
Hàm `binh_phuong` trả một số để lệnh khác có thể dùng tiếp. Hàm `bao_tin` chỉ in thông báo; khi không có `return` kèm giá trị, lời gọi trả `None`.
```python
def binh_phuong(n):
return n * n
def bao_tin():
print("Đã xong")
x = binh_phuong(3)
print(x + 1)
y = bao_tin()
print(y)
```
Ba dòng in lần lượt là `10`, `Đã xong`, `None`. `print` trong hàm chỉ hiển thị chữ, không đưa chữ đó thành giá trị của lời gọi.
Bài luyện
Trong mã trên, `x + 1` bằng bao nhiêu?
3 cộng 1 bỏ qua phép bình phương.
9 là x trước khi cộng 1.
binh_phuong(3) trả 9, cộng 1 thành 10.
Hàm có return giá trị.
Lời giải
`binh_phuong(3)` trả `3*3=9`; gán x=9 nên `x+1=10`.
Bài luyện
Sau lời gọi `y = bao_tin()`, y là gì?
Đó là chữ được in, không phải giá trị trả về.
10 thuộc hàm khác.
Hàm không có return kèm giá trị nên lời gọi trả None.
Python không tự trả 0.
Lời giải
`bao_tin()` in `Đã xong` nhưng không có `return` giá trị. Vì thế y nhận `None`.
return dừng hàm ngay
Một hàm có thể trả sớm khi gặp trường hợp đặc biệt:
```python
def chia_an_toan(a, b):
if b == 0:
return None
return a / b
print(chia_an_toan(8, 2))
print(chia_an_toan(8, 0))
```
Kết quả là `4.0` và `None`. Với b bằng 0, hàm dừng tại `return None`; phép chia phía sau không chạy. Đây là một cách biểu thị không có kết quả chia trong ví dụ này; khi dùng thực tế cần nói rõ quy ước đầu ra của hàm.
Bài luyện
Với `chia_an_toan(8, 0)`, lệnh nào được thực hiện cuối trong hàm?
b bằng 0 nên hàm dừng ngay ở nhánh này.
Lệnh này không chạy sau return đầu.
Đây không phải lệnh trong hàm.
Mã không đổi b.
Lời giải
Điều kiện `b == 0` đúng; `return None` kết thúc hàm trước phép chia.
Đang học