Hàm Python nhiều đối số

Khi tôi lần đầu tiên bắt đầu lập trình bằng Python, điều này thường xuyên khiến tôi vấp ngã. Hy vọng rằng thông qua nỗi đau của mình, tôi đã tìm được cách truyền đạt khái niệm này đơn giản như thế nào

Làm việc với args

Các chức năng này cho phép bạn mở rộng chức năng của mình một cách ồ ạt, vì khi bạn thiết kế các chức năng, bạn không muốn giới hạn số lượng đầu vào cho chức năng ở một số lượng nhất định. Một ví dụ điển hình về hoạt động của các đối số là khi bạn đang xử lý các hàm thống kê như tổng và trung bình. Nếu bạn đã tạo một hàm chỉ có thể cộng một số này với một số khác, thì điều đó sẽ không hữu ích bằng việc thêm một số vào một phạm vi không xác định. Đây là nơi args đến

Tôi sẽ chứng minh cách args được cấu trúc thông qua một hàm đơn giản và chúng ta sẽ giải cấu trúc hàm này

Được rồi, những gì nó làm là như sau

  • Có hai tham số – tham số đầu tiên là tham số mặc định thông thường mà bạn mong đợi từ một hàm và tham số thứ hai có tiền tố là ký hiệu dấu hoa thị (*), điều này biểu thị rằng bạn muốn chuyển các đối số chưa đặt tên cho hàm
  • Câu lệnh in sử dụng một chuỗi f để in ra đối số đầu tiên
  • Sử dụng vòng lặp for, chúng tôi lặp lại mọi đối số (arg) được truyền cho arg_values ​​và bên trong vòng lặp, chúng tôi in những gì đối số đó liên quan đến

Đây là một khái niệm mạnh mẽ vì nó có nghĩa là chúng ta có thể chuyển nhiều đối số không tên thuộc nhiều loại (chuỗi, số nguyên, dấu phẩy) cho hàm này và logic bên trong hàm sẽ tìm ra những việc cần làm với nó. Ở đây, nó chỉ đơn giản là in ra các giá trị, nhưng đây có thể là một hàm tóm tắt số, tôi sẽ thực hiện sau phần này

Sau đó, chúng tôi thực hiện lệnh gọi này bằng cách sử dụng hàm trả về bên dưới

First argument is this is my normal argument
Passed another argument (*arg_values): additional argument 1
Passed another argument (*arg_values): additional argument 2
Passed another argument (*arg_values): additional argument 3

Về cơ bản, chúng tôi đã tìm ra cách để nắm bắt các đối số bổ sung được chuyển qua dấu hoa thị duy nhất kỳ diệu của chúng tôi. Hãy mở rộng điều này để tổng hợp các giá trị số

Mở rộng các đối số để làm việc với các giá trị số

Chúng ta sẽ mở rộng những gì chúng ta đã thực hành trong phần trước để xem cách chúng ta sẽ sử dụng args để tạo một hàm tính tổng tùy chỉnh

Như bạn đã thấy - bạn thực sự không cần phải đặt tên cho các đầu vào của hàm *args chúng có thể là bất cứ thứ gì, miễn là chúng có tiền tố là dấu hoa thị. Chức năng này

  • Ban đầu, đặt kết quả thành 0, vì không có phép tính nào được thực hiện và chúng tôi cần một cách để khởi tạo biến của mình
  • Tôi đã thêm một câu lệnh in vào hàm để in kiểu dữ liệu/cấu trúc mà phạm vi * được gói gọn trong đó (nếu bạn chưa biết – nhiều đối số được lưu trữ dưới dạng một bộ)
  • Vòng lặp for lặp qua từng giá trị (val) trong phạm vi của tôi (đây là cái mà tôi gọi là tham số nhiều đối số của mình) và thêm từng giá trị vào kết quả, do đó, mỗi khi vòng lặp lặp lại, nó sẽ nối vào kết quả cho đến khi kết thúc với mọi
  • Kết quả cuối cùng sau đó được hàm trả về, sử dụng câu lệnh return

Để gọi chức năng này, tôi chỉ cần chuyển các mục tôi muốn cộng lại với nhau

