1. Để tránh việc thay đổi dữ liệu gốc khi truyền các kiểu dữ liệu có thể thay đổi (mutable) làm tham số, lập trình viên thường làm gì?
A. Không bao giờ truyền các kiểu dữ liệu có thể thay đổi.
B. Tạo một bản sao (copy) của đối tượng và truyền bản sao đó cho hàm.
C. Chỉ sử dụng các kiểu dữ liệu không thể thay đổi (immutable).
D. Đặt lại giá trị của tham số về ban đầu sau khi sử dụng.
2. Trong một lời gọi hàm, các giá trị cụ thể được truyền vào hàm tương ứng với các tham số hình thức được gọi là gì?
A. Tham số hình thức (Formal parameters).
B. Biến cục bộ (Local variables).
C. Đối số (Arguments).
D. Hằng số (Constants).
3. Xét hàm Python: `def tinh_chu_vi_hcn(rong, cao): return 2 * (rong + cao)`. Nếu ta muốn tính chu vi hình chữ nhật có chiều rộng là 7 và chiều cao là 4, ta nên gọi hàm như thế nào để rõ ràng nhất?
A. tinh_chu_vi_hcn(7, 4)
B. tinh_chu_vi_hcn(cao=4, rong=7)
C. tinh_chu_vi_hcn(rong=7, cao=4)
D. Cả A, B, C đều đúng và rõ ràng.
4. Xét hàm Python: `def chao_mung(ten, loi_chuc=Chào bạn): print(f{loi_chuc}, {ten}!)`. Nếu gọi `chao_mung(An)`, kết quả in ra màn hình là gì?
A. Chào bạn, An!
B. An, Chào bạn!
C. Chào, An!
D. Lỗi: thiếu lời chúc.
5. Khi một hàm không nhận bất kỳ tham số nào, nó được gọi là gì?
A. Hàm có tham số mặc định.
B. Hàm với đối số tùy chọn.
C. Hàm không có tham số (function without parameters).
D. Hàm có tham số ẩn.
6. Trong trường hợp nào việc sử dụng đối số có tên (keyword arguments) trở nên hữu ích khi gọi hàm?
A. Khi hàm chỉ có một tham số.
B. Khi hàm có nhiều tham số và ta muốn truyền giá trị cho các tham số không theo thứ tự khai báo hoặc chỉ truyền cho một vài tham số cụ thể.
C. Khi ta muốn giấu tên của các tham số khỏi người dùng.
D. Khi ta muốn hàm chạy nhanh hơn.
7. Trong lập trình, tại sao việc định nghĩa hàm rõ ràng với các tham số và kiểu dữ liệu mong đợi lại quan trọng?
A. Để làm cho chương trình khó hiểu hơn.
B. Để giúp người lập trình khác (hoặc chính mình trong tương lai) hiểu cách sử dụng hàm và để trình biên dịch/thông dịch có thể kiểm tra lỗi sớm.
C. Để giảm số lượng dòng code.
D. Để tăng tốc độ thực thi của hàm.
8. Tại sao việc đặt tên tham số hàm một cách rõ ràng và mang tính mô tả lại quan trọng trong phát triển phần mềm?
A. Để câu hỏi trắc nghiệm thêm khó.
B. Để tối ưu hóa bộ nhớ.
C. Để tăng tính dễ đọc, dễ hiểu và bảo trì code, giúp người khác nắm bắt ý nghĩa của dữ liệu mà hàm xử lý.
D. Để tuân thủ một quy tắc bắt buộc của mọi ngôn ngữ lập trình.
9. Khái niệm tham số mặc định (default parameter) trong khai báo hàm có ý nghĩa gì?
A. Là tham số bắt buộc phải có khi gọi hàm.
B. Là tham số mà nếu không được cung cấp giá trị khi gọi hàm, nó sẽ tự động nhận một giá trị định trước.
C. Là tham số chỉ có thể là số nguyên.
D. Là tham số chỉ được sử dụng một lần duy nhất.
10. Một hàm có thể nhận bao nhiêu tham số?
A. Chỉ một tham số.
B. Tối đa hai tham số.
C. Không giới hạn về số lượng, tùy thuộc vào ngôn ngữ lập trình và mục đích sử dụng.
D. Chỉ có thể có tham số mặc định.
11. Trong lập trình, tham số giúp hàm trở nên:
A. Cố định và không thay đổi.
B. Chuyên biệt hóa cho một tác vụ duy nhất.
C. Linh hoạt và tái sử dụng được.
D. Phức tạp và khó hiểu.
12. Tại sao việc sử dụng tham số mặc định lại giúp code linh hoạt hơn?
A. Nó làm cho hàm luôn trả về cùng một kết quả.
B. Nó cho phép người dùng gọi hàm mà không cần cung cấp đầy đủ tất cả các giá trị, giảm thiểu việc phải nhớ và nhập nhiều tham số.
C. Nó tự động kiểm tra lỗi cú pháp.
D. Nó chỉ cho phép sử dụng các kiểu dữ liệu cơ bản.
13. Trong lập trình, khái niệm tham số của hàm (function parameter) thường được hiểu là gì?
A. Là tên của hàm được sử dụng để gọi hàm.
B. Là các biến hoặc giá trị mà ta cung cấp cho hàm khi gọi nó để hàm thực hiện công việc.
C. Là kết quả trả về của hàm sau khi thực thi.
D. Là các khối lệnh bên trong hàm để thực hiện một tác vụ cụ thể.
14. Khi truyền một kiểu dữ liệu không thể thay đổi (immutable type) như số nguyên hoặc chuỗi làm đối số cho hàm, và ta thay đổi giá trị của tham số đó bên trong hàm, điều gì xảy ra với biến gốc bên ngoài hàm?
A. Biến gốc cũng bị thay đổi.
B. Biến gốc sẽ bị xóa.
C. Biến gốc không bị ảnh hưởng.
D. Hàm sẽ trả về giá trị của biến gốc.
15. Xét hàm Python: `def nhan_ba(x): return x * 3`. Nếu ta muốn tính `5 * 3`, `10 * 3`, `15 * 3` bằng hàm này, ta sẽ gọi hàm như thế nào?
A. Chỉ có thể gọi `nhan_ba(5)`.
B. Gọi `nhan_ba(5)`, `nhan_ba(10)`, `nhan_ba(15)`.
C. Gọi `nhan_ba(5, 10, 15)`.
D. Không thể sử dụng hàm này cho nhiều giá trị.
16. Trong các ngôn ngữ lập trình hiện đại, một hàm có thể được thiết kế để nhận các tham số có số lượng thay đổi. Khái niệm này thường được gọi là gì?
A. Tham số cố định.
B. Tham số bắt buộc.
C. Tham số biến đổi (Variadic parameters) hoặc đối số biến đổi (Variable arguments).
D. Tham số mặc định.
17. Khi một hàm nhận tham số là một đối tượng, truyền tham chiếu (pass by reference) và truyền giá trị (pass by value) khác nhau ở điểm nào?
A. Truyền tham chiếu luôn tạo bản sao.
B. Truyền giá trị luôn thay đổi đối tượng gốc.
C. Truyền tham chiếu cho phép hàm sửa đổi đối tượng gốc, còn truyền giá trị thì không.
D. Cả hai đều không ảnh hưởng đến đối tượng gốc.
18. Một hàm có thể có nhiều tham số. Khi gọi hàm, thứ tự truyền đối số có vai trò gì?
A. Thứ tự truyền đối số không quan trọng.
B. Thứ tự truyền đối số phải khớp với thứ tự khai báo tham số hình thức, trừ khi sử dụng đối số có tên.
C. Thứ tự truyền đối số chỉ quan trọng đối với tham số đầu tiên.
D. Thứ tự truyền đối số phải được sắp xếp theo thứ tự bảng chữ cái.
19. Điều gì xảy ra nếu số lượng đối số truyền vào khi gọi hàm ít hơn số lượng tham số hình thức mà không có giá trị mặc định?
A. Hàm vẫn chạy bình thường.
B. Chương trình sẽ báo lỗi missing argument hoặc tương tự.
C. Các tham số thiếu sẽ nhận giá trị là 0.
D. Hàm sẽ tự động thêm các tham số còn thiếu.
20. Xét hàm Python sau: `def tinh_tong(a, b): return a + b`. Khi gọi hàm này bằng `tinh_tong(5, 3)`, 5 và 3 là gì?
A. Tham số hình thức.
B. Biến toàn cục.
C. Đối số.
D. Hàm khác.
21. Khi một hàm được khai báo với các tham số, các tham số đó được gọi là gì?
A. Đối số (Arguments).
B. Biến toàn cục (Global variables).
C. Tham số hình thức (Formal parameters).
D. Kiểu dữ liệu trả về (Return type).
22. Trong Python, quy tắc đặt tham số mặc định là gì?
A. Tất cả các tham số có thể là tham số mặc định.
B. Các tham số mặc định phải được đặt trước các tham số không có giá trị mặc định.
C. Các tham số không có giá trị mặc định phải được đặt trước tất cả các tham số có giá trị mặc định.
D. Số lượng tham số mặc định không giới hạn.
23. Trong ngữ cảnh của hàm, tham số và đối số là hai khái niệm khác nhau nhưng liên quan. Lựa chọn nào mô tả đúng mối quan hệ này?
A. Tham số là giá trị được truyền, đối số là tên biến nhận giá trị.
B. Tham số là tên biến trong khai báo hàm, đối số là giá trị thực tế được truyền vào khi gọi hàm.
C. Hai khái niệm này hoàn toàn giống nhau và có thể dùng thay thế.
D. Tham số là kết quả trả về, đối số là dữ liệu đầu vào.
24. Khi một hàm nhận một tham số là một kiểu dữ liệu có thể thay đổi (mutable type) như danh sách (list) trong Python, điều gì có thể xảy ra nếu ta thay đổi tham số đó bên trong hàm?
A. Chỉ có bản sao của danh sách bị thay đổi.
B. Danh sách gốc bên ngoài hàm cũng bị thay đổi.
C. Hàm sẽ báo lỗi.
D. Danh sách sẽ bị xóa.
25. Khi khai báo một hàm, nếu ta muốn đảm bảo rằng một tham số luôn nhận được một giá trị cụ thể và không thể bị thay đổi bởi người gọi hàm, ta có thể làm gì?
A. Không khai báo tham số đó.
B. Sử dụng hằng số thay vì biến cho tham số đó (nếu ngôn ngữ hỗ trợ).
C. Chỉ định rõ kiểu dữ liệu của tham số.
D. Sử dụng tham số mặc định với giá trị cố định.