Nếu bạn không biết có bao nhiêu đối số từ khóa sẽ được chuyển vào hàm của mình, hãy thêm hai dấu hoa thị.
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
2 trước tên tham số trong định nghĩa hàmBằng cách này, hàm sẽ nhận được một từ điển các đối số và có thể truy cập các mục tương ứng
Ví dụ
Nếu số lượng đối số từ khóa không xác định, hãy thêm một dấu ngoặc kép
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
2 trước tên tham sốdef my_function[**kid].
print["Họ của anh ấy là " + kid["lname"]]
my_function[fname = "Tobias", lname = "Refsnes"]
Tự mình thử »Đối số Kword tùy ý thường được rút ngắn thành **kwargs trong tài liệu Python
Thảo luận về sự khác biệt giữa các đối số vị trí và từ khóa và cách sử dụng *args và **kwargs trong Python
Photo by Pan Yunbo on Unsplash
Giới thiệu
Trong Python, các đối số được cung cấp trong một lời gọi hàm được truyền bằng phép gán [i. e. theo tham chiếu đối tượng]. Điều này có nghĩa là bất cứ khi nào một hàm được gọi, mọi đối số sẽ trở thành một biến trỏ đến giá trị được chỉ định. Rõ ràng, phạm vi của các biến này sẽ được giới hạn trong hàm được gọi
Điều này có nghĩa là cả hàm và người gọi chia sẻ các đối tượng theo tham chiếu, không có bí danh tên. Do đó, bằng cách thay đổi tên đối số trong hàm, chúng ta không nên mong đợi rằng tên của người gọi cũng sẽ bị thay đổi. Tuy nhiên, bất cứ khi nào các đối tượng có thể thay đổi của chúng ta bị thay đổi trong một hàm, chúng ta nên cho rằng điều này cũng sẽ có ảnh hưởng đến người gọi, với điều kiện là cả hai đều chia sẻ cùng một tham chiếu đối tượng.
Trong bài viết hôm nay, chúng ta sẽ thảo luận về sự khác biệt giữa đối số vị trí và đối số từ khóa khi viết [hoặc gọi] hàm trong Python. Ngoài ra, chúng ta sẽ xem qua một vài ví dụ để chứng minh cách sử dụng
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
2 và >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
3 trong mã của bạn để làm cho mã hiệu quả hơn và PythonicĐối số vị trí và từ khóa trong Python
Các đối số cho các hàm [hoặc phương thức] Python có thể được truyền theo tên hoặc vị trí từ khóa và ngôn ngữ này có khả năng thu thập cả đối số vị trí và/hoặc từ khóa trong một lệnh gọi
Đối số vị trí đề cập đến loại đối số đang được phân tích cú pháp dựa trên chỉ mục vị trí của chúng mà chúng được cung cấp khi hàm hoặc phương thức quan tâm được gọi. Do đó, thứ tự mà các đối số vị trí được cung cấp có ý nghĩa quan trọng vì chúng được so khớp từ trái sang phải
Ví dụ: hãy xem xét hàm Python tích hợp sẵn
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
4 được sử dụng để làm tròn số đầu vào đến độ chính xác đã chỉ định sau dấu thập phân. Định nghĩa của hàm là >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
5 có nghĩa là đầu vào >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
6 là bắt buộc, trong khi đối số >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
7 là tùy chọn và tương ứng với độ chính xác mong muốnBây giờ, giả sử rằng chúng ta có một biến float
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
8 mà chúng ta muốn giới hạn ở độ chính xác hai dấu thập phân. Chúng ta có thể gọi làm như vậy bằng cách gọi hàm >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
9 và cung cấp cả hai đối số làm đối số vị trí________số 8Vì chúng tôi đã cung cấp các đối số vị trí [i. e. chúng tôi chưa chỉ định đối số từ khóa cho từng giá trị được cung cấp trong trình gọi], đối số vị trí đầu tiên sẽ tương ứng với
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
6 và đối số thứ hai sẽ tương ứng với đối số tùy chọn >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
7, theo định nghĩa hàmMặt khác, các đối số từ khóa đang được chuyển đến một hàm bằng cách chỉ định từ khóa ở dạng
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
12. Do đó, thứ tự các đối số này được truyền vào trình gọi không quan trọng vì chúng được khớp với tên đối sốQuay trở lại ví dụ với hàm
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
9, thay vào đó chúng ta có thể gọi nó bằng cách chuyển đối số từ khóa>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
Và như đã đề cập, thứ tự mà chúng tôi cung cấp các đối số từ khóa không thực sự quan trọng
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
1Lưu ý rằng chúng ta thậm chí có thể kết hợp cả đối số vị trí và từ khóa trong đó đối số sau phải được chỉ định sau đối số trước —
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
5Tuy nhiên, xin lưu ý rằng nếu bạn cung cấp một đối số từ khóa trước các đối số vị trí, một
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
14 sẽ được nâng lên>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
7Đối số vị trí và * args
Bây giờ, giả sử rằng chúng ta muốn viết một hàm bằng Python chấp nhận số lượng đối số tùy ý. Một tùy chọn sẽ là chuyển các đối số trong một tập hợp - chẳng hạn như một danh sách - nhưng điều này sẽ không thuận tiện trong hầu hết các trường hợp. Ngoài ra, ý tưởng này không hoàn toàn Pythonic - nhưng đây chính xác là nơi danh sách đối số tùy ý phát huy tác dụng
Thay vào đó, chúng ta có thể tận dụng thành ngữ
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
2 khi định nghĩa hàm của mình để xác định rằng nó thực sự có thể chấp nhận bất kỳ số lượng đối số nào. Và nó thực sự tùy thuộc vào việc triển khai để xử lý đúng các đối số được cung cấpNgôi sao
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
16 được gọi là toán tử giải nén và sẽ trả về một bộ chứa tất cả các đối số do người gọi cung cấpVí dụ, hãy xem xét một hàm khá đơn giản chấp nhận một số lượng số nguyên tùy ý và trả về tổng của chúng
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
0Bây giờ chúng ta có thể gọi hàm trên với bất kỳ số lượng đối số nào mà chúng ta có thể muốn
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
1Lưu ý rằng bạn có thể kết hợp các đối số bình thường và tùy ý trong định nghĩa hàm
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
2Đối số từ khóa và **kwargs
Theo cách tương tự, đôi khi chúng ta có thể muốn viết các hàm có thể chấp nhận một số đối số từ khóa tùy ý
Khi giải nén các đối số từ khóa từ
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
17, kết quả sẽ là một từ điển Python trong đó các khóa tương ứng với tên từ khóa và giá trị cho các giá trị đối số thực tế được cung cấp>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
4Và bây giờ chúng ta có thể gọi hàm với bao nhiêu đối số từ khóa tùy thích
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
5Một lần nữa, thật hữu ích khi đề cập rằng thành ngữ đối số từ khóa tùy ý có thể được kết hợp với cả đối số bình thường và đối số vị trí tùy ý
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
0Khi nào thì sử dụng *args và **kwargs
Một ví dụ thực tế rất hay trong đó
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
2 và/hoặc >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
3 thường hữu ích là bộ trang trí. Trong Python, một trình trang trí là một hàm nhận một hàm khác làm đối số, trang trí nó [i. e. nó làm phong phú thêm chức năng của nó] và cuối cùng nó trả lại nóGiả sử rằng chúng ta muốn tạo một trình trang trí chịu trách nhiệm báo cáo thời gian thực hiện của một chức năng cho đầu ra tiêu chuẩn
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
1Hàm bao bọc sẽ chỉ chấp nhận các đối số từ khóa và vị trí tùy ý, sau đó sẽ được chuyển vào hàm được trang trí
Suy nghĩ cuối cùng
Trong bài viết hôm nay, chúng ta đã thảo luận về các đối số từ khóa và vị trí cũng như sự khác biệt chính của chúng khi viết hoặc gọi các hàm trong Python
Ngoài ra, chúng ta đã thảo luận về sự khác biệt chính giữa
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
2 và >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
3 và cách bạn có thể sử dụng chúng trong các chức năng của riêng mình dựa trên những gì người ta có thể muốn đạt được. Hơn nữa, chúng tôi đã giới thiệu cách bạn có thể sử dụng các đối số vị trí và từ khóa từ >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
2 và >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
3 trong thực tếCuối cùng, chúng ta đã trải qua một ví dụ thực tế để giới thiệu một ứng dụng của
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
2 và >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
3 trong ngữ cảnh của hàm bao hàm [i. e. trang trí]Điều quan trọng cần đề cập là ký hiệu thực tế sử dụng các ký hiệu ngôi sao [
>>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
16 và >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
17] và cả hai đều tương ứng với danh sách đối số tùy ý. Tên >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
58 và >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
59 không hơn gì một quy ước [khá phổ biến trong cộng đồng và thường được sử dụng để mô tả các danh sách đối số tùy ý]. Do đó, bạn không cần phải tham chiếu chúng như vậy — ví dụ: bạn thậm chí có thể đặt tên chúng là >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
70 và >>> a = 10.2254
>>> round[number=a, ndigits=2]
10.23
71 trong định nghĩa hàm của mình mặc dù tôi không khuyên bạn sử dụng quy ước đặt tên như vậy. ]Trở thành thành viên và đọc mọi câu chuyện trên Medium. Phí thành viên của bạn hỗ trợ trực tiếp cho tôi và các nhà văn khác mà bạn đọc. Bạn cũng sẽ có toàn quyền truy cập vào mọi câu chuyện trên Phương tiện