Giải thích cơ bản đơn giản về câu lệnh trả về là gì, cách sử dụng nó trong Python?
Và sự khác biệt giữa nó và print
câu lệnh là gì?
Giải thích cơ bản đơn giản về câu lệnh trả về là gì, cách sử dụng nó trong Python?
Và sự khác biệt giữa nó và print
câu lệnh là gì?
Câu trả lời:
Các print()
ghi chức năng, tức là, "in", một chuỗi trong giao diện điều khiển. Câu return
lệnh khiến hàm của bạn thoát ra và trả lại giá trị cho trình gọi của nó. Mục đích của các chức năng nói chung là nhận đầu vào và trả về một thứ gì đó. Câu return
lệnh được sử dụng khi một hàm sẵn sàng trả về giá trị cho trình gọi của nó.
Ví dụ: đây là một hàm sử dụng cả hai print()
và return
:
def foo():
print("hello from inside of foo")
return 1
Bây giờ bạn có thể chạy mã gọi foo, như sau:
if __name__ == '__main__':
print("going to call foo")
x = foo()
print("called foo")
print("foo returned " + str(x))
Nếu bạn chạy điều này dưới dạng tập lệnh (ví dụ: .py
tệp) trái ngược với trong trình thông dịch Python, bạn sẽ nhận được kết quả sau:
going to call foo
hello from inside foo
called foo
foo returned 1
Tôi hy vọng điều này làm cho nó rõ ràng hơn. Trình thông dịch ghi các giá trị trả về vào bảng điều khiển để tôi có thể hiểu tại sao ai đó có thể nhầm lẫn.
Đây là một ví dụ khác từ trình thông dịch chứng minh rằng:
>>> def foo():
... print("hello from within foo")
... return 1
...
>>> foo()
hello from within foo
1
>>> def bar():
... return 10 * foo()
...
>>> bar()
hello from within foo
10
Bạn có thể thấy rằng khi nào foo()
được gọi từ bar()
, 1 không được ghi vào bảng điều khiển. Thay vào đó, nó được sử dụng để tính toán giá trị được trả về từ đó bar()
.
print()
là một hàm gây ra hiệu ứng phụ (nó viết một chuỗi trong bảng điều khiển), nhưng việc thực thi lại tiếp tục với câu lệnh tiếp theo. return
khiến hàm ngừng thực thi và trả lại một giá trị cho bất kỳ giá trị nào được gọi là nó.
"foo returned " + str(x)
nếu không bạn sẽ nhận được TypeError: cannot concatenate 'str' and 'int' objects
.
Hãy nghĩ về câu lệnh print như gây ra một hiệu ứng phụ , nó làm cho hàm của bạn viết một số văn bản ra cho người dùng, nhưng nó không thể được sử dụng bởi một hàm khác.
Tôi sẽ cố gắng giải thích điều này tốt hơn với một số ví dụ và một vài định nghĩa từ Wikipedia.
Đây là định nghĩa của một hàm từ Wikipedia
Trong toán học, một hàm kết hợp một đại lượng, đối số của hàm, còn được gọi là đầu vào, với một đại lượng khác, giá trị của hàm, còn được gọi là đầu ra ..
Hãy suy nghĩ về điều đó trong một giây. Điều đó có nghĩa là gì khi bạn nói hàm có một giá trị?
Điều đó có nghĩa là bạn thực sự có thể thay thế giá trị của một hàm bằng một giá trị bình thường! (Giả sử hai giá trị là cùng một loại giá trị)
Tại sao bạn muốn mà bạn hỏi?
Điều gì về các hàm khác có thể chấp nhận cùng một loại giá trị như một đầu vào ?
def square(n):
return n * n
def add_one(n):
return n + 1
print square(12)
# square(12) is the same as writing 144
print add_one(square(12))
print add_one(144)
#These both have the same output
Có một thuật ngữ toán học ưa thích cho các hàm chỉ phụ thuộc vào đầu vào của chúng để tạo ra đầu ra của chúng: Tính minh bạch tham chiếu. Một lần nữa, một định nghĩa từ Wikipedia.
Tính trong suốt tham chiếu và không trong suốt tham chiếu là thuộc tính của các phần của chương trình máy tính. Một biểu thức được cho là trong suốt về mặt tham chiếu nếu nó có thể được thay thế bằng giá trị của nó mà không thay đổi hành vi của chương trình
Có thể hơi khó để hiểu điều này có nghĩa là gì nếu bạn mới bắt đầu lập trình, nhưng tôi nghĩ bạn sẽ hiểu được nó sau một số thử nghiệm. Mặc dù vậy, nói chung, bạn có thể thực hiện những việc như in một hàm và bạn cũng có thể có câu lệnh trả về ở cuối.
Chỉ cần nhớ rằng khi bạn sử dụng return, về cơ bản bạn đang nói "Lệnh gọi hàm này giống như viết giá trị được trả về"
Python thực sự sẽ chèn một giá trị trả về cho bạn nếu bạn từ chối đưa vào giá trị của riêng mình, nó được gọi là "Không có" và nó là một kiểu đặc biệt đơn giản có nghĩa là không có gì hoặc null.
Trong python, chúng ta bắt đầu định nghĩa một hàm bằng "def" và nói chung, nhưng không nhất thiết, kết thúc hàm bằng "return".
Một hàm của biến x được ký hiệu là f (x). Chức năng này làm gì? Giả sử, hàm này thêm 2 vào x. Vì vậy, f (x) = x + 2
Bây giờ, mã của hàm này sẽ là:
def A_function (x):
return x + 2
Sau khi xác định hàm, bạn có thể sử dụng hàm đó cho bất kỳ biến nào và nhận kết quả. Nhu la:
print A_function (2)
>>> 4
Chúng ta có thể viết mã hơi khác một chút, chẳng hạn như:
def A_function (x):
y = x + 2
return y
print A_function (2)
Điều đó cũng sẽ cho "4".
Bây giờ, chúng tôi thậm chí có thể sử dụng mã này:
def A_function (x):
x = x + 2
return x
print A_function (2)
Điều đó cũng sẽ cho 4. Hãy xem, "x" bên cạnh trả về thực sự có nghĩa là (x + 2), không phải x của "A_ function (x)".
Tôi đoán từ ví dụ đơn giản này, bạn sẽ hiểu ý nghĩa của lệnh return.
return
có nghĩa là, "xuất giá trị này từ hàm này".
print
có nghĩa là, "gửi giá trị này đến (nói chung) stdout"
Trong Python REPL, một hàm trả về sẽ được xuất ra màn hình theo mặc định (điều này không hoàn toàn giống với in).
Đây là một ví dụ về in:
>>> n = "foo\nbar" #just assigning a variable. No output
>>> n #the value is output, but it is in a "raw form"
'foo\nbar'
>>> print n #the \n is now a newline
foo
bar
>>>
Đây là một ví dụ về trả lại:
>>> def getN():
... return "foo\nbar"
...
>>> getN() #When this isn't assigned to something, it is just output
'foo\nbar'
>>> n = getN() # assigning a variable to the return value. No output
>>> n #the value is output, but it is in a "raw form"
'foo\nbar'
>>> print n #the \n is now a newline
foo
bar
>>>
Câu trả lời này đi qua một số trường hợp chưa được thảo luận ở trên.
Câu lệnh return cho phép bạn kết thúc việc thực thi một hàm trước khi bạn kết thúc. Điều này làm cho luồng thực thi ngay lập tức quay trở lại người gọi.
Trong dòng số 4:
def ret(n):
if n > 9:
temp = "two digits"
return temp #Line 4
else:
temp = "one digit"
return temp #Line 8
print("return statement")
ret(10)
Sau khi câu lệnh điều kiện được thực thi, ret()
hàm bị kết thúc do return temp
(dòng 4). Do đó, print("return statement")
không được thực thi.
Đầu ra:
two digits
Mã này xuất hiện sau các câu lệnh điều kiện, hoặc vị trí mà luồng điều khiển không thể tiếp cận, là mã chết .
Trả về giá trị
Trong dòng số 4 và 8, câu lệnh return đang được sử dụng để trả về giá trị của một biến tạm thời sau khi điều kiện đã được thực hiện.
Để tạo ra sự khác biệt giữa in và trả lại :
def ret(n):
if n > 9:
print("two digits")
return "two digits"
else :
print("one digit")
return "one digit"
ret(25)
Đầu ra:
two digits
'two digits'
Chỉ để thêm vào câu trả lời xuất sắc của @Nathan Hughes:
Câu return
lệnh có thể được sử dụng như một loại luồng điều khiển. Bằng cách đặt một (hoặc nhiều) return
câu lệnh vào giữa một hàm, chúng ta có thể nói: "dừng thực thi hàm này. Chúng tôi đã có những gì chúng tôi muốn hoặc đã xảy ra lỗi!"
Đây là một ví dụ:
>>> def make_3_characters_long(some_string):
... if len(some_string) == 3:
... return False
... if str(some_string) != some_string:
... return "Not a string!"
... if len(some_string) < 3:
... return ''.join(some_string,'x')[:,3]
... return some_string[:,3]
...
>>> threechars = make_3_characters_long('xyz')
>>> if threechars:
... print threechars
... else:
... print "threechars is already 3 characters long!"
...
threechars is already 3 characters long!
Xem phần Kiểu mã của Hướng dẫn Python để có thêm lời khuyên về cách sử dụng này return
.
Cũng có thể tìm thấy sự khác biệt giữa "return" và "print" trong ví dụ sau:
TRỞ VỀ:
def bigger(a, b):
if a > b:
return a
elif a <b:
return b
else:
return a
Đoạn mã trên sẽ cho kết quả chính xác cho tất cả các đầu vào.
IN:
def bigger(a, b):
if a > b:
print a
elif a <b:
print b
else:
print a
LƯU Ý: Điều này sẽ không thành công đối với nhiều trường hợp thử nghiệm.
LỖI:
----
FAILURE
: Test case input: 3, 8.
Expected result: 8
FAILURE
: Test case input: 4, 3.
Expected result: 4
FAILURE
: Test case input: 3, 3.
Expected result: 3
You passed 0 out of 3 test cases
Tôi nghĩ một câu trả lời thực sự đơn giản có thể hữu ích ở đây:
return
làm cho giá trị (một biến, thường xuyên) có sẵn để người gọi sử dụng (ví dụ: được lưu trữ bởi một hàm mà hàm return
đang sử dụng bên trong). Nếu không có return
, giá trị hoặc biến của bạn sẽ không có sẵn để người gọi lưu trữ / sử dụng lại.
print
in ra màn hình, nhưng không cung cấp giá trị hoặc biến để người gọi sử dụng.
(Hoàn toàn thừa nhận rằng các câu trả lời kỹ lưỡng hơn thì chính xác hơn.)
Đây là sự hiểu biết của tôi. (hy vọng nó sẽ giúp ích cho ai đó và nó chính xác).
def count_number_of(x):
count = 0
for item in x:
if item == "what_you_look_for":
count = count + 1
return count
Vì vậy, đoạn mã đơn giản này đếm số lần xuất hiện của một thứ gì đó. Vị trí của lợi nhuận là đáng kể. Nó cho chương trình của bạn biết bạn cần giá trị ở đâu. Vì vậy, khi bạn in, bạn gửi kết quả ra màn hình. Khi bạn trở lại, bạn nói giá trị sẽ đi đâu đó. Trong trường hợp này, bạn có thể thấy rằng count = 0 được thụt lề với return - chúng tôi muốn giá trị (count + 1) thay thế cho 0. Nếu bạn cố gắng tuân theo logic của mã khi bạn thụt lề lệnh return hơn nữa, đầu ra sẽ luôn là 1 , bởi vì chúng tôi sẽ không bao giờ yêu cầu số lượng ban đầu thay đổi. Tôi hy vọng tôi đã làm đúng. Ồ, và trả về luôn nằm bên trong một hàm.
Điều tốt nhất về return
hàm là bạn có thể trả về một giá trị từ hàm nhưng bạn có thể làm tương tự với print
vậy sự khác biệt là gì? Về cơ bản, return
không phải chỉ trả về mà nó cung cấp đầu ra ở dạng đối tượng để chúng ta có thể lưu giá trị trả về đó từ hàm vào bất kỳ biến nào nhưng chúng ta không thể làm với print
vì nó giống như stdout/cout
trong C Programming
.
Theo dõi đoạn mã dưới đây để hiểu rõ hơn
def add(a, b):
print "ADDING %d + %d" % (a, b)
return a + b
def subtract(a, b):
print "SUBTRACTING %d - %d" % (a, b)
return a - b
def multiply(a, b):
print "MULTIPLYING %d * %d" % (a, b)
return a * b
def divide(a, b):
print "DIVIDING %d / %d" % (a, b)
return a / b
print "Let's do some math with just functions!"
age = add(30, 5)
height = subtract(78, 4)
weight = multiply(90, 2)
iq = divide(100, 2)
print "Age: %d, Height: %d, Weight: %d, IQ: %d" % (age, height, weight, iq)
# A puzzle for the extra credit, type it in anyway.
print "Here is a puzzle."
what = add(age, subtract(height, multiply(weight, divide(iq, 2))))
print "That becomes: ", what, "Can you do it by hand?"
Bây giờ chúng tôi đang thực hiện các hàm toán học của riêng mình cho add, subtract, multiply,
và divide
. Điều quan trọng cần lưu ý là dòng cuối cùng mà chúng tôi nói return a + b
(in add
). Điều này làm như sau:
a
và b
.a + b
. Bạn có thể nói điều này là, "Tôi thêm a
và b
sau đó trả lại chúng."a + b
kết quả này cho một biến.return
nên được sử dụng cho các hàm / phương thức đệ quy hoặc bạn muốn sử dụng giá trị trả về cho các ứng dụng sau này trong thuật toán của mình.
print
nên được sử dụng khi bạn muốn hiển thị đầu ra có ý nghĩa và mong muốn cho người dùng và bạn không muốn làm lộn xộn màn hình với các kết quả trung gian mà người dùng không quan tâm, mặc dù chúng hữu ích cho việc gỡ lỗi mã của bạn.
Đoạn mã sau cho biết cách sử dụng return
và print
đúng cách:
def fact(x):
if x < 2:
return 1
return x * fact(x - 1)
print(fact(5))
Giải thích này đúng cho tất cả các ngôn ngữ lập trình không chỉ python .