Một lời gọi dùng lại một việc đã có
Các lệnh `len([3, 5])`, `int("12")` và `print("xong")` đều là lời gọi hàm: tên hàm đi cùng dấu ngoặc tròn. Giá trị đặt trong ngoặc là dữ liệu được đưa vào. `len([3, 5])` cho kết quả 2; `int("12")` cho số nguyên 12. `print("xong")` hiển thị chữ `xong`; giá trị trả về của chính lời gọi `print` là `None`, nên không dùng nó như số hay xâu vừa in.
Khi một thao tác được dùng ở nhiều nơi, đặt nó trong hàm giúp viết rõ nhiệm vụ và gọi lại với dữ liệu khác.
Bài luyện
Biểu thức `len([3, 5])` cho giá trị nào?
Danh sách có hai phần tử.
len trả độ dài, không trả lại danh sách.
5 là giá trị một phần tử.
len có trả giá trị.
Lời giải
`len` đếm hai phần tử 3 và 5 nên trả số nguyên 2.
Bài luyện
Lệnh nào gọi hàm `int` để đổi xâu `"12"` thành số nguyên?
Thiếu dấu ngoặc của lời gọi.
Tên hàm đi với dấu ngoặc và đối số.
Đây không phải cú pháp gọi int.
Đây là phép gán, không gọi hàm.
Lời giải
`int("12")` gọi hàm `int` với đối số là xâu `"12"`, kết quả là số nguyên 12.
Tạo hàm bằng def
`def` đặt tên hàm và danh sách tham số. Sau dấu `:` là thân hàm viết thụt vào. Định nghĩa hàm chưa chạy thân hàm; phải gọi hàm. Nhiệm vụ: lưu mã sau vào tệp `.py`, chạy và so kết quả:
```python
def nhan_doi(n):
return n * 2
print(nhan_doi(4))
print(nhan_doi(7))
```
Kết quả là hai dòng `8` và `14`. Cùng một khối tính được dùng lại với hai đầu vào khác nhau. Dòng `return` đưa kết quả về chỗ gọi và kết thúc lượt chạy của hàm.
Bài luyện
Sau khi chạy mã `nhan_doi` trong bài, dòng thứ hai in gì?
7 là đối số, chưa nhân.
8 là kết quả lời gọi thứ nhất.
7 nhân 2 bằng 14.
28 là 14 nhân tiếp 2, mã không làm vậy.
Lời giải
Lời gọi thứ hai đưa 7 vào tham số n. Hàm trả `7 * 2 = 14`; `print` in 14.
Bài luyện
Nếu chỉ có phần `def nhan_doi(n): ...` mà chưa gọi hàm, điều gì xảy ra?
Định nghĩa không đồng nghĩa với gọi.
Cần lời gọi để thực hiện thân hàm.
Không có lệnh in trong định nghĩa này.
Định nghĩa hợp lệ.
Lời giải
Lệnh `def` tạo hàm. Chỉ khi gọi `nhan_doi(...)`, Python mới chạy các lệnh trong thân hàm.
Đang học