Đối số tùy chọn Python

Đôi khi bạn có thể cần tạo hàm python với các đối số tùy chọn. Trong bài viết này, chúng ta sẽ tìm hiểu cách thực hiện điều này bằng cách sử dụng *args, **kwargs và sử dụng các giá trị đối số mặc định


Cách tạo hàm Python với các đối số tùy chọn

Python cung cấp hai cách để cung cấp các đối số tùy chọn trong python – *args và **kwargs. Chúng ta cũng sẽ xem xét một số cách khác thường để xác định đối số tùy chọn trong hàm python


1. Sử dụng *args

Trong trường hợp này, bạn chỉ cần thêm *args sau các đối số bắt buộc của định nghĩa hàm của mình. Đây là một ví dụ đơn giản về hàm chấp nhận hai đối số bắt buộc a & b và cho phép các đối số tùy chọn

def myfunc(a,b, *args):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

Trong hàm trên, các đối số tùy chọn c,d,e,f được lưu trữ trong các đối số dưới dạng các mục tuple. Bạn có thể lặp qua bộ đối số để truy cập các đối số tùy chọn. Vì vậy, chức năng trên sẽ chỉ cần in tất cả các đối số tùy chọn

Xin lưu ý, *args phải được chỉ định sau tất cả các đối số bắt buộc của hàm. Mặt khác, ngay cả đối số bắt buộc sẽ được lưu trữ trong đó

Nếu bạn không chắc chắn về số lượng đối số cần truyền cho hàm của mình, bạn có thể sử dụng *args để nắm bắt các đối số tùy chọn

Trên thực tế, bạn có thể sử dụng *args để không chỉ định nghĩa các đối số tùy chọn mà còn gọi chúng. Dưới đây là một ví dụ về hàm sử dụng hai đối số bắt buộc nhưng chúng tôi sử dụng *args Tuple để chỉ định các đối số đầu vào. Chúng ta sẽ định nghĩa một bộ chứa tất cả các biến đầu vào cần thiết cho hàm

def myfunc(a,b):
    print a,b
args=(1,2)
myfunc(*args)
output: 1 2


2. Sử dụng **kwargs

Bạn cũng có thể sử dụng **kwargs để xử lý các đối số tùy chọn, nếu bạn muốn đặt tên cho các đối số tùy chọn của mình. Trong trường hợp này, chúng sẽ là các đối số từ khóa, nghĩa là các đối số được đặt tên, được lưu trữ dưới dạng từ điển python kwargs

