** trăn kwargs

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àm

Bằ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ốn

Bâ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ố 8

Vì 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àm

Mặ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
1

Lư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
5

Tuy 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ấp

Ngô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ấp

Ví 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
0

Bâ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
1

Lư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
4

Và 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
5

Mộ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
0

Khi 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
1

Hà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

Chủ Đề