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

python

(Coulson) #1

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


(Thân Hoàng) #2

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


(Trung Nguyen) #3

**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


(Tâm Ninja) #4

Đừ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'

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