# Use the new function
print(summer_function(20,40,60,80,100))

Những gì được trả về bàn điều khiển là như sau

<class 'tuple'>
300

Đơn giản đó là cách bạn có thể sử dụng các đối số để mở rộng sức mạnh của các chức năng của mình ngay lập tức. Trường hợp sử dụng tiếp theo chúng ta sẽ xem xét đối số từ khóa (**kwargs)

Kwargs có liên quan gì đến nó?

Xin lỗi vì tiêu đề Tina Turner cực kỳ tệ trên tiêu đề này. Đủ những lời lan man của tôi, kwargs là gì. Kwargs được truyền đối số công việc chính có khóa và giá trị, giống như cách bạn sẽ làm việc với từ điển Python

Ở đây chúng ta sẽ triển khai một hàm xử lý nhiều đối số và chúng ta sẽ chuyển vào một số giá trị mà hàm chưa từng thấy trước đây

Hãy phân tách chức năng này đang làm gì

  • Lặp qua các mục trong k_wargs và hiển thị khóa và giá trị khi nó lặp qua số lượng đối số từ khóa
  • in các đối số đã được chuyển qua khóa và giá trị
  • Kiểm tra logic để xem khóa có bằng một trong các giá trị tôi sẽ chuyển đến hàm không
  • Làm tương tự trong câu lệnh if tiếp theo

Chạy chức năng chúng tôi nhận được

working_with_kwargs(first_name='Gary', occupation='ML Engineer Lead', 
                    fav_food='Fish')

Điều này tạo ra

first_name=Gary
His name is Gary
occupation=ML Engineer Lead
fav_food=Fish
Item contains his favourite food Fish.

Bởi vì chúng tôi có thể truy vấn theo khóa và giá trị, chúng tôi cũng có thể sử dụng logic có điều kiện để xem khi có kết quả khớp

Thứ tự các đối số trong hàm

Thứ tự đúng của các đối số trong một hàm là như vậy

  1. đối số tiêu chuẩn
  2. *args đối số
  3. **kwargs đối số

Chúng cần được chỉ định theo thứ tự này trong mọi chức năng

Giải nén args và kwargs

Điều này có thể thực sự mạnh mẽ. Tôi sẽ chỉ cho bạn một số ví dụ về giải nén đối số từ args và kwargs sau đây

Giải nén đối số

Trước tiên, chúng tôi sẽ tập trung vào việc giải nén các đối số, vì điều này cho phép bạn thực hiện các thao tác như hợp nhất nhiều danh sách có cùng kích thước hoặc chỉ đơn giản là chuyển một danh sách các giá trị. PyTorch sử dụng giải nén kwargs rất nhiều để chuyển cấu trúc từ điển của mạng nơ-ron sang mô hình, vì vậy sẽ rất hữu ích khi bắt đầu với các ví dụ này để hiểu rõ về cách giải nén các đối số của chúng ta

Ví dụ đầu tiên tôi sẽ trình bày là cách giải nén một danh sách các giá trị và chuyển các đối số đã giải nén này dưới dạng các tham số riêng biệt vào một hàm tổng

Có chuyện gì ở đây vậy?

  • Chúng tôi có một hàm tính tổng tiêu chuẩn mong đợi ba tham số tính tổng (x1, x2 và x3)
  • Tôi có một danh sách – chứa ba giá trị trong danh sách
  • Tôi sử dụng dấu * đặc biệt (dấu hoa thị args) để nói rằng tôi muốn giải nén từng giá trị trong danh sách và chuyển các giá trị này làm tham số cho hàm – vì vậy 20 trở thành x1, 40 trở thành x2 và 20 trở thành x3. Hàm này sau đó cộng chúng lại với nhau và in ra kết quả là 80

Giải nén các đối số bằng cách hợp nhất danh sách

Hãy sử dụng những gì chúng ta đã học trước đây để nối hai danh sách lại với nhau, đây là một cách mới lạ khác mà chúng ta có thể làm việc với các đối số giải nén

