Cách truyền tham số dạng *args và **kwargs trong python

Cách truyền tham số dạng *args và **kwargs trong python

Thực sự thì không nhất thiết phải là *args và **kwargs. điều quan trọng là tham số có 1 dấu sao * hay là 2 dấu sao **. Đặt tên tham số là *var hay **vars hay bất cứ thứ gì bạn muốn.
Nhưng để dễ hiểu thì nên dùng tên chuẩn là *args và **kwargs

1. *args và **kwargs dùng để làm gì?

  • Khi khai báo 1 hàm, sử dụng *args và **kwargs cho phép bạn truyền vào bao nhiêu tham số cũng được mà không cần biết trước số lượng.
    Ví dụ:
  //với giả sử các tham số truyền vào đều là số
  def sum(*args):
  	total = 0
  	for number in args:
    	total += number
    return total

  // gọi hàm
  sum(1, 2, 3,19)
  sum( 1, 100)

2. *args và **kwargs khác gì nhau?

  • Cho những bạn chưa biêt: Khi gọi hàm trong Python, có 2 kiểu truyền tham số:
    • Truyền tham số theo tên.
    • Truyền tham số bình thường theo thứ tự khai báo đối số.
      Ví dụ
    def register(name, password):
    	....
    #Truyền tham số theo kiểu thông thường, phải theo đúng thứ tự
    register( 'Coulson', 'hail_Hydra')
    #Truyền tham số theo tên, Không cần phải theo thứ tự khai báo thao số
    register( password='cookHim', name='Skye')
  • *args nhận các tham số truyền bình thường. Sử dụng args như một list.
  • **kwargs nhận tham số truyền theo tên. Sử dụng kwargs như một. dictionary

Ví dụ

 def test_args(*args):
 	for item in args:
    	print item
        
 >>test_args('Hello', 'world!')
 Hello
 world!

 def test_kwargs(*kwargs):
 	for key, value in kwargs.iteritems():
    	print '{0} = {1}'.format(key, value)
        
 >>test_kwargs(name='Dzung', age=10)
 age = 10
 name = Dzung

3. Thứ tự sử dụng và truyền tham số *args, **kwargs và tham số bình thường

Khi sử dụng phải khai báo đối số theo thứ tự:

đối số xác đinh --> *args --> **kwargs

Đây là thứ tự bắt buộc. Và khi truyền tham số bạn cũng phải truyền theo đúng thứ tự này. Không thể truyền lẫn lộn giữa 2 loại.

Khi sử dụng đồng thời *args **kwargs thì không thể truyền tham số bình thường theo tên

Ví dụ

  def show_detail(name, *args, **kwargs):
  	.....
    
  show_detail(name='Coulson', 'agent', age='40', level='A')
  >>Error
  
  def show_detail_2(name, **kwargs):
  	....
    
  show_detail_2(name='Coulson', age='40', level='A')
  >> Chạy Ok

Tham khảo

18 Likes

vẫn chưa thông đoạn **kwargs anh ạ -_-

**kwargs nhận tham số truyền theo tên. Sử dụng kwargs như một. dictionary
đọc cái này là hiểu rồi bạn

Đừng giả định rằng người hỏi có background kiến thức giống như bạn như thế chứ.

Thực ra bạn bên trên có thể làm một bài test nhỏ như sau:

>>> def a(*args, **kargs):
...   print args[0]
...   print args[1]
...   print kargs['a']
...   print kargs['b']
... 
>>> a()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in a
IndexError: tuple index out of range
>>> a(1, 2, a=3, b=4)
1
2
3
4
>>> def a(a=0, *args, **kargs):
...   print args[0]
...   print args[1]
...   print kargs['a']
...   print kargs['b']
... 
>>> a(1, 2, a=3, b=4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a() got multiple values for keyword argument 'a'
>>> a(1, 2, b=4)
2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in a
IndexError: tuple index out of range
>>> a(1, 2, 3, b=4)
2
3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in a
KeyError: 'a'
1 Like

Cảm ơn các anh về bài viết , em cũng đang bí đoạn này !!!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?