Là lập trình viên, chúng ta thường gặp các tình huống cần trả về nhiều giá trị từ hàm. Python cung cấp cho chúng ta một số cách để làm điều này [Có. Nhiều hơn một cách. ] và mong đợi “chúng tôi”, các lập trình viên, chọn một cái phù hợp nhất với trường hợp sử dụng của chúng tôi
Chúng ta hãy tiếp tục và xem những phương pháp đó là gì và khi nào thì sử dụng phương pháp nào.
Dành cho những bạn đang vội, đây là một mánh gian lận chứa tất cả các phương pháp được giải thích trong bài viết này.
Cheat-Sheet. Trả về nhiều giá trị từ các hàm trong Python
Phương thức Khi nào nên sử dụng This1. Phân tách các giá trị bằng phương pháp dấu phẩyBest khi trả về tối đa 3 giá trị2. Việc sử dụng Bộ dữ liệu được đặt tên* trả về một số lượng lớn giá trị [hơn 3]* làm cho mã dễ đọc hơn trong khi vẫn duy trì hiệu suất3. Đóng gói các giá trị vào dữ liệu có thể thay đổi của Dicts*
* trả về một số lượng lớn giá trị [hơn 3]4. Đóng gói các giá trị vào Danh sách* dữ liệu được sắp xếp
* dữ liệu có thể lập chỉ mục
* dữ liệu có thể thay đổi5. Đóng gói các giá trị vào Lớp tùy chỉnh trả về các giá trị có liên quan chặt chẽ có thể hưởng lợi từ việc trở thành một lớp
Đừng lo lắng nếu bảng này chưa có ý nghĩa, vì bảng này dành cho những người chỉ đến đây để làm mới những kỷ niệm của họ. Mỗi phương pháp trên được giải thích trong phần còn lại của bài viết này với sự trợ giúp của một số ví dụ
Phương pháp số 1. Phân tách các giá trị bằng dấu phẩy [Cách tốt nhất để trả về Tối đa 3 giá trị]
Chúng ta hãy bắt đầu với phương pháp tốt nhất.
Hãy xem ví dụ bên dưới.
def calculate_area_n_perimeter[length, breadth]:
area = length * breadth
perimeter = 2 * [length + breadth]
return area, perimeter
Area, Perimeter = calculate_area_n_perimeter[10, 5]
print ["Area of rectangle = ", Area]
print ["Perimeter of rectangle = ", Perimeter]
Như bạn có thể thấy, hàm tính_diện tích_n_perimeter[] chỉ trả về diện tích và chu vi trong Dòng 4 bằng cú pháp
return area, perimeter
Về cơ bản, tất cả những gì chúng ta đã làm ở đây là phân tách các giá trị được trả về bằng dấu phẩy. Đơn giản như vậy.
Tất nhiên, điều này không chỉ giới hạn ở 2 giá trị, bạn có thể trả về bất kỳ số lượng giá trị nào bằng cú pháp này.
Đây là cú pháp yêu thích của tôi vì nó rất đơn giản và trực quan
Khi nào sử dụng phương pháp này
Nếu bạn đang trả về một số lượng nhỏ giá trị, chẳng hạn như nhỏ hơn hoặc bằng 3, thì hãy sử dụng phương pháp này.
Điều này là do tâm trí con người rất giỏi trong việc ghi nhớ tối đa 3 mục. Bất cứ điều gì nhiều hơn thế và rất dễ mắc lỗi khi đặt sai thứ tự ở đầu nhận.
Ví dụ: nếu Dòng-6 của Ví dụ #1 được thay đổi từ
Area, Perimeter = calculate_area_n_perimeter[10, 5]
đến
Perimeter, Area = calculate_area_n_perimeter[10, 5]
Sau đó, thay vì nhận được đầu ra
Area of rectangle = 50
Perimeter of rectangle = 30
chúng tôi sẽ nhận được
Area of rectangle = 30
Perimeter of rectangle = 50
đó sẽ là một lỗi lớn
Luôn ghi nhớ quy tắc 3
Một ghi chú bên Nerdy. Theo quan điểm của Python, chúng tôi vẫn trả về một giá trị duy nhất
Python, giống như nhiều ngôn ngữ lập trình khác, được xây dựng để chỉ trả về một giá trị.
Vậy làm cách nào để chúng ta trả về nhiều giá trị? .
Hãy xem phiên phiên dịch sau
>>> a, b = 10, 5
>>> a
10
>>> b
5
Thành ngữ này được gọi là “Multiple Assignment”, về cơ bản là gán các giá trị cho nhiều giá trị cùng một lúc
Đằng sau hậu trường, Python thực sự sử dụng kiểu dữ liệu “Tuple” để biến điều kỳ diệu này thành hiện thực
Bất kỳ giá trị nào được phân tách bằng dấu phẩy sẽ tạo thành một bộ trong Python
[Một Tuple trong thuật ngữ đơn giản là một danh sách không đổi, không thể thay đổi sau khi được khai báo]
Hãy xem bên dưới.
>>> c = 20, 10
>>> type[c]
Như bạn có thể thấy, chúng ta đã sử dụng cùng một cú pháp chính xác và khi chúng ta kiểm tra kiểu của biến c thì nó thực sự là một bộ
Tương tự như vậy, hàm của chúng tôi calcul_area_n_perimeter[10, 5] trả về một bộ duy nhất chứ không phải nhiều giá trị
________số 8Có thể khi bạn học Python, bạn sẽ sử dụng các bộ dữ liệu như hình bên dưới
>>> d = [1,2,3]
>>> type[d]
Nhưng những niềng răng này là hoàn toàn tùy chọn. Bất kỳ giá trị nào được phân tách bằng dấu phẩy đều là các bộ trong Python. Trong thực tế, ngay cả đây là một tuple
return area, perimeter
0Một trường hợp chắc chắn bạn sẽ cần niềng răng là khi bạn đang tạo một bộ gồm các bộ như hình bên dưới
return area, perimeter
1Trừ khi chúng tôi thực hiện "gán nhiều" hoặc "trả về nhiều giá trị", cách tốt nhất là sử dụng dấu ngoặc nhọn bất cứ khi nào bạn sử dụng bộ dữ liệu để thông báo rõ ràng cho người đọc rằng bạn đang sử dụng bộ dữ liệu vì điều này giúp cải thiện khả năng đọc
Một cách sử dụng khác của bộ dữ liệu là
- Nếu các giá trị trả về của bạn được sắp xếp theo tự nhiên [như tọa độ x, y] thì hãy sử dụng các bộ dữ liệu
Trong trường hợp này, ngay cả khi bạn trả về nhiều hơn 3 giá trị, bạn vẫn có thể sử dụng Bộ dữ liệu vì việc giải nén các giá trị đã sắp xếp sẽ ít bị lỗi hơn
Đôi khi, bạn có thể gặp tình huống muốn trả về nhiều hơn 3 giá trị không được sắp xếp. Hãy xem chúng ta có thể làm gì trong những tình huống đó trong phần tiếp theo
Phương pháp số 2. Sử dụng Bộ dữ liệu được đặt tên [Cách tốt nhất để trả về hơn 3 giá trị]
Như chúng ta đã thấy ở trên trong Phương pháp # 1, các bộ dữ liệu là một cách tuyệt vời để trả về nhiều giá trị từ một hàm, nhưng mọi thứ có thể vượt khỏi tầm kiểm soát rất nhanh nếu chúng ta gửi nhiều hơn 3 giá trị
Điều này là do việc giải nén nó ở bên nhận sẽ rất dễ xảy ra lỗi và có thể dẫn đến các lỗi trong mã, do đó có thể dẫn đến lãng phí rất nhiều giờ cho việc gỡ lỗi
Là những người chuyên nghiệp, chúng ta phải luôn nhận thức được các công cụ mà ngôn ngữ lập trình cung cấp cho chúng ta [trong trường hợp này là Python] và đảm bảo chọn đúng công cụ cho đúng công việc
“Công cụ” có thể giải quyết vấn đề của chúng ta ở đây là lớp có tên là “Bộ dữ liệu được đặt tên”
Dựa theo
Các bộ dữ liệu được đặt tên gán ý nghĩa cho từng vị trí trong một bộ dữ liệu và cho phép mã tự ghi lại, dễ đọc hơn. Chúng có thể được sử dụng ở bất cứ nơi nào sử dụng bộ dữ liệu thông thường và chúng thêm khả năng truy cập các trường theo tên thay vì chỉ mục vị trí
con trăn. tổ chức
Trước tiên chúng ta hãy thử nghiệm một chút với các bộ dữ liệu được đặt tên. Hãy xem phiên phiên dịch bên dưới
return area, perimeter
2Như bạn có thể thấy, chúng ta có thể truy cập các mục bên trong bộ có tên bằng cách
- sử dụng chỉ mục như các bộ dữ liệu thông thường và
- sử dụng ký hiệu dấu chấm như một lớp
Ngoài việc cung cấp cho chúng tôi chức năng này, các bộ dữ liệu được đặt tên cũng nhẹ và không yêu cầu nhiều bộ nhớ hơn so với phiên bản "không được đặt tên" thông thường của các bộ dữ liệu
Bây giờ chúng ta đã học một chút về Named-Tuples, hãy xem một ví dụ về cách chúng ta có thể sử dụng chúng trong các chương trình của mình
return area, perimeter
3Như bạn có thể thấy ở trên, chúng tôi đã chỉnh sửa Ví dụ # 1 để sử dụng têntuple thay thế. Đây
- Trong Dòng-1, chúng tôi đã nhập lớp được đặt tên
- Trong Dòng 2, chúng tôi đã tạo lớp “Kết quả” nhẹ chỉ với một dòng mã, để chứa 2 thành viên “diện tích” và “chu vi“
- Ở Dòng 7, chúng ta đã tạo một đối tượng thuộc lớp “Kết quả” và Dòng 8 trả về đối tượng này
- Trong Dòng 10, chúng tôi đã nhận lại các giá trị trả về, nhưng lần này ở dạng một đối tượng được đặt tên và
- Trong Dòng-11 & 12, chúng tôi in chúng ra bằng toán tử dấu chấm
Đơn giản như thế
Khi nào thì sử dụng phương pháp này?
Phương pháp này tốt nhất khi
- bạn muốn cải thiện khả năng đọc mã của mình trong khi trả về nhiều giá trị cùng một lúc
- bạn muốn các giá trị không thay đổi ở phía nhận [vì các bộ dữ liệu về bản chất là không thay đổi]
- bạn đang làm việc trên một dự án chạy trên phần cứng hạn chế đòi hỏi hiệu quả và hiệu suất
Nhược điểm của phương pháp này
têntuple có thể không phải là sự lựa chọn tốt nhất của bạn nếu
- bạn phải thay đổi các giá trị được trả về hoặc
- bạn cần thêm nhiều mặt hàng vào thùng chứa trả lại
Bạn không thể làm những điều đó với các bộ dữ liệu vì về cơ bản chúng là các danh sách không đổi
Nhưng đừng lo lắng, vì khi những tình huống như vậy xảy ra, chúng tôi có phương pháp 3 và 4 để giúp chúng tôi
Phương pháp số 3. Đóng gói các giá trị vào Dicts [Cách tốt nhất để gửi các giá trị cần thay đổi]
Hãy xem chương trình dưới đây
return area, perimeter
4Khi chúng ta sử dụng dicts chúng ta có thể
- thay đổi các giá trị ở phía nhận
- thêm nhiều giá trị hơn vào vùng chứa
return area, perimeter
5Tôi để bạn thử xem điều gì sẽ xảy ra khi bạn thực hiện tương tự ở trên với các bộ dữ liệu và bộ dữ liệu có tên
Một ưu điểm khác của việc sử dụng từ điển là bạn có thể thêm các trường vào từ điển được trả về mà không vi phạm mã hiện có. [Tôi chắc chắn rằng những độc giả là những lập trình viên có kinh nghiệm sẽ đánh giá cao tính chất tuyệt vời này. ]
Phương pháp số 4. Đóng gói các giá trị vào Danh sách [Cách tốt nhất để gửi dữ liệu có thể thay đổi không cần tên]
Hãy xem ví dụ bên dưới để biết cách sử dụng danh sách để trả về nhiều giá trị
return area, perimeter
6Chạy mã này sẽ cho một đầu ra như thế này
return area, perimeter
7Khi nào thì sử dụng phương pháp này?
Phương pháp sử dụng danh sách này rất hữu ích khi bạn có một số dữ liệu
- mà các giá trị được sắp xếp và
- ở bên nhận, tất cả những gì bạn cần là chỉ mục để truy cập các giá trị trả về
- và bạn muốn thêm nội dung vào danh sách nếu cần
Ví dụ trên chỉ là một ví dụ thô sơ về tình huống như vậy
Nhưng hãy nhớ rằng, một tuple luôn thích hợp hơn một danh sách khi khả năng biến đổi không phải là một yêu cầu
Phương pháp số 5. Đóng gói các giá trị vào các lớp Tùy chỉnh [Cách tốt nhất để gửi dữ liệu có liên quan chặt chẽ]
Phương pháp tiếp theo là tạo một lớp tùy chỉnh, đóng gói dữ liệu vào một đối tượng và gửi đối tượng đó
Hãy xem ví dụ dưới đây
return area, perimeter
8Nếu lớp của bạn không cần bất kỳ phương thức nào, bạn cũng có thể sử dụng các lớp dữ liệu do Python cung cấp. Bằng cách này, bạn có thể nói rõ ràng rằng lớp này không có bất kỳ phương thức nào
Ví dụ dưới đây cho thấy làm thế nào điều này có thể được thực hiện
return area, perimeter
9Khi nào thì sử dụng phương pháp này?
Bạn có thể sử dụng các phương pháp trên khi cần nhóm dữ liệu lại với nhau thành một lớp duy nhất
Quyết định sử dụng lớp thông thường hay lớp dữ liệu tùy thuộc vào trường hợp sử dụng của bạn. Nếu bạn không thấy việc sử dụng các hàm thành viên, tôi khuyên bạn nên sử dụng lớp dữ liệu thay vì lớp thông thường
Bảng tất cả các phương pháp
Đây là bảng cheat một lần nữa từ đầu bài viết một lần nữa. Tôi hy vọng khoảng thời gian này bạn sẽ có thể hiểu rõ hơn về nó