Xin lỗi vì chơi chữ, nhưng hãy giải nén cái này

  • Chúng tôi tạo ba cách hiểu danh sách (danh sách các danh sách) trong đó chúng tôi chỉ tạo một phạm vi đơn giản gồm 10 giá trị, sau đó thêm vào chúng theo các cách khác nhau và nâng tất cả chúng lên theo lũy thừa của 3 (** là toán tử lũy thừa trong Python)
  • Ba danh sách biến 1, 2 và 3 này đều phải có cùng độ dài
  • Sau đó, chúng tôi tạo một danh sách các danh sách bằng cách chuyển các danh sách dưới dạng các đối số riêng biệt vào danh sách – điều này coi mỗi danh sách là một mục riêng biệt để thêm vào danh sách
  • Khi chúng tôi in độ dài của danh sách, chúng tôi sẽ nhận được độ dài của phạm vi – chúng không cần phải có kích thước giống hệt nhau, như ví dụ trước, vì không có số lượng đầu vào giới hạn cho danh sách, không giống như 3 tham số chúng tôi đã có

Đầu ra của mã này là

30
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 1000, 1331, 1728, 2197, 2744, 3375, 4096, 4913, 5832, 6859]

Thats tất cả để có nó

Giải nén kwarg

Trong ví dụ này, chúng tôi sẽ sử dụng động cơ tương tự như chúng tôi đã làm trước đây trong việc hợp nhất các danh sách, nhưng lần này chúng tôi sẽ sử dụng kwargs để hợp nhất hai từ điển lại với nhau. Hãy nhớ rằng kwargs có một khóa và giá trị liên quan đến các tham số đầu vào của chúng, vì vậy chúng hoạt động rất giống một từ điển trong Python

Một lần nữa, một số yêu cầu giải nén – hãy dừng việc đó bằng cách chơi chữ

  • Chúng tôi tạo hai từ điển với các khóa x1, x2, x3 và x4 và các giá trị được liên kết của chúng, trong trường hợp này là số
  • Để hợp nhất các ký tự này, chúng tôi sẽ giải nén kwarg của mình bằng cách sử dụng dấu hoa thị kép (** dấu hoa thị kép) đặc biệt để thực hiện việc này
  • Khi in từ điển đã hợp nhất, chúng ta sẽ có từ x1 đến x4 làm khóa theo thứ tự
{'x1': 10, 'x2': 30, 'x3': 20, 'x4': 32}

Tôi có xu hướng sử dụng giải nén kwarg rất nhiều khi làm việc với các mô hình PyTorch và Transformer, vì thông thường bạn có cấu hình mô hình hóa bên ngoài là một từ điển và bạn muốn chuyển từng tham số vào mô hình – bằng cách sử dụng model(**my_model_params) . Tiết kiệm thời gian như vậy

Đóng cửa

Tôi hy vọng bạn đã tìm thấy bài viết này thông tin. Tôi nghĩ đến nó từ cách tôi thích học các khái niệm mới. Rút gọn chúng thành các thành phần đơn giản mà tôi biết và sau đó tìm hiểu xem từng giai đoạn đang làm gì

Một hàm có thể có nhiều đối số trong Python không?

Chúng ta có thể truyền nhiều đối số cho một hàm python bằng cách xác định trước các tham số hình thức trong định nghĩa hàm .

Một hàm có thể nhận nhiều đối số không?

Hàm có thể chấp nhận nhiều đối số . Khi gọi một hàm, bạn có thể truyền nhiều đối số cho hàm; . Video này không có bất kỳ ghi chú nào.

Một hàm có thể chấp nhận Python bao nhiêu đối số?

Trong Python, chúng ta có thể định nghĩa hai loại tham số có độ dài thay đổi. Chúng có thể được coi là các loại tham số tùy chọn đặc biệt. Nói cách khác, không có giới hạn về số lượng đối số được truyền cho tham số khi chúng ta gọi hàm này .

Hàm Python có thể có đối số không giới hạn không?

Có. Bạn có thể sử dụng *args làm đối số không phải từ khóa. Sau đó, bạn sẽ có thể chuyển bất kỳ số lượng đối số nào .