Câu lệnh return đó làm cho giá trị x (= 1) được trả về từ hàm. Nhưng hãy nhớ rằng return cũng gây ra thoát khỏi chức năng. Vì vậy, bất kỳ khối nào (vòng lặp for, vòng lặp while, if-else) nằm trong hàm cũng sẽ bị chấm dứt. Do đó, ở bước 3 của lần lặp đầu tiên, câu lệnh return gây ra thoát khỏi phương thức, do đó gây ra thoát khỏi vòng lặp for bên trong phương thức
Nói một cách ẩn dụ, nếu bạn đang đi lang thang qua tất cả các phòng (khối/khối) trong nhà (phương pháp) của mình theo một số thứ tự, và đột nhiên bạn cần khẩn trương rời khỏi (return khỏi) ngôi nhà, thì tất cả các phòng mà bạn chưa ghé thăm (
Loại bỏ bốn khoảng trắng trước câu lệnh return khiến câu lệnh return không còn là một phần của vòng lặp, vì vậy nó chỉ gây ra thoát khỏi phương thức khi vòng lặp kết thúc
và nó tạo ra 80. 55 - tôi tin là điểm trung bình cho sinh viên đầu tiên. Sau đó, khi tôi nhận xét return total_class, nó đã hoạt động. điều này đặt ra câu hỏi - tại sao?
Cảm ơn
Câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 của Python là thành phần chính của các hàm và. Bạn có thể sử dụng câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 để làm cho các hàm của bạn gửi các đối tượng Python trở lại mã người gọi. Các đối tượng này được gọi là giá trị trả về của hàm. Bạn có thể sử dụng chúng để thực hiện thêm tính toán trong các chương trình của mình
Sử dụng câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 một cách hiệu quả là một kỹ năng cốt lõi nếu bạn muốn viết mã các hàm tùy chỉnh Pythonic và mạnh mẽ
Trong hướng dẫn này, bạn sẽ học
Cách sử dụng câu lệnh Python
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 trong hàm của bạn
Cách trả về một hoặc nhiều giá trị từ hàm của bạn
Những phương pháp hay nhất cần quan sát khi sử dụng câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9
Với kiến thức này, bạn sẽ có thể viết các hàm dễ đọc, dễ bảo trì và ngắn gọn hơn trong Python. Nếu bạn hoàn toàn chưa quen với các hàm Python, thì bạn có thể xem Xác định hàm Python của riêng bạn trước khi đi sâu vào hướng dẫn này
Tiền thưởng miễn phí. 5 Suy nghĩ về Làm chủ Python, một khóa học miễn phí dành cho các nhà phát triển Python cho bạn thấy lộ trình và tư duy mà bạn sẽ cần để đưa các kỹ năng Python của mình lên một tầm cao mới
Bắt đầu với các hàm Python
Hầu hết các ngôn ngữ lập trình cho phép bạn gán tên cho một khối mã thực hiện tính toán cụ thể. Các khối mã được đặt tên này có thể được tái sử dụng nhanh chóng vì bạn có thể sử dụng tên của chúng để gọi chúng từ các vị trí khác nhau trong mã của mình
Các lập trình viên gọi các khối mã được đặt tên này là chương trình con, thói quen, thủ tục hoặc hàm tùy thuộc vào ngôn ngữ họ sử dụng. Trong một số ngôn ngữ, có sự khác biệt rõ ràng giữa một quy trình hoặc thủ tục và một chức năng
Đôi khi sự khác biệt đó lớn đến mức bạn cần sử dụng một từ khóa cụ thể để xác định một thủ tục hoặc chương trình con và một từ khóa khác để xác định một hàm. Ví dụ: ngôn ngữ lập trình Visual Basic sử dụng
Nói chung, một thủ tục là một khối mã được đặt tên thực hiện một tập hợp các hành động mà không cần tính toán giá trị hoặc kết quả cuối cùng. Mặt khác, một hàm là một khối mã được đặt tên thực hiện một số hành động với mục đích tính toán giá trị hoặc kết quả cuối cùng, sau đó được gửi lại cho mã người gọi. Cả thủ tục và hàm đều có thể hành động dựa trên một tập hợp các giá trị đầu vào, thường được gọi là đối số
Trong Python, các loại khối mã được đặt tên này được gọi là hàm vì chúng luôn gửi lại giá trị cho người gọi. Tài liệu Python định nghĩa một hàm như sau
Một loạt các câu lệnh trả về một số giá trị cho người gọi. Nó cũng có thể được chuyển bằng 0 hoặc nhiều hơn có thể được sử dụng trong quá trình thực thi phần thân. ()
Mặc dù tài liệu chính thức nói rằng một hàm “trả về một số giá trị cho trình gọi”, nhưng bạn sẽ sớm thấy rằng các hàm có thể trả về bất kỳ đối tượng Python nào cho mã trình gọi
Nói chung, một hàm nhận các đối số (nếu có), thực hiện một số thao tác và trả về một giá trị (hoặc đối tượng). Giá trị mà hàm trả về cho người gọi thường được gọi là giá trị trả về của hàm. Tất cả các hàm Python đều có giá trị trả về, rõ ràng hoặc ẩn. Bạn sẽ đề cập đến sự khác biệt giữa giá trị trả về rõ ràng và tiềm ẩn sau trong hướng dẫn này
Để viết một hàm Python, bạn cần có một tiêu đề bắt đầu bằng từ khóa
6, theo sau là tên của hàm, một danh sách tùy chọn gồm các đối số được phân tách bằng dấu phẩy bên trong một cặp dấu ngoặc đơn bắt buộc và dấu hai chấm cuối cùng.
Thành phần thứ hai của hàm là khối mã hoặc phần thân của hàm. Python xác định các khối mã bằng cách sử dụng thay vì dấu ngoặc, từ khóa
6, tên của hàm và danh sách các đối số trong ngoặc đơn. Lưu ý rằng danh sách các đối số là tùy chọn, nhưng dấu ngoặc đơn là bắt buộc về mặt cú pháp. Sau đó, bạn cần xác định khối mã của hàm, khối này sẽ bắt đầu một cấp độ thụt vào bên phải
0. Loại câu lệnh này hữu ích khi bạn cần một câu lệnh giữ chỗ trong mã của mình để làm cho nó đúng về mặt cú pháp, nhưng bạn không cần thực hiện bất kỳ hành động nào. Câu lệnh
0 còn được gọi là phép toán null vì chúng không thực hiện bất kỳ hành động nào
Ghi chú. Cú pháp đầy đủ để xác định các hàm và đối số của chúng nằm ngoài phạm vi của hướng dẫn này. Để có tài nguyên chuyên sâu về chủ đề này, hãy xem Xác định chức năng Python của riêng bạn
Để sử dụng một chức năng, bạn cần gọi nó. Một lệnh gọi hàm bao gồm tên của hàm theo sau là các đối số của hàm trong ngoặc đơn
function_name(arg1,arg2,...,argN)
Bạn sẽ chỉ cần truyền đối số cho lệnh gọi hàm nếu hàm đó yêu cầu chúng. Mặt khác, dấu ngoặc đơn luôn được yêu cầu trong lệnh gọi hàm. Nếu bạn quên chúng, thì bạn sẽ không gọi hàm mà tham chiếu nó như một đối tượng hàm
Để làm cho các hàm của bạn trả về một giá trị, bạn cần sử dụng. Đó là những gì bạn sẽ trình bày từ thời điểm này trở đi
Loại bỏ các quảng cáo
Hiểu câu lệnh >>> return 42
File "<stdin>", line 1
SyntaxError: 'return' outside function
9 của Python
Câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 trong Python là một câu lệnh đặc biệt mà bạn có thể sử dụng bên trong một hàm hoặc để gửi lại kết quả của hàm cho người gọi. Câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 bao gồm phần tiếp theo là giá trị trả về tùy chọn
Giá trị trả về của hàm Python có thể là bất kỳ đối tượng Python nào. Mọi thứ trong Python đều là đối tượng. Vì vậy, các hàm của bạn có thể trả về các giá trị số (, , và giá trị), các tập hợp và trình tự của các đối tượng (các đối tượng _______18_______0,
>>> defadd_one(x):.. # No return statement at all.. result=x+1...>>> value=add_one(5)>>> value>>> print(value)None
2 trả về một giá trị số, nên bạn có thể sử dụng giá trị đó trong biểu thức toán học hoặc bất kỳ loại biểu thức nào khác trong đó giá trị có ý nghĩa logic hoặc nhất quán. Đây là cách mã trình gọi có thể tận dụng giá trị trả về của hàm
Lưu ý rằng bạn chỉ có thể sử dụng câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 bên trong định nghĩa hàm hoặc phương thức. Nếu bạn sử dụng nó ở bất kỳ nơi nào khác, thì bạn sẽ nhận được một
5 cho biết rằng câu lệnh không thể được sử dụng bên ngoài một hàm
Ghi chú. Các phương thức thông thường, phương thức lớp và phương thức tĩnh chỉ là các hàm trong ngữ cảnh của các lớp Python. Vì vậy, tất cả các khái niệm về câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 mà bạn sẽ trình bày cũng áp dụng cho chúng
Bạn có thể sử dụng bất kỳ đối tượng Python nào làm giá trị trả về. Vì mọi thứ trong Python đều là đối tượng, nên bạn có thể trả về chuỗi, danh sách, bộ dữ liệu, từ điển, hàm, đối tượng do người dùng định nghĩa và thậm chí cả mô-đun hoặc gói
Ví dụ: giả sử bạn cần viết một hàm lấy danh sách các số nguyên và trả về danh sách chỉ chứa các số chẵn trong danh sách ban đầu. Đây là một cách mã hóa chức năng này
06, nhưng chúng được coi là biểu thức hơn là câu lệnh. Đó là lý do tại sao bạn có thể sử dụng chúng trong câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9
Ví dụ khác, giả sử bạn cần tính giá trị trung bình của một mẫu giá trị số. Để làm điều đó, bạn cần chia tổng các giá trị cho số lượng giá trị. Đây là một ví dụ sử dụng các chức năng tích hợp sẵn và
10, bạn không sử dụng biến cục bộ để lưu kết quả phép tính. Thay vào đó, bạn sử dụng biểu thức trực tiếp làm giá trị trả về. Đầu tiên, Python đánh giá biểu thức
function_name(arg1,arg2,...,argN)
11 và sau đó trả về kết quả đánh giá, trong trường hợp này là giá trị
function_name(arg1,arg2,...,argN)
12Loại bỏ các quảng cáo
Ngụ ý >>> return 42
File "<stdin>", line 1
SyntaxError: 'return' outside function
9 Báo cáo
Hàm Python sẽ luôn có giá trị trả về. Không có khái niệm về thủ tục hay quy trình trong Python. Vì vậy, nếu bạn không rõ ràng sử dụng giá trị trả về trong câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 hoặc nếu bạn bỏ qua hoàn toàn câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9, thì Python sẽ ngầm trả về giá trị mặc định cho bạn. Giá trị trả về mặc định đó sẽ luôn là
35. Mục tiêu của chức năng này là in các đối tượng vào tệp luồng văn bản, thường là đầu ra tiêu chuẩn (màn hình của bạn). Vì vậy, chức năng này không cần một câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 rõ ràng bởi vì nó không trả về bất cứ điều gì hữu ích hoặc có ý nghĩa
Nếu bạn đang làm việc trong một phiên tương tác, thì bạn có thể nghĩ rằng việc in một giá trị và trả về một giá trị là các thao tác tương đương. Hãy xem xét hai hàm sau và đầu ra của chúng
>>>
function_name(arg1,arg2,...,argN)
0
Cả hai chức năng dường như làm điều tương tự. Trong cả hai trường hợp, bạn sẽ thấy
function_name(arg1,arg2,...,argN)
38 được in trên màn hình của mình. Chỉ có một sự khác biệt tinh tế có thể nhìn thấy—dấu ngoặc đơn trong ví dụ thứ hai. Nhưng hãy xem điều gì sẽ xảy ra nếu bạn trả về một kiểu dữ liệu khác, chẳng hạn như một đối tượng
Không có sự khác biệt có thể nhìn thấy bây giờ. Trong cả hai trường hợp, bạn có thể thấy
>>> defadd_one(x):.. # No return statement at all.. result=x+1...>>> value=add_one(5)>>> value>>> print(value)None
5 trên màn hình của mình. Hành vi đó có thể gây nhầm lẫn nếu bạn mới bắt đầu với Python. Bạn có thể nghĩ rằng việc trả lại và in một giá trị là những hành động tương đương
Bây giờ, giả sử bạn đang tìm hiểu sâu hơn về Python và bạn đang bắt đầu viết tập lệnh đầu tiên của mình. Bạn mở một trình soạn thảo văn bản và gõ đoạn mã sau
function_name(arg1,arg2,...,argN)
2
function_name(arg1,arg2,...,argN)
50 lấy hai số, cộng chúng và trả về kết quả. Ở dòng 5, bạn gọi
function_name(arg1,arg2,...,argN)
50 để tính tổng
function_name(arg1,arg2,...,argN)
52 cộng với
function_name(arg1,arg2,...,argN)
52. Vì bạn vẫn đang tìm hiểu sự khác biệt giữa trả về và in một giá trị, nên bạn có thể mong đợi tập lệnh của mình in
function_name(arg1,arg2,...,argN)
54 ra màn hình. Tuy nhiên, đó không phải là điều xảy ra và bạn không nhận được gì trên màn hình của mình
Hãy thử nó ra một mình. Lưu tập lệnh của bạn vào tệp có tên
function_name(arg1,arg2,...,argN)
55 và chạy tập lệnh đó từ dòng lệnh của bạn như sau
function_name(arg1,arg2,...,argN)
3
Nếu bạn chạy
function_name(arg1,arg2,...,argN)
55 từ dòng lệnh của mình thì bạn sẽ không thấy bất kỳ kết quả nào trên màn hình của mình. Đó là bởi vì khi bạn chạy tập lệnh, giá trị trả về của các hàm mà bạn gọi trong tập lệnh không được in ra màn hình giống như trong phiên tương tác
Nếu bạn muốn tập lệnh của mình hiển thị kết quả của việc gọi
function_name(arg1,arg2,...,argN)
50 trên màn hình, thì bạn cần gọi rõ ràng
function_name(arg1,arg2,...,argN)
35. Kiểm tra bản cập nhật sau của
function_name(arg1,arg2,...,argN)
55
function_name(arg1,arg2,...,argN)
4
Bây giờ, khi bạn chạy
function_name(arg1,arg2,...,argN)
55, bạn sẽ thấy số
function_name(arg1,arg2,...,argN)
54 trên màn hình của mình
Vì vậy, nếu bạn đang làm việc trong một phiên tương tác, thì Python sẽ hiển thị kết quả của bất kỳ lệnh gọi hàm nào trực tiếp trên màn hình của bạn. Nhưng nếu bạn đang viết một kịch bản và bạn muốn xem giá trị trả về của một hàm, thì bạn cần sử dụng rõ ràng
function_name(arg1,arg2,...,argN)
35Loại bỏ các quảng cáo
Trả về nhiều giá trị
Bạn có thể sử dụng câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 để trả về nhiều giá trị từ một hàm. Để làm điều đó, bạn chỉ cần cung cấp một số giá trị trả về được phân tách bằng dấu phẩy
Ví dụ: giả sử bạn cần viết một hàm lấy một mẫu dữ liệu số và trả về một bản tóm tắt các phép đo thống kê. Để mã hóa chức năng đó, bạn có thể sử dụng mô-đun tiêu chuẩn Python
function_name(arg1,arg2,...,argN)
64, cung cấp một số hàm để tính toán thống kê toán học của dữ liệu số
Đây là một triển khai có thể có của chức năng của bạn
function_name(arg1,arg2,...,argN)
5
Trong
function_name(arg1,arg2,...,argN)
65, bạn tận dụng khả năng của Python để trả về nhiều giá trị trong một câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 duy nhất bằng cách trả về giá trị trung bình, trung vị và chế độ của mẫu cùng một lúc. Lưu ý rằng, để trả về nhiều giá trị, bạn chỉ cần viết chúng trong danh sách được phân tách bằng dấu phẩy theo thứ tự bạn muốn trả về
Khi bạn đã mã hóa
function_name(arg1,arg2,...,argN)
65, bạn có thể tận dụng một tính năng mạnh mẽ của Python được gọi là giải nén lặp lại để giải nén ba biện pháp thành ba biến riêng biệt hoặc bạn chỉ có thể lưu trữ mọi thứ trong một biến
>>>
function_name(arg1,arg2,...,argN)
6
Tại đây, bạn giải nén ba giá trị trả về của
function_name(arg1,arg2,...,argN)
65 thành các biến
function_name(arg1,arg2,...,argN)
69,
function_name(arg1,arg2,...,argN)
70 và
function_name(arg1,arg2,...,argN)
71. Lưu ý rằng trong ví dụ trước, bạn lưu trữ tất cả các giá trị trong một biến duy nhất,
Hàm dựng sẵn cũng là một ví dụ về hàm trả về nhiều giá trị. Hàm lấy hai số (không phức tạp) làm đối số và trả về hai số, thương của hai giá trị đầu vào và phần còn lại của phép chia
>>>
function_name(arg1,arg2,...,argN)
7
Cuộc gọi đến ____14_______77 trả về một bộ chứa thương và phần còn lại là kết quả của việc chia hai số không phức tạp được cung cấp dưới dạng đối số. Đây là một ví dụ về hàm có nhiều giá trị trả về
Sử dụng câu lệnh >>> return 42
File "<stdin>", line 1
SyntaxError: 'return' outside function
9 của Python. Thực hành tốt nhất
Cho đến giờ, bạn đã nắm được những kiến thức cơ bản về cách thức hoạt động của câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 trong Python. Bây giờ bạn đã biết cách viết các hàm trả về một hoặc nhiều giá trị cho người gọi. Ngoài ra, bạn đã học được rằng nếu bạn không thêm câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 rõ ràng với giá trị trả về rõ ràng vào một hàm nhất định, thì Python sẽ thêm câu lệnh đó cho bạn. Giá trị đó sẽ là
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 ngầm mà Python thêm vào bất kỳ hàm nào mà không có hàm rõ ràng. Điều này có thể gây nhầm lẫn cho các nhà phát triển đến từ các ngôn ngữ lập trình khác trong đó một hàm không có giá trị trả về được gọi là một thủ tục
Có những tình huống mà bạn có thể thêm một
function_name(arg1,arg2,...,argN)
86 rõ ràng vào các chức năng của mình. Tuy nhiên, trong các tình huống khác, bạn có thể dựa vào hành vi mặc định của Python
Nếu hàm của bạn thực hiện các hành động nhưng không có giá trị
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 rõ ràng và hữu ích, thì bạn có thể bỏ qua việc trả về
6 một cách rõ ràng hay không là quyết định cá nhân. Tuy nhiên, bạn nên cân nhắc rằng trong một số trường hợp, một
function_name(arg1,arg2,...,argN)
86 rõ ràng có thể tránh được các vấn đề về khả năng bảo trì. Điều này đặc biệt đúng đối với các nhà phát triển đến từ các ngôn ngữ lập trình khác không hoạt động như Python.Loại bỏ các quảng cáo
Ghi nhớ giá trị trả về
Khi viết các hàm tùy chỉnh, bạn có thể vô tình quên trả về một giá trị từ một hàm. Trong trường hợp này, Python sẽ trả về
6 cho bạn. Điều này có thể gây ra các lỗi tinh vi mà nhà phát triển Python mới bắt đầu có thể khó hiểu và gỡ lỗi
Bạn có thể tránh vấn đề này bằng cách viết câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 ngay sau phần đầu của hàm. Sau đó, bạn có thể thực hiện lần thứ hai để viết phần thân của hàm. Đây là một mẫu mà bạn có thể sử dụng khi mã hóa các hàm Python của mình
function_name(arg1,arg2,...,argN)
9
Nếu bạn đã quen với việc bắt đầu các chức năng của mình như thế này, thì rất có thể bạn sẽ không còn nhớ câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 nữa. Với phương pháp này, bạn có thể viết phần thân của hàm, kiểm tra nó và đổi tên các biến sau khi bạn biết rằng hàm đó hoạt động
Phương pháp này có thể tăng năng suất của bạn và làm cho các chức năng của bạn ít bị lỗi hơn. Nó cũng có thể giúp bạn tiết kiệm rất nhiều thời gian gỡ lỗi
Tránh các biểu thức phức tạp
Như bạn đã thấy trước đây, một phương pháp phổ biến là sử dụng kết quả của một biểu thức làm giá trị trả về trong các hàm Python. Nếu biểu thức mà bạn đang sử dụng trở nên quá phức tạp thì cách làm này có thể dẫn đến các hàm khó hiểu, khó gỡ lỗi và bảo trì
Ví dụ: nếu bạn đang thực hiện một phép tính phức tạp, thì sẽ dễ đọc hơn khi tính toán tăng dần kết quả cuối cùng bằng cách sử dụng các biến tạm thời có tên có ý nghĩa
Hãy xem xét hàm sau tính toán phương sai của một mẫu dữ liệu số
>>>
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
0
Cách diễn đạt mà bạn sử dụng ở đây khá phức tạp và khó hiểu. Cũng khó gỡ lỗi vì bạn đang thực hiện nhiều thao tác trong một biểu thức. Để khắc phục sự cố cụ thể này, bạn có thể tận dụng lợi thế của phương pháp phát triển gia tăng để cải thiện khả năng đọc của hàm
Hãy xem triển khai thay thế sau đây của
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
04
>>>
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
1
Trong lần triển khai thứ hai này của
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
04, bạn tính phương sai theo một số bước. Mỗi bước được biểu thị bằng một biến tạm thời có tên có ý nghĩa
Các biến tạm thời như
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
06,
function_name(arg1,arg2,...,argN)
69 và
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
08 thường hữu ích khi gỡ lỗi mã của bạn. Ví dụ, nếu có vấn đề xảy ra với một trong số chúng, thì bạn có thể gọi cho
function_name(arg1,arg2,...,argN)
35 để biết chuyện gì đang xảy ra trước khi câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 chạy
Nói chung, bạn nên tránh sử dụng các biểu thức phức tạp trong câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 của mình. Thay vào đó, bạn có thể chia mã của mình thành nhiều bước và sử dụng các biến tạm thời cho từng bước. Sử dụng các biến tạm thời có thể giúp mã của bạn dễ gỡ lỗi, hiểu và bảo trì hơn
Trả về giá trị so với sửa đổi Globals
Các hàm không có câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 rõ ràng với giá trị trả về có ý nghĩa thường tạo thành các hành động có. Ví dụ, một tác dụng phụ có thể là in nội dung nào đó ra màn hình, sửa đổi một , cập nhật trạng thái của một đối tượng, v.v.
Sửa đổi các biến toàn cầu thường được coi là một thực hành lập trình xấu. Cũng giống như các chương trình có biểu thức phức tạp, các chương trình sửa đổi các biến toàn cục có thể khó gỡ lỗi, hiểu và bảo trì
Khi bạn sửa đổi một biến toàn cục, bạn có khả năng ảnh hưởng đến tất cả các hàm, lớp, đối tượng và bất kỳ phần nào khác của chương trình dựa trên biến toàn cục đó
Để hiểu một chương trình sửa đổi các biến toàn cục, bạn cần biết tất cả các phần của chương trình có thể xem, truy cập và thay đổi các biến đó. Vì vậy, thực hành tốt khuyên bạn nên viết các hàm độc lập nhận một số đối số và trả về một giá trị (hoặc các giá trị) hữu ích mà không gây ra bất kỳ tác dụng phụ nào đối với các biến toàn cục
Ngoài ra, các hàm có câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 rõ ràng trả về một giá trị có ý nghĩa sẽ dễ kiểm tra hơn các hàm sửa đổi hoặc cập nhật các biến toàn cục
Ví dụ sau đây cho thấy một hàm thay đổi một biến toàn cục. Hàm sử dụng , đây cũng được coi là một cách lập trình tồi trong Python
>>>
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
2
Trong ví dụ này, trước tiên bạn tạo một biến toàn cục,
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
15, với giá trị ban đầu là
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
16. Bên trong
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
17, bạn sử dụng câu lệnh
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
14 để báo cho hàm rằng bạn muốn sửa đổi một biến toàn cục. Tuyên bố cuối cùng tăng
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
15 bởi
function_name(arg1,arg2,...,argN)
17
Kết quả của việc gọi
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
17 sẽ phụ thuộc vào giá trị ban đầu của
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
15. Các giá trị ban đầu khác nhau cho
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
15 sẽ tạo ra các kết quả khác nhau, do đó, kết quả của hàm không thể được kiểm soát bởi chính hàm đó
Để tránh loại hành vi này, bạn có thể viết một
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
17 độc lập nhận các đối số và trả về một giá trị nhất quán chỉ phụ thuộc vào các đối số đầu vào
>>>
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
3
Bây giờ, kết quả của việc gọi
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
17 chỉ phụ thuộc vào các đối số đầu vào hơn là giá trị ban đầu của
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
15. Điều này làm cho chức năng mạnh mẽ hơn và dễ kiểm tra hơn
Ghi chú. Để hiểu rõ hơn về cách kiểm tra mã Python của bạn, hãy xem Phát triển dựa trên thử nghiệm với PyTest
Ngoài ra, khi bạn cần cập nhật
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
15, bạn có thể thực hiện điều đó một cách rõ ràng bằng cách gọi tới ____30_______17. Bằng cách này, bạn sẽ có nhiều quyền kiểm soát hơn đối với những gì đang xảy ra với
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
15 trong toàn bộ mã của mình
Nói chung, nên tránh các hàm sửa đổi các biến toàn cục. Nếu có thể, hãy thử viết các hàm độc lập với câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 rõ ràng trả về một giá trị nhất quán và có ý nghĩaLoại bỏ các quảng cáo
Sử dụng >>> return 42
File "<stdin>", line 1
SyntaxError: 'return' outside function
9 Với câu điều kiện
Các hàm Python không bị hạn chế chỉ có một câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9. Nếu một hàm đã cho có nhiều hơn một câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9, thì câu lệnh đầu tiên gặp phải sẽ xác định điểm kết thúc quá trình thực thi của hàm và cả giá trị trả về của nó
Một cách phổ biến để viết các hàm có nhiều câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 là sử dụng các câu lệnh điều kiện cho phép bạn cung cấp các câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 khác nhau tùy thuộc vào kết quả đánh giá một số điều kiện
Giả sử bạn cần viết mã một hàm nhận vào một số và trả về giá trị tuyệt đối của nó. Nếu số lớn hơn
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
16, thì bạn sẽ trả về cùng một số. Nếu số nhỏ hơn
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
16, thì bạn sẽ trả về giá trị ngược lại hoặc giá trị không âm
Đây là một triển khai khả thi cho chức năng này
>>>
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
4
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
38 có hai câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 rõ ràng, mỗi câu lệnh được bao bọc trong câu lệnh
function_name(arg1,arg2,...,argN)
06 của chính nó. Nó cũng có một câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 ngầm. Nếu
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
42 lại là
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
16, thì cả hai điều kiện đều không đúng và hàm kết thúc mà không nhấn bất kỳ câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 rõ ràng nào. Khi điều này xảy ra, bạn sẽ tự động nhận được
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 thứ ba, hoặc trong mệnh đề
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
56 mới hoặc trong mệnh đề cuối cùng
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
57
>>>
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
6
Bây giờ,
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
38 kiểm tra mọi điều kiện có thể,
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
59,
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
60 và
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
61. Mục đích của ví dụ này là để chỉ ra rằng khi bạn đang sử dụng các câu lệnh có điều kiện để cung cấp nhiều câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9, bạn cần đảm bảo rằng mọi tùy chọn có thể có câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 của riêng nó. Nếu không, chức năng của bạn sẽ có một lỗi ẩn
Cuối cùng, bạn có thể triển khai
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
38 theo cách ngắn gọn, hiệu quả và Pythonic hơn bằng cách sử dụng một câu lệnh
function_name(arg1,arg2,...,argN)
06
>>>
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
7
Trong trường hợp này, hàm của bạn chạm vào câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 đầu tiên nếu
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
60. Trong tất cả các trường hợp khác, cho dù là
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
59 hay
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
61, nó chạm vào câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 thứ hai. Với triển khai mới này, chức năng của bạn trông tốt hơn rất nhiều. Nó dễ đọc hơn, súc tích và hiệu quả hơn
Ghi chú. Có một hàm Python tích hợp tiện lợi được gọi để tính giá trị tuyệt đối của một số. Hàm trong ví dụ trên chỉ nhằm mục đích minh họa cho điểm đang thảo luận
Nếu bạn đang sử dụng câu lệnh
function_name(arg1,arg2,...,argN)
06 để cung cấp một số câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9, thì bạn không cần mệnh đề
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
57 để bao hàm điều kiện cuối cùng. Chỉ cần thêm một câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 vào cuối khối mã của hàm và ở mức thụt lề đầu tiên
Trả lại >>> def return_42():
.. return 42 # An explicit return statement
...
>>> return_42() # The caller code gets 42
42
76 hoặc >>> def return_42():
.. return 42 # An explicit return statement
...
>>> return_42() # The caller code gets 42
42
77
Một trường hợp sử dụng phổ biến khác cho sự kết hợp của các câu lệnh
function_name(arg1,arg2,...,argN)
06 và
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 là khi bạn đang mã hóa một vị ngữ hoặc hàm có giá trị Boolean. Loại hàm này trả về
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
76 hoặc
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
77 theo một điều kiện nhất định
Ví dụ: giả sử bạn cần viết một hàm nhận vào hai số nguyên,
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
82 và
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
83, rồi trả về
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
76 nếu
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
82 chia hết cho
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
83. Nếu không, hàm sẽ trả về
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
77. Đây là một triển khai có thể
>>>
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
8
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
88 trả về
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
76 nếu phần còn lại của phép chia
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
82 cho
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
83 bằng với
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
16. Nếu không, nó sẽ trả về
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
77. Lưu ý rằng trong Python, giá trị
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
16 là , vì vậy bạn cần sử dụng giá trị để phủ định giá trị thực của điều kiện
Đôi khi bạn sẽ viết các hàm vị ngữ liên quan đến các toán tử như sau
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
96,
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
97,
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
98,
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
32 và theo cách bạn đã thấy trước đó, thì các hàm vị ngữ của bạn sẽ không hoạt động chính xác. Đó là bởi vì các toán tử này hoạt động khác nhau. Chúng trả về một trong các toán hạng trong điều kiện thay vì
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
76 hoặc
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
32 trả về toán hạng thực đầu tiên hoặc toán hạng cuối cùng. Vì vậy, để viết một vị ngữ liên quan đến một trong các toán tử này, bạn sẽ cần sử dụng một câu lệnh
function_name(arg1,arg2,...,argN)
06 rõ ràng hoặc gọi hàm tích hợp sẵn
Giả sử bạn muốn viết một hàm vị từ nhận hai giá trị và trả về
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
76 nếu cả hai đều đúng và
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
77 nếu ngược lại. Đây là cách tiếp cận đầu tiên của bạn với chức năng này
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
76 nếu
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
82 và
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
83 là đúng và
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
77 nếu ngược lại. Tùy bạn sử dụng cách tiếp cận nào để giải quyết vấn đề này. Tuy nhiên, giải pháp thứ hai có vẻ dễ đọc hơn. Bạn nghĩ sao?Loại bỏ các quảng cáo
Vòng lặp ngắn mạch
Một câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 bên trong một vòng lặp thực hiện một số kiểu đoản mạch. Nó phá vỡ việc thực thi vòng lặp và làm cho hàm trả về ngay lập tức. Để hiểu rõ hơn về hành vi này, bạn có thể viết một hàm mô phỏng
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
77
Chức năng này thực hiện đánh giá ngắn mạch. Ví dụ: giả sử bạn vượt qua một lần lặp có chứa một triệu mục. Nếu mục đầu tiên trong lần lặp đó xảy ra là đúng, thì vòng lặp chỉ chạy một lần chứ không phải một triệu lần. Điều này có thể giúp bạn tiết kiệm rất nhiều thời gian xử lý khi chạy mã của mình
Điều quan trọng cần lưu ý là để sử dụng câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 bên trong một vòng lặp, bạn cần bọc câu lệnh đó trong một câu lệnh
function_name(arg1,arg2,...,argN)
06. Nếu không, vòng lặp sẽ luôn bị ngắt trong lần lặp đầu tiên
Nhận biết mã chết
Ngay khi một hàm chạm vào câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9, nó sẽ kết thúc mà không thực thi bất kỳ mã nào tiếp theo. Do đó, mã xuất hiện sau câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 của hàm thường được gọi là mã chết. Trình thông dịch Python hoàn toàn bỏ qua mã chết khi chạy các chức năng của bạn. Vì vậy, có loại mã đó trong một chức năng là vô ích và khó hiểu
Xem xét hàm sau đây, hàm này thêm mã sau câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
10. Đối tượng này có thể có các thuộc tính được đặt tên mà bạn có thể truy cập bằng cách sử dụng ký hiệu dấu chấm hoặc bằng cách sử dụng thao tác lập chỉ mục. Trong ví dụ này, các thuộc tính đó là
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
11,
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
12 và
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
13
Bạn có thể tạo một đối tượng
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
10 và sử dụng nó làm giá trị trả về. Để làm điều đó, bạn cần khởi tạo
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
10 giống như bạn làm với bất kỳ lớp Python nào. Lưu ý rằng bạn cần cung cấp một giá trị cụ thể cho từng thuộc tính được đặt tên, giống như bạn đã làm trong câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
96 chứa giá trị trung bình, trung vị và kiểu của mẫu. Lưu ý rằng bạn có thể truy cập từng phần tử của bộ dữ liệu bằng cách sử dụng ký hiệu dấu chấm hoặc thao tác lập chỉ mục
Cuối cùng, bạn cũng có thể sử dụng thao tác giải nén lặp lại để lưu trữ từng giá trị trong biến độc lập của chính nó
Loại bỏ các quảng cáo
Chức năng trả về. đóng cửa
Trong Python, các chức năng là. Đối tượng hạng nhất là một đối tượng có thể được gán cho một biến, được truyền dưới dạng đối số cho hàm hoặc được sử dụng làm giá trị trả về trong hàm. Vì vậy, bạn có thể sử dụng một đối tượng hàm làm giá trị trả về trong bất kỳ câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 nào
Một hàm lấy một hàm làm đối số, trả về một hàm dưới dạng kết quả hoặc cả hai là một hàm bậc cao hơn. A là một ví dụ phổ biến về hàm bậc cao hơn trong Python. Loại hàm này nhận một số đối số và trả về một hàm bên trong. Hàm bên trong thường được gọi là bao đóng
Một bao đóng mang thông tin về phạm vi thực hiện kèm theo của nó. Điều này cung cấp một cách để giữ lại thông tin trạng thái giữa các lần gọi hàm. Các hàm đóng của nhà máy rất hữu ích khi bạn cần viết mã dựa trên khái niệm đánh giá lười biếng hoặc chậm trễ
Giả sử bạn cần viết một hàm trợ giúp nhận vào một số và trả về kết quả nhân số đó với một thừa số đã cho. Bạn có thể mã chức năng đó như sau
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
0
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
21 lấy
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
22 và
>>> defreturn_42():.. return42# An explicit return statement...>>> return_42()# The caller code gets 4242
42 làm đối số và trả lại sản phẩm của họ. Vì
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
22 hiếm khi thay đổi trong ứng dụng của bạn, nên bạn cảm thấy khó chịu khi cung cấp cùng một hệ số trong mọi lệnh gọi hàm. Vì vậy, bạn cần một cách để giữ lại trạng thái hoặc giá trị của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
22 giữa các lần gọi đến
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
21 và chỉ thay đổi nó khi cần. Để giữ lại giá trị hiện tại của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
22 giữa các cuộc gọi, bạn có thể sử dụng một bao đóng
Việc triển khai sau đây của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
21 sử dụng một bao đóng để giữ lại giá trị của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
22 giữa các cuộc gọi
>>>
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
1
Bên trong
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
21, bạn định nghĩa một hàm bên trong có tên là
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
31 và trả về nó mà không cần gọi nó. Đối tượng hàm mà bạn trả về là một bao đóng giữ lại thông tin về trạng thái của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
22. Nói cách khác, nó ghi nhớ giá trị của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
22 giữa các cuộc gọi. Đó là lý do tại sao
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
34 nhớ rằng
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
22 bằng với
function_name(arg1,arg2,...,argN)
52 và
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
37 nhớ rằng
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
22 bằng với
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
39
Lưu ý rằng bạn có thể tự do sử dụng lại
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
34 và
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
37 vì họ không quên thông tin trạng thái tương ứng của họ
Bạn cũng có thể sử dụng hàm
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
42 để tạo bao đóng. Đôi khi, việc sử dụng hàm
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
42 có thể làm cho nhà máy đóng cửa của bạn ngắn gọn hơn. Đây là một triển khai thay thế của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
21 bằng cách sử dụng hàm
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
42
>>>
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
2
Việc triển khai này hoạt động giống như ví dụ ban đầu. Trong trường hợp này, việc sử dụng hàm
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
42 cung cấp một cách nhanh chóng và ngắn gọn để viết mã
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
21
Chức năng lấy và trả về. người trang trí
Một cách khác để sử dụng câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 để trả về các đối tượng hàm là viết các hàm trang trí. Hàm trang trí lấy một đối tượng hàm làm đối số và trả về một đối tượng hàm. Trình trang trí xử lý chức năng được trang trí theo một cách nào đó và trả lại hoặc thay thế nó bằng một chức năng hoặc đối tượng có thể gọi khác
Trình trang trí rất hữu ích khi bạn cần thêm logic bổ sung vào các chức năng hiện có mà không cần sửa đổi chúng. Ví dụ: bạn có thể mã hóa một trình trang trí để ghi nhật ký các lệnh gọi hàm, xác thực các đối số cho một hàm, đo thời gian thực hiện của một hàm đã cho, v.v.
Ví dụ sau đây cho thấy một hàm trang trí mà bạn có thể sử dụng để biết được thời gian thực hiện của một hàm Python đã cho
>>>
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
3
Cú pháp
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
49 phía trên tiêu đề của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
50 tương đương với biểu thức
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
51. Trong trường hợp này, bạn có thể nói rằng
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
52 đang trang trí cho
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
50
Python chạy các hàm trang trí ngay khi bạn nhập hoặc chạy mô-đun hoặc tập lệnh. Vì vậy, khi bạn gọi
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
50, bạn thực sự đang gọi giá trị trả về của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
52, là đối tượng hàm
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
56. Cuộc gọi đến
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
50 được trang trí sẽ trả về giá trị trung bình của mẫu và cũng sẽ đo thời gian thực hiện của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
50 ban đầu
Trong trường hợp này, bạn sử dụng để đo thời gian thực hiện bên trong decorator.
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
59 sống trong một mô-đun có tên là
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
61 cung cấp một tập hợp các chức năng liên quan đến thời gian.
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
59 trả về thời gian tính bằng giây vì dưới dạng số dấu phẩy động. Sự khác biệt giữa thời gian trước và sau khi gọi đến
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
50 sẽ cho bạn ý tưởng về thời gian thực hiện chức năng
Ghi chú. Trong
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
50, bạn sử dụng chức năng tạm dừng việc thực thi mã gọi trong một số giây nhất định. Để hiểu rõ hơn về cách sử dụng
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
66, hãy xem Python sleep(). Cách thêm độ trễ thời gian vào mã của bạn
Các ví dụ phổ biến khác về trình trang trí trong Python là
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
67,
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
68 và. Nếu bạn muốn tìm hiểu sâu hơn về các công cụ trang trí Python, hãy xem Primer on Python Decorators. Bạn cũng có thể xem Python Decorators 101Loại bỏ các quảng cáo
Trả về các đối tượng do người dùng định nghĩa. Mô hình nhà máy
Câu lệnh Python
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 cũng có thể trả về. Nói cách khác, bạn có thể sử dụng các đối tượng tùy chỉnh của riêng mình làm giá trị trả về trong một hàm. Một trường hợp sử dụng phổ biến cho khả năng này là mẫu xuất xưởng
Mẫu xuất xưởng xác định một giao diện để tạo các đối tượng một cách nhanh chóng nhằm đáp ứng các điều kiện mà bạn không thể đoán trước khi viết chương trình. Bạn có thể triển khai một nhà máy gồm các đối tượng do người dùng định nghĩa bằng cách sử dụng hàm nhận một số đối số khởi tạo và trả về các đối tượng khác nhau tùy theo đầu vào cụ thể
Giả sử bạn đang viết một ứng dụng vẽ tranh. Bạn cần nhanh chóng tạo các hình dạng khác nhau để đáp ứng lựa chọn của người dùng. Chương trình của bạn sẽ có hình vuông, hình tròn, hình chữ nhật, v.v. Để tạo các hình dạng đó một cách nhanh chóng, trước tiên bạn cần tạo các lớp hình dạng mà bạn sẽ sử dụng
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
4
Sau khi bạn có một lớp cho mỗi hình dạng, bạn có thể viết một hàm lấy tên của hình dạng dưới dạng một chuỗi và danh sách đối số tùy chọn (
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
71) và đối số từ khóa (
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
72) để tạo và khởi tạo hình dạng một cách nhanh chóng
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
5
Hàm này tạo một thể hiện của hình dạng cụ thể và trả về cho người gọi. Bây giờ bạn có thể sử dụng
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
73 để tạo các đối tượng có hình dạng khác nhau để đáp ứng nhu cầu của người dùng của bạn
>>>
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
6
Nếu bạn gọi
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
73 với tên của hình dạng được yêu cầu là một chuỗi, thì bạn sẽ nhận được một phiên bản mới của hình dạng khớp với
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
75 mà bạn vừa chuyển đến nhà máy
Sử dụng >>> return 42
File "<stdin>", line 1
SyntaxError: 'return' outside function
9 trong khối >>> return 42
File "<stdin>", line 1
SyntaxError: 'return' outside function
77 … >>> return 42
File "<stdin>", line 1
SyntaxError: 'return' outside function
78
Khi bạn sử dụng câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 bên trong mệnh đề with, mệnh đề
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
78 đó luôn được thực hiện trước câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9. Điều này đảm bảo rằng mã trong mệnh đề
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
78 sẽ luôn chạy. Kiểm tra ví dụ sau
>>>
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
7
Khi bạn gọi
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
85, bạn nhận được ________86 được chuyển đổi thành số dấu phẩy động hoặc đối tượng chuỗi. Trước khi làm điều đó, hàm của bạn sẽ chạy mệnh đề
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
78 và in một thông báo ra màn hình của bạn. Bất kỳ mã nào bạn thêm vào mệnh đề
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
78 sẽ được thực thi trước khi hàm chạy câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 của nó
Sử dụng >>> return 42
File "<stdin>", line 1
SyntaxError: 'return' outside function
9 trong Hàm tạo
Hàm Python có a trong phần thân của nó là hàm tạo. Khi bạn gọi một hàm tạo, nó sẽ trả về một. Vì vậy, bạn có thể nói rằng hàm tạo là một nhà máy tạo
Bạn có thể sử dụng câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 bên trong hàm tạo để chỉ ra rằng trình tạo đã hoàn tất. Câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 sẽ làm cho trình tạo tăng một. Giá trị trả về sẽ được truyền dưới dạng đối số cho trình khởi tạo của
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
94 và sẽ được gán cho thuộc tính
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
96 của nó
Đây là một máy phát điện tạo ra
function_name(arg1,arg2,...,argN)
17 và
function_name(arg1,arg2,...,argN)
52 theo yêu cầu và sau đó trả về
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
39
>>>
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
52. Trong cuộc gọi thứ ba, trình tạo đã cạn kiệt và bạn nhận được một
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
94. Lưu ý rằng giá trị trả về của hàm tạo (_______0_______39) trở thành thuộc tính
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
96 của đối tượng
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
94Loại bỏ các quảng cáo
Phần kết luận
Câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 của Python cho phép bạn gửi bất kỳ đối tượng Python nào từ các chức năng tùy chỉnh của bạn trở lại mã người gọi. Câu lệnh này là một phần cơ bản của bất kỳ hàm hoặc phương thức Python nào. Nếu bạn thành thạo cách sử dụng nó, thì bạn sẽ sẵn sàng viết mã các chức năng mạnh mẽ
Trong hướng dẫn này, bạn đã học cách
Sử dụng hiệu quả câu lệnh Python
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9 trong hàm của bạn
Trả lại một hoặc nhiều giá trị từ các chức năng của bạn cho mã người gọi
Áp dụng các phương pháp hay nhất khi sử dụng câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9
Ngoài ra, bạn đã học được một số trường hợp sử dụng nâng cao hơn cho câu lệnh
>>> return42
File "<stdin>", line 1SyntaxError: 'return' outside function
9, chẳng hạn như cách viết mã a và hàm trang trí. Với kiến thức này, bạn sẽ có thể viết các hàm Pythonic, mạnh mẽ và có thể bảo trì hơn bằng Python
Đánh dấu là đã hoàn thành
Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Sử dụng câu lệnh return trong Python một cách hiệu quả
🐍 Thủ thuật Python 💌
Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python
Gửi cho tôi thủ thuật Python »
Giới thiệu về Leodanis Pozo Ramos
Leodanis là một kỹ sư công nghiệp yêu thích Python và phát triển phần mềm. Anh ấy là một nhà phát triển Python tự học với hơn 6 năm kinh nghiệm. Anh ấy là một nhà văn đam mê kỹ thuật với số lượng bài báo được xuất bản ngày càng tăng trên Real Python và các trang web khác
» Tìm hiểu thêm về Leodanis
Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là
Aldren
Bryan
Geir Arne
Joanna
Gia-cốp
Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Chuyên gia Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực
Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia
Nâng cao kỹ năng Python của bạn »
Bạn nghĩ sao?
Đánh giá bài viết này
Tweet Chia sẻ Chia sẻ Email
Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?
Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi
Bạn có thể đặt return trong vòng lặp for Python không?
Việc sử dụng hàm return bên trong vòng lặp sẽ phá vỡ nó và thoát khỏi hàm ngay cả khi quá trình lặp vẫn chưa kết thúc . Trong một số trường hợp, chúng tôi cần ngắt vòng lặp nếu một số điều kiện được đáp ứng. Tuy nhiên, trong mã hiện tại của bạn, việc phá vỡ vòng lặp trước khi kết thúc là vô tình.
Bạn có thể sử dụng return trong vòng lặp for không?
Có, trả về dừng thực thi và thoát khỏi chức năng . return always** thoát khỏi chức năng của nó ngay lập tức, không cần thực thi thêm nếu nó nằm trong vòng lặp for.
Trả về có dừng vòng lặp for Python không?
Câu lệnh break thoát khỏi vòng lặp. Câu lệnh return thoát khỏi một hàm hoặc phương thức .
Vòng lặp return in for có phá vỡ vòng lặp không?
Câu lệnh return chỉ dừng vòng lặp nếu nó nằm trong hàm (i. e. nó kết thúc cả vòng lặp và chức năng).