*args và **kwargs trong Python là gì?

Dẫn nhập

Functions là cuộc sống thường ngày, đúng không ạ? nếu tín đồ là người mới vào học Python – là lính mới hay nhảy qua từ từ ngữ khác – tín đồ học về số lượng thông số trong khái niệm function khi đúng toàn bộ thông số thì mới có thể tiếp tục.

Đó là nền tảng – thứ giúp mọi người nắm rõ từ bên phía ngoài. Tuy nhiên, nó cũng làm cho những tín đồ khá choáng váng khi tín đồ thấy *args hoặc **kwargs trong khái niệm function.

Không để cú pháp làm sợ tín đồ. Nó không phải là những thông số đặc biệt quan trọng thần thánh. Nó còn thậm chí còn không thật ảo, và mọi người sẽ học cách tận dụng nó.

Thông số vị trí vs Thông số từ khóa

Có 2 khái niệm mọi người luôn phải tách ra nhằm mục đích để học*args**kwargs là gì.

Trước tiên là không giống nhau giữa thông số vị trí thông số từ khóa (Keyword). Ở những function cơ phiên bản nhất, mọi người chơi trò ghép cặp – đối số 1 sẽ tới thông số 1, đối số 2 đến thông số, và tiếp tục.

def printThese(a,b,c): print(a, “is stored in a”) print(b, “is stored in b”) print(c, “is stored in c”) printThese(1,2,3) “”” 1 is stored in a 2 is stored in b 3 is stored in c “””

Lưu ý: Toàn bộ đối số phải có. Thiếu một sẽ gây nên ra lỗi.

def printThese(a,b,c): print(a, “is stored in a”) print(b, “is stored in b”) print(c, “is stored in c”) printThese(1,2) “”” TypeError: printThese() missing 1 required positional argument: ‘c’ “””

Nếu mọi người cho giá trị mặc định cho thông số trong khái niệm function, thì nó trở thành không bắt buộc

def printThese(a,b,c=None): print(a, “is stored in a”) print(b, “is stored in b”) print(c, “is stored in c”) printThese(1,2) “”” 1 is stored in a 2 is stored in b None is stored in c “””

Ngoài ra, thông số không bắt buộc sẽ trở thành keyword-eligible (từ khóa điều kiện kèm theo), tức là chúng ta cũng có thể ghi rõ tên thông số khi gọi function để gán giá trị thích hợp.

Hãy gán 3 thông số có mức giá trị mặc định None và sẽ cách mọi người gán giá trị không cần sắp xếp.

def printThese(a=None,b=None,c=None): print(a, “is stored in a”) print(b, “is stored in b”) print(c, “is stored in c”) printThese(c=3, a=1) “”” def printThese(a=None,b=None,c=None): print(a, “is stored in a”) print(b, “is stored in b”) print(c, “is stored in c”) printThese(c=3, a=1) “”” 1 is stored in a None is stored in b 3 is stored in c “””

Toán tử Splat

Để tôi chính thức nói tôi yêu thích tên toán tử này – nó rất là … trực quan. * là ký hiệu phổ cập nhất về phép nhân, nhưng ở Python nó còn tồn tại nghĩa toán tử Splat.

Tôi nghĩa toán tử này như cái hộp piñata – cái hộp nhét các loại bánh kẹo vào trong rồi người ta dùng gậy đập tung nó ra. Tôi đã từng mô tả về toán tử mở rộng – một chiếc tương đương splat của JavaScript – nó giải nén một chuỗi domino rồi đẩy và một list đơn to hơn, nhưng splat bảo vệ tương tự một chiếc mạnh mẽ và uy lực hơn.

Một ví dụ cơ phiên bản để tín đồ nắm rõ hơn.

a = [1,2,3] b = [*a,4,5,6] print(b) # [1,2,3,4,5,6]

Trong ví dụ trên, mọi người mang tài liệu của a và giải nén đẩy vào toàn bộ list b.

Cách tận dụng *args và **kwargs

Vậy mọi người đã biết toán tử splat giải nén toàn bộ tài liệu có kí hiệu *, và có 2 loại thông số function. Vậy, nếu tín đồ chưa phát hiện ra, *args là viết tắt của (arguments) đối số, **kwargs là viết tắt của (keyword arguments) đối số từ khóa.

Nó được tận dụng để giải nén ra loại đối số tương ứng, được chấp nhận gọi function có list đối số có số lượng giá trị thay đổi. Ví dụ, tạo một function in ra những điểm kiểm tra.

def printScores(student, *scores): print(f”Student Name: {student}”) for score in scores: print(score) printScores(“Jonathan”,100, 95, 88, 92, 99) “”” Student Name: Jonathan 100 95 88 92 99 “””

Ủa khoan đã!!! Tôi không đặt tên *args? Đúng rồi, “args” chỉ là quy ước tiêu chuẩn chỉnh nhưng vẫn chỉ là tên thường gọi. Kín đã được bật mí, trong *args, dấu * thực sự là dân chơi, tạo 1 list mà toàn bộ giá trị là những đối số tương ứng khi gọi function.

Điều này đã rõ ràng, **kwargs trở thành sẽ hiểu sâu. Cái tên không quan trọng, ** tiết ra một dictionary mà toàn bộ giá trị là là những đối số từ khóa khi gọi function.

Để minh họa, hãy tạo 1 function và in tên những loài vật của người đó.

def printPetNames(owner, **pets): print(f”Owner Name: {owner}”) for pet,name in pets.items(): print(f”{pet}: {name}”) printPetNames(“Jonathan”, dog=”Brock”, fish=[“Larry”, “Curly”, “Moe”], turtle=”Shelldon”) “”” Owner Name: Jonathan dog: Brock fish: [‘Larry’, ‘Curly’, ‘Moe’] turtle: Shelldon “””

Lưu ý

Một vài lời khôn ngoan sẽ hỗ trợ tín đồ tránh lỗi thường thì và mở rộng tri thức của tín đồ.

  • Tận dụng *args, **kwargs nhưng là quy ước tiêu chuẩn chỉnh để bắt những đối số vị trí và từ khóa.
  • Fan không thể đặt **kwargs trước *args, nếu không các bạn sẽ nhận lỗi,
  • Cảnh giác việc trùng lặp thông số từ khóa và **kwargs khi giá trị được khái niệm sẽ nằm ở **kwarg nhưng nó vô tình dính tên của thông số từ khóa.
  • Bạn cũng có thể tận dụng toán tử splat khi gọi function.

Kết

Như vậy mọi người đã tìm hiểu về *args và **kwargs trong Python là gì?

Nội dung bài viết được dịch từ Medium.com. Bạn cũng có thể xem thêm nội dung bài viết gốc tại đây: What Are *args and **kwargs in Python?

Cảm ơn những tín đồ đã theo dõi nội dung bài viết. Hãy để lại phản hồi hoặc góp ý của tôi để phát triển nội dung bài viết tốt hơn. Hãy nhờ rằng “Tập dượt – Thử thách – Không ngại khó”.

Thảo luận

Nếu tín đồ có ngẫu nhiên khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt thắc mắc trong phần BÌNH LUẬN dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự tương trợ từ xã hội.

You May Also Like

About the Author: v1000