2015-07-03 14 views
7

Tôi biết ý nghĩa của dấu sao nằm trong định nghĩa hàm trong Python.Chức năng gọi khác biệt với tham số dấu hoa thị và không có

Tôi thường, tuy nhiên, nhìn thấy dấu hoa thị cho các cuộc gọi đến các chức năng với các thông số như:

def foo(*args, **kwargs): 
    first_func(args, kwargs) 
    second_func(*args, **kwargs) 

phần chênh lệch giữa đầu tiên và gọi hàm thứ hai là gì?

+1

dấu mất biến ra khỏi khung :) – LittleQ

+0

thể trùng lặp của [ Hiểu các kwarg trong Python] (http://stackoverflow.com/questions/1769403/understanding-kwargs-in-python) –

Trả lời

11

arg = [1,2,3]

func(*arg) == func(1,2,3) biến đi ra khỏi danh sách (hoặc ther kiểu chuỗi) là tham số

func(arg) == func([1,2,3]) một danh sách đi trong

kwargs = dict(a=1,b=2,c=3)

func(kwargs) == func({'a':1, 'b':2, 'c':3}) một dict đi trong

func(**kwargs) == func(a=1,b=2,c=3) (key, value) đi ra khỏi dict (hoặc loại bản đồ khác) như các thông số tên

+0

Một câu trả lời đơn giản. Cảm ơn. –

+0

Câu trả lời thực sự hay: +1 cho điều đó! Bạn có thể vui lòng thêm và giải thích trường hợp cho 'func (* kwarg)'? – winklerrr

4

Sự khác biệt là cách đối số được chuyển vào các hàm được gọi. Khi bạn sử dụng *, các đối số được giải nén (nếu chúng là một danh sách hoặc bộ dữ liệu) — nếu không, chúng chỉ đơn giản là được truyền vào.

Dưới đây là một ví dụ về sự khác biệt:

>>> def add(a, b): 
... print a + b 
... 
>>> add(*[2,3]) 
5 
>>> add([2,3]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: add() takes exactly 2 arguments (1 given) 
>>> add(4, 5) 
9 

Khi tôi tiền tố lập luận với *, nó thực sự không đồ đựng danh sách vào hai tham số riêng biệt, được thông qua vào add như ab. Nếu không có nó, nó chỉ đơn giản là thông qua trong danh sách như là một đối số duy nhất.

Trường hợp tương tự đối với từ điển và **, ngoại trừ chúng được chuyển vào dưới dạng đối số được đặt tên thay vì đối số được đặt hàng.

>>> def show_two_stars(first, second='second', third='third'): 
... print "first: " + str(first) 
... print "second: " + str(second) 
... print "third: " + str(third) 
>>> show_two_stars('a', 'b', 'c') 
first: a 
second: b 
third: c 
>>> show_two_stars(**{'second': 'hey', 'first': 'you'}) 
first: you 
second: hey 
third: third 
>>> show_two_stars({'second': 'hey', 'first': 'you'}) 
first: {'second': 'hey', 'first': 'you'} 
second: second 
third: third 
+0

Cảm ơn bạn đã trả lời chi tiết của bạn. Điều này giúp tôi rất nhiều. –

0
def fun1(*args): 
    """ This function accepts a non keyworded variable length argument as a parameter. 
    """ 
    print args   
    print len(args) 


>>> a = [] 

>>> fun1(a) 
([],) 
1 
# This clearly shows that, the empty list itself is passed as a first argument. Since *args now contains one empty list as its first argument, so the length is 1 
>>> fun1(*a) 
() 
0 
# Here the empty list is unwrapped (elements are brought out as separate variable length arguments) and passed to the function. Since there is no element inside, the length of *args is 0 
>>> 
+0

Tôi nghĩ rằng câu trả lời của bạn sẽ rõ ràng hơn nếu bạn đã thêm một số giá trị vào 'a' – winklerrr

+0

Ví dụ đó là để hiển thị cách giải nén của args hoạt động. Nếu bạn có một phần tử được thêm vào 'a' và được chuyển tới args mà không giải nén, thì chiều dài của arg sẽ là 1. Đối với trường hợp đầu tiên nó sẽ là (['some val'],) và đối với trường hợp thứ hai, nó sẽ là ('một số val',) – user2126456

Các vấn đề liên quan