CodeGym /Các khóa học /Python SELF VI /Công việc nâng cao với các tham số hàm

Công việc nâng cao với các tham số hàm

Python SELF VI
Mức độ , Bài học
Có sẵn

7.1 Nhận tất cả các đối số của hàm

Trong Python có một số cách rất tiện lợi để nhận danh sách tất cả các tham số được truyền vào một hàm từ bên trong hàm đó. Hãy cùng tìm hiểu chúng.

Sử dụng *args

*args cho phép truyền số lượng đối số vị trí tự do vào hàm. Các đối số này được đóng gói vào một tuple và có thể được xử lý bên trong hàm.


def print_numbers(*args):
    for arg in args:
        print(arg)
        
print_numbers(1, 2, 3, 4, 5)

Giải thích

Hàm print_numbers nhận số lượng đối số vị trí tự do, được đóng gói trong tuple args. Chúng ta có thể duyệt qua các đối số bên trong hàm bằng cách sử dụng vòng lặp for.

Ưu điểm

  • Linh hoạt: Cho phép truyền bất kỳ số lượng đối số nào vào hàm.
  • Đa dụng: Có thể sử dụng cho các hàm với số lượng tham số không xác định.

Sử dụng **kwargs

**kwargs cho phép truyền số lượng đối số có tên tự do vào hàm. Các đối số này được đóng gói vào một từ điển và có thể được xử lý bên trong hàm.


def print_person_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
        
print_person_info(name="Alice", age=30, city="New York")

Giải thích

Hàm print_person_info nhận số lượng đối số có tên tự do, được đóng gói trong từ điển kwargs. Chúng ta có thể duyệt qua các đối số bên trong hàm bằng phương thức items() của từ điển.

Ưu điểm

  • Linh hoạt: Cho phép truyền bất kỳ số lượng đối số có tên nào vào hàm.
  • Dễ đọc: Các đối số có tên làm cho việc gọi hàm dễ đọc hơn.

7.2 Cố định kiểu đối số

Chỉ đối số vị trí

Trong Python 3.8 trở lên, chúng ta có thể định nghĩa hàm với các đối số chỉ có thể truyền theo vị trí. Điều này được thực hiện bằng cách sử dụng ký hiệu / trong định nghĩa hàm.


def greet(name, /, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet("Alice")  # Xuất: Hello, Alice!
greet("Alice", greeting="Hi")  # Xuất: Hi, Alice!
# greet(name="Alice")  # Lỗi: TypeError

Giải thích

Hàm greet nhận đối số name, chỉ có thể truyền theo vị trí. Các đối số trước / chỉ có thể truyền theo vị trí.

Cách tiếp cận này giúp hạn chế cách truyền đối số, cải thiện tính dễ đọc và ngăn ngừa lỗi.

Chỉ đối số có tên (Keyword-Only Arguments)

Chúng ta cũng có thể định nghĩa các tham số hàm chỉ có thể truyền theo tên. Điều này được thực hiện bằng cách sử dụng ký hiệu * trong định nghĩa hàm.


def greet(*, name, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet(name="Alice")  # Xuất: Hello, Alice!
greet(name="Alice", greeting="Hi")  # Xuất: Hi, Alice!
# greet("Alice")  # Lỗi: TypeError

Hàm greet nhận đối số name, chỉ có thể truyền theo tên. Các đối số sau * chỉ có thể truyền theo tên.

Cách tiếp cận này buộc phải chỉ rõ tên của các đối số, cải thiện tính dễ đọc của mã.

Kết hợp đối số vị trí và có tên

Cũng có thể kết hợp đối số vị trí và có tên để đạt được tính linh hoạt tối đa.


def greet(name, /, *, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet("Alice")  # Xuất: Hello, Alice!
greet("Alice", greeting="Hi")  # Xuất: Hi, Alice!
# greet(name="Alice")  # Lỗi: TypeError

Hàm greet nhận đối số name, chỉ có thể truyền theo vị trí, và đối số có tên greeting, nhất định phải được truyền theo tên. Sử dụng cả /* cho phép kết hợp đối số vị trí và có tên.

Ví dụ đầy đủ về cả ba tình huống:


def full_example(a, b, /, c, d, *, e, f):
    print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
        
# Gọi hàm với các đối số khác nhau
full_example(1, 2, 3, 4, e=5, f=6)  # Tất cả các đối số được truyền chính xác
# full_example(a=1, b=2, c=3, d=4, e=5, f=6)  # Lỗi: TypeError

Giải thích

  • Chỉ đối số vị trí: ab phải được truyền theo vị trí.
  • Đối số vị trí hoặc có tên thông thường: cd có thể được truyền cả theo vị trí và theo tên.
  • Chỉ đối số có tên: ef phải được truyền theo tên.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION