Điều gì xảy ra khi bạn trả về nhiều giá trị trong Python?

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

Có 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
0

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

Trừ 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
2

Như 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
3

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

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

Tô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
6

Chạy mã này sẽ cho một đầu ra như thế này

return area, perimeter
7

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

Nế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
9

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

Trả về có thể trả về nhiều giá trị Python không?

Bạn có thể trả về nhiều giá trị từ một hàm trong Python . Để làm như vậy, hãy trả về cấu trúc dữ liệu chứa nhiều giá trị, chẳng hạn như danh sách chứa số dặm chạy mỗi tuần. Cấu trúc dữ liệu trong Python được sử dụng để lưu trữ các bộ sưu tập dữ liệu, có thể được trả về từ các hàm.

Chúng ta có thể trả về 3 giá trị trong Python không?

Trong Python, chúng ta có thể trả về nhiều giá trị từ một hàm .

Trả về có thể có nhiều giá trị không?

Nếu chúng ta muốn hàm trả về nhiều giá trị của cùng một kiểu dữ liệu, chúng ta có thể trả con trỏ về mảng của kiểu dữ liệu đó . Chúng ta cũng có thể làm cho hàm trả về nhiều giá trị bằng cách sử dụng các đối số của hàm.

Chủ Đề