def myfunc(a,b, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      
myfunc(a,b, c='cat', d='dog', ...)

Trong hàm trên, bất kỳ biến nào bạn chuyển làm đối số từ khóa hoặc đối số tùy chọn, nó được sử dụng làm khóa để tạo cặp khóa-giá trị trong từ điển kwargs. Giá trị của biến được sử dụng làm giá trị của khóa. Ví dụ, trong ví dụ trên, kwargs = {‘c’. 'mèo', 'd'. 'chú chó'}

Bạn không chỉ có thể sử dụng **kwargs để chỉ định các đối số tùy chọn trong định nghĩa hàm mà còn có thể sử dụng nó trong lệnh gọi hàm. Đây là một ví dụ cho nó. Trong trường hợp này, bạn cần định nghĩa một từ điển với các đối số hàm

def myfunc(a,b):
    print a,b
kwargs={'a':1,'b':2}
myfunc(**kwargs)
output: 1 2


3. Sử dụng Giá trị mặc định

Bạn cũng có thể đặt giá trị mặc định cho một đối số để biến nó thành tùy chọn. Đây là một hàm ví dụ sử dụng a & b làm đối số bắt buộc và c làm đối số tùy chọn

def f(a,b, c = "1"):
   print(a,b,c)

f("a",'b')

output: "a",'b',1


4. Sử dụng cả *args và **kwargs

Bạn luôn có thể sử dụng cả *args và **kwargs cùng một lúc. Đây là một ví dụ

def myFun(*args,**kwargs):
    print("args: ", args)
    print("kwargs: ", kwargs)
 
 
# Now we can use both *args ,**kwargs
# to pass arguments to this function :
myFun('a','for','apple',first="b",mid="for",last="ball")

output:
args: ('a', 'for', 'apple')
kwargs {'first': 'b', 'mid': 'for', 'last': 'ball'}

Trong trường hợp này, điều quan trọng cần lưu ý là tất cả các đối số được đặt tên (đầu tiên, giữa, cuối cùng) trong hàm sẽ được lưu vào kwargs trong khi các đối số không tên sẽ được lưu trong args

Chúng tôi tiếp tục hành trình của mình thông qua các hàm Python bằng cách xem xét các đối số tùy chọn và giá trị mặc định

Trong bài viết này, bạn sẽ thấy cách bạn có thể xác định một hàm với một đối số tùy chọn. Giá trị mặc định được sử dụng nếu đối số không được bao gồm trong lời gọi hàm

Tổng quan về loạt hàm Python trung cấp

Dưới đây là tổng quan về bảy bài viết trong loạt bài này

  1. Giới thiệu về bộ truyện. Bạn có biết rõ tất cả các thuật ngữ chức năng của mình không?
  2. Chọn sử dụng đối số vị trí hoặc từ khóa khi gọi hàm
  3. [Bài viết này] Sử dụng các đối số tùy chọn bằng cách bao gồm các giá trị mặc định khi xác định một hàm
  4. Sử dụng bất kỳ số lượng đối số từ khóa và vị trí tùy chọn nào.
    def greet_person(person, number):
        for greeting in range(number):
            print(f"Hello {person}! How are you doing today?")
    
    # 1.
    greet_person("Sara", 5)
    4 và
    def greet_person(person, number):
        for greeting in range(number):
            print(f"Hello {person}! How are you doing today?")
    
    # 1.
    greet_person("Sara", 5)
    5
  5. Sử dụng đối số chỉ vị trí và đối số chỉ từ khóa. dấu gạch chéo lên phía trước / hoặc dấu hoa thị * giả mạo trong chữ ký hàm
  6. Gõ gợi ý trong hàm
  7. Các phương pháp hay nhất khi xác định và sử dụng hàm

Sử dụng đối số tùy chọn với giá trị mặc định

Hãy xây dựng trên cùng chức năng được sử dụng trong các phần trước của loạt bài này

________số 8_______

Một trong những cuộc gọi này gây ra lỗi. Bạn có thể đoán là cái nào không?

Hãy nhìn vào cái đầu tiên. Cuộc gọi đầu tiên hoạt động tốt. Nó sử dụng hai đối số vị trí

def greet_person(person, number):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 1.
greet_person("Sara", 5)

đầu ra là

Hello Sara! How are you doing today?
Hello Sara! How are you doing today?
Hello Sara! How are you doing today?
Hello Sara! How are you doing today?
Hello Sara! How are you doing today?

Tuy nhiên, cuộc gọi thứ hai phát sinh lỗi

def greet_person(person, number):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 2.
greet_person("Kevin")

đầu ra là

Traceback (most recent call last):
  File "...", line 6, in <module>
    greet_person("Kevin")
TypeError: greet_person() missing 1 required positional argument: 'number'

Đây là nơi giúp biết các thuật ngữ chúng tôi đã giới thiệu trong các bài viết trước. Lỗi nói

def greet_person(person, number):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 1.
greet_person("Sara", 5)
6

Bạn đã nói rằng bạn sẽ cung cấp hai đối số khi xác định hàm nhưng chỉ cung cấp một đối số. Python không thể sống với điều đó, có thể hiểu được. Còn thiếu thông tin. Do đó, nó không thể thực hiện chức năng

Tuy nhiên, bạn có thể định nghĩa hàm để tham số

def greet_person(person, number):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 1.
greet_person("Sara", 5)
7 có giá trị mặc định. Điều này làm cho đối số vị trí thứ hai trở thành đối số tùy chọn

def greet_person(person, number=2):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 1.
greet_person("Sara", 5)

# 2.
greet_person("Kevin")

Đầu ra hiện ổn cho cả hai cuộc gọi

Hello Sara! How are you doing today?
Hello Sara! How are you doing today?
Hello Sara! How are you doing today?
Hello Sara! How are you doing today?
Hello Sara! How are you doing today?
Hello Kevin! How are you doing today?
Hello Kevin! How are you doing today?

Trong chữ ký hàm, bạn đã thêm một giá trị mặc định bằng cách sử dụng dấu bằng ngay sau tên tham số

def greet_person(person, number):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 1.
greet_person("Sara", 5)
7. Điều này có nghĩa là nếu bạn không cung cấp đối số cho tham số này thì giá trị mặc định là 2 sẽ được sử dụng. Nếu bạn cung cấp đối số vị trí thứ hai, thì đối số đó sẽ được sử dụng, như trong cuộc gọi

greet_person("Sara", 5)

Các tham số có giá trị mặc định phải đến sau các tham số không có

Bây giờ, đối với một số quy tắc bạn không thể phá vỡ. Khi bạn xác định hàm, bạn không thể đặt tham số có giá trị mặc định trước tham số không có giá trị mặc định

def greet_person(number=2, person):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

Khi bạn chạy cái này, bạn gặp lỗi

File "...", line 1
    def greet_person(number=2, person):
                               ^^^^^^
SyntaxError: non-default argument follows default argument

Lưu ý rằng trong trường hợp này, lỗi xảy ra khi xác định chức năng chứ không phải khi gọi nó. Thông báo lỗi nêu rõ vấn đề là gì

def greet_person(person, number):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 1.
greet_person("Sara", 5)
9

Bao gồm nhiều đối số tùy chọn hơn

Bạn có thể có cả hai tham số với giá trị mặc định nếu muốn. Điều này có nghĩa là bạn có thể gọi hàm mà không có đối số, một đối số hoặc cả hai đối số

def greet_person(person, number):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 1.
greet_person("Sara", 5)
0

Đây là kết quả hiển thị cả ba lời gọi hàm đều hoạt động tốt

def greet_person(person, number):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 1.
greet_person("Sara", 5)
1

Và vì cả hai đối số đều là tùy chọn, nên bạn thậm chí có thể gọi hàm chỉ bằng đối số thứ hai chứ không phải đối số thứ nhất. Tuy nhiên, để làm điều này, bạn sẽ cần sử dụng các đối số được đặt tên chứ không phải các đối số vị trí

def greet_person(person, number):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 1.
greet_person("Sara", 5)
2

đầu ra

def greet_person(person, number):
    for greeting in range(number):
        print(f"Hello {person}! How are you doing today?")

# 1.
greet_person("Sara", 5)
3

Nhiều cách đề cập đến cùng một điều

Lưu ý về thuật ngữ. Bạn sẽ tìm thấy một số cách mọi người đề cập đến khái niệm này

  • đối số tùy chọn. bạn có quyền lựa chọn có đặt giá trị làm đối số hay không khi gọi hàm
  • tham số có giá trị mặc định. tham số trong định nghĩa hàm có giá trị mặc định
  • đối số mặc định. định nghĩa hàm đã có đối số sẵn sàng để sử dụng làm đối số mặc định nếu cần
  • tham số mặc định hoặc tham số tùy chọn. chúng cũng được sử dụng, mặc dù chúng không chính xác về mặt kỹ thuật. Tham số luôn ở đó. Đó là đối số không bắt buộc và có giá trị mặc định

Nhưng lời khuyên của tôi là đừng lo lắng quá nhiều về những kỹ thuật này ngay từ đầu

Từ cuối cùng

Hàm có tham số tùy chọn giúp người dùng gọi hàm linh hoạt hơn. Nó làm cho một hàm dễ sử dụng hơn vì nó có thể được sử dụng chỉ với các đối số bắt buộc trong khi vẫn cho phép người dùng đưa vào đối số tùy chọn