Bài 8.5. Python - Truyền số lượng tham số bất kỳ

Bài 8.5. Python - Truyền số lượng tham số bất kỳ
Đôi khi bạn sẽ không biết trước số lượng đối số mà một hàm cần chấp nhận. May mắn thay, Python cho phép một hàm thu thập một số lượng đối số tùy ý từ lệnh gọi hàm.
Ví dụ, hãy xem xét một hàm xây dựng một chiếc pizza. Nó cần chấp nhận một số lượng lớp phủ, nhưng bạn không thể biết trước số lượng lớp phủ mà một người sẽ muốn. Hàm trong ví dụ sau có một tham số, *toppings
, nhưng tham số này thu thập bao nhiêu đối số tùy ý mà lệnh gọi hàm cung cấp:
def make_pizza(*toppings):
"""In ra danh sách các lớp phủ đã được yêu cầu."""
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
Dấu hoa thị trong tên tham số *toppings
cho Python biết tạo một tuple gọi là toppings
, chứa tất cả các giá trị mà hàm nhận được. Lệnh print()
trong thân hàm tạo ra đầu ra cho thấy rằng Python có thể xử lý một lệnh gọi hàm với một giá trị và một lệnh gọi với ba giá trị. Nó xử lý các lệnh gọi khác nhau tương tự nhau. Lưu ý rằng Python đóng gói các đối số vào một tuple, ngay cả khi hàm chỉ nhận được một giá trị:
('pepperoni',)
('mushrooms', 'green peppers', 'extra cheese')
Bây giờ chúng ta có thể thay thế lệnh print()
bằng một vòng lặp chạy qua danh sách các lớp phủ và mô tả chiếc pizza đang được đặt hàng:
def make_pizza(*toppings):
"""Tóm tắt chiếc pizza chúng ta sắp làm."""
print("\nMaking a pizza with the following toppings:")
for topping in toppings:
print(f"- {topping}")
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
Hàm phản hồi phù hợp, dù nó nhận được một giá trị hay ba giá trị:
Making a pizza with the following toppings:
- pepperoni
Making a pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese
Cú pháp này hoạt động bất kể hàm nhận được bao nhiêu đối số.
Kết hợp đối số vị trí và đối số tùy ý
Nếu bạn muốn một hàm chấp nhận nhiều loại đối số khác nhau, tham số chấp nhận một số lượng đối số tùy ý phải được đặt cuối cùng trong định nghĩa hàm. Python khớp các đối số vị trí và từ khóa trước, sau đó thu thập bất kỳ đối số còn lại nào vào tham số cuối cùng.
Ví dụ, nếu hàm cần nhận kích thước của chiếc pizza, tham số đó phải đến trước tham số *toppings
:
def make_pizza(size, *toppings):
"""Tóm tắt chiếc pizza chúng ta sắp làm."""
print(f"\nMaking a {size}-inch pizza with the following toppings:")
for topping in toppings:
print(f"- {topping}")
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
Trong định nghĩa hàm, Python gán giá trị đầu tiên mà nó nhận được cho tham số size
. Tất cả các giá trị khác đến sau được lưu trữ trong tuple toppings
. Các lệnh gọi hàm bao gồm một đối số cho kích thước trước, sau đó là bao nhiêu lớp phủ tùy ý.
Bây giờ mỗi chiếc pizza có một kích thước và một số lượng lớp phủ, và mỗi mẩu thông tin được in ra đúng chỗ, hiển thị kích thước trước và lớp phủ sau:
Making a 16-inch pizza with the following toppings:
- pepperoni
Making a 12-inch pizza with the following toppings:
- mushrooms
- green peppers
- extra cheese
Sử dụng đối số từ khóa tùy ý
Đôi khi bạn sẽ muốn chấp nhận một số lượng đối số tùy ý, nhưng bạn sẽ không biết trước loại thông tin nào sẽ được truyền cho hàm. Trong trường hợp này, bạn có thể viết các hàm chấp nhận bao nhiêu cặp khóa-giá trị tùy ý mà lệnh gọi hàm cung cấp. Một ví dụ liên quan đến việc xây dựng hồ sơ người dùng: bạn biết bạn sẽ nhận được thông tin về một người dùng, nhưng bạn không chắc loại thông tin nào bạn sẽ nhận được. Hàm build_profile()
trong ví dụ sau luôn nhận tên và họ, nhưng nó cũng chấp nhận một số lượng đối số từ khóa tùy ý:
def build_profile(first, last, **user_info):
"""Xây dựng một từ điển chứa tất cả thông tin chúng ta biết về một người dùng."""
user_info['first_name'] = first
user_info['last_name'] = last
return user_info
user_profile = build_profile('albert', 'einstein', location='princeton', field='physics')
print(user_profile)
Định nghĩa của build_profile()
mong đợi tên và họ, sau đó nó cho phép người dùng truyền vào bao nhiêu cặp khóa-giá trị tùy ý. Dấu hoa thị kép trước tham số **user_info
khiến Python tạo một từ điển gọi là user_info
chứa tất cả các cặp khóa-giá trị bổ sung mà hàm nhận được. Bên trong hàm, bạn có thể truy cập các cặp khóa-giá trị trong user_info
giống như bạn làm với bất kỳ từ điển nào.
Trong thân hàm build_profile()
, chúng ta thêm tên và họ vào từ điển user_info
vì chúng ta sẽ luôn nhận được hai mẩu thông tin này từ người dùng, và chúng chưa được đặt vào từ điển. Sau đó, chúng ta trả về từ điển user_info
cho dòng gọi hàm.
Chúng ta gọi build_profile()
, truyền cho nó tên 'albert', họ 'einstein', và hai cặp khóa-giá trị location='princeton'
và field='physics'
. Chúng ta gán hồ sơ trả về cho user_profile
và in ra user_profile
:
{'location': 'princeton', 'field': 'physics', 'first_name': 'albert', 'last_name': 'einstein'}
Từ điển trả về chứa tên và họ của người dùng và, trong trường hợp này, vị trí và lĩnh vực nghiên cứu. Hàm sẽ hoạt động bất kể bao nhiêu cặp khóa-giá trị bổ sung được cung cấp trong lệnh gọi hàm.
Bạn có thể kết hợp các đối số vị trí, từ khóa và tùy ý theo nhiều cách khác nhau khi viết các hàm của riêng bạn. Điều quan trọng là biết rằng tất cả các loại đối số này tồn tại vì bạn sẽ thấy chúng thường xuyên khi bắt đầu đọc mã của người khác. Cần thực hành để sử dụng đúng các loại khác nhau và biết khi nào nên sử dụng từng loại. Hiện tại, hãy nhớ sử dụng cách tiếp cận đơn giản nhất để hoàn thành công việc. Khi bạn tiến bộ, bạn sẽ học cách sử dụng cách tiếp cận hiệu quả nhất mỗi lần.
Comments