- Nhà
- Hướng dẫn Python
- Chức năng trong Python
Cập nhật lần cuối vào ngày 22 tháng 9 năm 2020
Cho đến nay trong khóa học này, chúng tôi đã sử dụng các chức năng tích hợp đi kèm với Python. Trong bài học này, chúng ta sẽ tìm hiểu làm thế nào chúng ta có thể tạo ra các chức năng của riêng mình. Nhưng trước khi chúng ta làm điều đó, chúng ta hãy dành thời gian để tìm hiểu lý do tại sao chúng ta thậm chí cần chúng ngay từ đầu.
Giả sử bạn muốn tạo một chương trình cho phép người dùng tính tổng giữa hai số. Tại thời điểm này, bạn không nên có bất kỳ vấn đề nào để viết các chương trình như vậy; Dù sao, mã của bạn có thể trông giống như vậy:
sum = 0 start = 10 end = 30 for i in range[start, end+1]: sum += i print["Sum is", sum] |
Thử ngay bây giờ
Chương trình này tính toán tổng của tất cả các số từ
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]2 đến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]3. Nếu chúng tôi muốn tính tổng số các số từ
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]4 đến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]5, chúng tôi sẽ cần cập nhật chương trình như sau:
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum] |
Như bạn có thể thấy cả hai phiên bản của chương trình là gần như giống hệt nhau, sự khác biệt duy nhất là các giá trị của các biến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]6 và
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]7. Vì vậy, mỗi khi chúng tôi muốn tính tổng của hai số, chúng tôi sẽ cần cập nhật nguồn của chương trình. Sẽ tốt nếu chúng tôi bằng cách nào đó chỉ sử dụng lại toàn bộ mã mà không thực hiện bất kỳ sửa đổi nào. Chúng ta có thể làm điều đó bằng cách sử dụng các chức năng.
Hàm # là gì
Một chức năng được đặt tên là nhóm các câu lệnh, thực hiện một nhiệm vụ cụ thể. Cú pháp xác định hàm như sau:
def function_name[arg1, arg2, arg3 ... argN]: # function body ... |
Một chức năng bao gồm hai phần: tiêu đề và cơ thể. Tiêu đề chức năng bắt đầu với từ khóa
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]8, theo sau là tên của hàm, theo sau là các đối số và kết thúc bằng dấu hai chấm [
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]9].
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]8 là một từ khóa dành riêng, vì vậy bạn không nên sử dụng nó như một tên biến hoặc tên chức năng trong các chương trình của mình.
Hello ! Today is 2017-06-20 13:20:45.2816511 có thể là bất kỳ định danh hợp lệ. Sau tên hàm, chúng tôi có một danh sách các đối số bên trong dấu ngoặc đơn được phân tách bằng dấu phẩy [
Hello ! Today is 2017-06-20 13:20:45.2816512]. Chúng tôi sử dụng các đối số này để truyền dữ liệu cần thiết cho hàm. Một chức năng có thể lấy bất kỳ số lượng đối số hoặc không có gì cả. Nếu hàm không chấp nhận bất kỳ đối số nào thì dấu ngoặc đơn bị bỏ trống.
Trong dòng tiếp theo, chúng ta có một khối các câu lệnh hoặc cơ thể chức năng. Cơ thể chức năng chứa các câu lệnh xác định những gì chức năng làm. Như thường lệ, Python sử dụng thụt lề các câu lệnh để xác định khi nào khối bắt đầu và kết thúc. Tất cả các câu lệnh trong phần thân của hàm phải được thụt lề như nhau nếu không bạn sẽ gặp lỗi cú pháp.
Đặc biệt chú ý đến tuyên bố cuối cùng trong cơ thể chức năng i.e
Hello ! Today is 2017-06-20 13:20:45.2816513. Câu lệnh
Hello ! Today is 2017-06-20 13:20:45.2816514 được sử dụng để trả về một giá trị từ hàm. Tuyên bố
Hello ! Today is 2017-06-20 13:20:45.2816514 không bắt buộc, một số giá trị trả về hàm trong khi khác thì không. Nếu một hàm không có câu lệnh
Hello ! Today is 2017-06-20 13:20:45.2816514 trong phần thân thì từ khóa được dành riêng
Hello ! Today is 2017-06-20 13:20:45.2816517 được trả về tự động.
Hello ! Today is 2017-06-20 13:20:45.2816517 thực sự là một đối tượng của loại
Hello ! Today is 2017-06-20 13:20:45.2816519 tích hợp. Đừng lo lắng nếu bạn thấy câu lệnh
Hello ! Today is 2017-06-20 13:20:45.2816514 khó hiểu; Chúng không, chúng tôi sẽ thảo luận chi tiết về tuyên bố
Hello ! Today is 2017-06-20 13:20:45.2816514 trong phần sắp tới.
Đây là chức năng nhỏ in ngày và giờ hiện tại cùng với lời chào:
python101/Chapter-13/first_function.py
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] |
Thử ngay bây giờ
Chương trình này tính toán tổng của tất cả các số từ
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]2 đến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]3. Nếu chúng tôi muốn tính tổng số các số từ
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]4 đến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]5, chúng tôi sẽ cần cập nhật chương trình như sau:
Như bạn có thể thấy cả hai phiên bản của chương trình là gần như giống hệt nhau, sự khác biệt duy nhất là các giá trị của các biến import datetime
def greet[]:
print["Hello !"]
print["Today is", datetime.datetime.now[]]
greet[]
6 và import datetime
def greet[]:
print["Hello !"]
print["Today is", datetime.datetime.now[]]
greet[]
7. Vì vậy, mỗi khi chúng tôi muốn tính tổng của hai số, chúng tôi sẽ cần cập nhật nguồn của chương trình. Sẽ tốt nếu chúng tôi bằng cách nào đó chỉ sử dụng lại toàn bộ mã mà không thực hiện bất kỳ sửa đổi nào. Chúng ta có thể làm điều đó bằng cách sử dụng các chức năng.
Hàm # là gì
function_name[arg1, arg2, arg3, ... argN]
Một chức năng được đặt tên là nhóm các câu lệnh, thực hiện một nhiệm vụ cụ thể. Cú pháp xác định hàm như sau:
Một chức năng bao gồm hai phần: tiêu đề và cơ thể. Tiêu đề chức năng bắt đầu với từ khóa
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]8, theo sau là tên của hàm, theo sau là các đối số và kết thúc bằng dấu hai chấm [
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]9].
greet[] # calling greet[] function
python101/Chapter-13/calling_first_function.py
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[] |
Thử ngay bây giờ
Output:
Hello ! Today is 2017-06-20 13:20:45.281651 |
Chương trình này tính toán tổng của tất cả các số từ
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]2 đến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]3. Nếu chúng tôi muốn tính tổng số các số từ
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]4 đến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]5, chúng tôi sẽ cần cập nhật chương trình như sau:
python101/Chapter-13/call_before_definition.py
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] |
Thử ngay bây giờ
Output:
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined |
Chương trình này tính toán tổng của tất cả các số từ
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]2 đến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]3. Nếu chúng tôi muốn tính tổng số các số từ
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]4 đến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]5, chúng tôi sẽ cần cập nhật chương trình như sau:
Như bạn có thể thấy cả hai phiên bản của chương trình là gần như giống hệt nhau, sự khác biệt duy nhất là các giá trị của các biến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]6 và
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]7. Vì vậy, mỗi khi chúng tôi muốn tính tổng của hai số, chúng tôi sẽ cần cập nhật nguồn của chương trình. Sẽ tốt nếu chúng tôi bằng cách nào đó chỉ sử dụng lại toàn bộ mã mà không thực hiện bất kỳ sửa đổi nào. Chúng ta có thể làm điều đó bằng cách sử dụng các chức năng.
python101/Chapter-13/transfer_of_control.py
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]0 |
Thử ngay bây giờ
Output:
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]1 |
Chương trình này tính toán tổng của tất cả các số từ
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]2 đến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]3. Nếu chúng tôi muốn tính tổng số các số từ
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]4 đến
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]5, chúng tôi sẽ cần cập nhật chương trình như sau:
Chương trình trước đây của chúng tôi chỉ có chức năng. Không có gì lạ khi các chương trình có hàng trăm hoặc thậm chí hàng ngàn chức năng. Trong Python, đó là một quy ước phổ biến để xác định một hàm gọi là
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5 được gọi khi chương trình bắt đầu. Hàm
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5 này sau đó tiếp tục gọi chức năng khác khi cần thiết. Chương trình sau đây thể hiện luồng kiểm soát chương trình khi chúng tôi có hai chức năng trong một chương trình.
python101/Chapter-13/two_func_program_control.py
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]2 | sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]3 |
Thử ngay bây giờ
Trong các dòng 3-5 và 8-11, chúng tôi đã xác định hai hàm
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2 và
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5. Hàm
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2 hiện được cập nhật để chấp nhận một đối số gọi là
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]00, sau đó nó sử dụng trong dòng tiếp theo để chào người dùng.
Hàm
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5 không chấp nhận bất kỳ đối số nào và có ba tuyên bố bên trong cơ thể.
Câu lệnh trong dòng 13, gọi hàm
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5. Kiểm soát chương trình nhảy vào cơ thể của hàm
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5. Câu lệnh đầu tiên bên trong chuỗi in
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]05 vào bảng điều khiển. Câu lệnh trong dòng 10, gọi hàm
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2 với đối số
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]07 sẽ được gán cho biến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]00 trong tiêu đề chức năng. Tại thời điểm này, việc thực hiện các câu lệnh sau cuộc gọi đến
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2 dừng lại và kiểm soát chương trình nhảy vào phần thân của hàm
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2. Sau khi thực hiện phần thân của chức năng
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2, điều khiển chương trình nhảy trở lại nơi nó rời khỏi và thực thi câu lệnh
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]3 trong dòng 11. Vì không còn câu lệnh nào để thực thi trong hàm
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5 và điều khiển chương trình nhảy trở lại nơi nó rời đi Tắt để thực thi các câu lệnh sau khi gọi chức năng [dòng 13].
Các biến cục bộ, biến toàn cầu và phạm vi #
Phạm vi biến: Phạm vi của một biến đề cập đến một phần của chương trình nơi nó có thể được truy cập. The scope of a variable refers to the part of the program where it can be accessed.
Biến chúng tôi tạo bên trong hàm được gọi là biến cục bộ. Các biến cục bộ chỉ có thể được truy cập bên trong phần thân của hàm được xác định. Nói cách khác, phạm vi của biến cục bộ bắt đầu từ điểm chúng được xác định và tiếp tục cho đến khi kết thúc hàm. Các biến cục bộ phải chịu bộ sưu tập rác ngay khi hàm kết thúc. Do đó, cố gắng truy cập một biến cục bộ bên ngoài phạm vi của nó sẽ dẫn đến lỗi.
Ở phía bên kia của quang phổ, chúng ta có các biến toàn cầu. Biến toàn cầu là các biến được xác định bên ngoài bất kỳ chức năng nào. Phạm vi của biến toàn cầu bắt đầu từ điểm chúng được xác định và tiếp tục cho đến khi chương trình kết thúc.
Bây giờ hãy xem xét các ví dụ sau:
Ví dụ 1::
python101/Chapter-13/variable_scope.py
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]4 | sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]5 |
Thử ngay bây giờ
Output:
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]6 |
Trong các dòng 3-5 và 8-11, chúng tôi đã xác định hai hàm
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2 và
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5. Hàm
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2 hiện được cập nhật để chấp nhận một đối số gọi là
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]00, sau đó nó sử dụng trong dòng tiếp theo để chào người dùng.
Hàm
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5 không chấp nhận bất kỳ đối số nào và có ba tuyên bố bên trong cơ thể.
Output:
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]7 |
Câu lệnh trong dòng 13, gọi hàm
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5. Kiểm soát chương trình nhảy vào cơ thể của hàm
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5. Câu lệnh đầu tiên bên trong chuỗi in
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]05 vào bảng điều khiển. Câu lệnh trong dòng 10, gọi hàm
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2 với đối số
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]07 sẽ được gán cho biến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]00 trong tiêu đề chức năng. Tại thời điểm này, việc thực hiện các câu lệnh sau cuộc gọi đến
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2 dừng lại và kiểm soát chương trình nhảy vào phần thân của hàm
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2. Sau khi thực hiện phần thân của chức năng
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2, điều khiển chương trình nhảy trở lại nơi nó rời khỏi và thực thi câu lệnh
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]3 trong dòng 11. Vì không còn câu lệnh nào để thực thi trong hàm
q@vm:~/python101/Chapter-13$ python call_before_definition.py Traceback [most recent call last]: File "call_before_definition.py", line 3, in greet[] ## ERROR: trying to call greet[] before its defined NameError: name 'greet' is not defined5 và điều khiển chương trình nhảy trở lại nơi nó rời đi Tắt để thực thi các câu lệnh sau khi gọi chức năng [dòng 13].
Các biến cục bộ, biến toàn cầu và phạm vi #
Phạm vi biến: Phạm vi của một biến đề cập đến một phần của chương trình nơi nó có thể được truy cập.
python101/Chapter-13/same_global_and_local.py
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]8 |
Thử ngay bây giờ
Output:
Biến chúng tôi tạo bên trong hàm được gọi là biến cục bộ. Các biến cục bộ chỉ có thể được truy cập bên trong phần thân của hàm được xác định. Nói cách khác, phạm vi của biến cục bộ bắt đầu từ điểm chúng được xác định và tiếp tục cho đến khi kết thúc hàm. Các biến cục bộ phải chịu bộ sưu tập rác ngay khi hàm kết thúc. Do đó, cố gắng truy cập một biến cục bộ bên ngoài phạm vi của nó sẽ dẫn đến lỗi.
Ở phía bên kia của quang phổ, chúng ta có các biến toàn cầu. Biến toàn cầu là các biến được xác định bên ngoài bất kỳ chức năng nào. Phạm vi của biến toàn cầu bắt đầu từ điểm chúng được xác định và tiếp tục cho đến khi chương trình kết thúc.
python101/Chapter-13/same_variable_names_in_different_functions.py
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]9 | def function_name[arg1, arg2, arg3 ... argN]: # function body ...0 |
Thử ngay bây giờ
Output:
def function_name[arg1, arg2, arg3 ... argN]: # function body ...1 |
Bây giờ hãy xem xét các ví dụ sau:
Ví dụ 1:
Trong dòng 1, chúng tôi đã tạo một biến toàn cầu có tên
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]14. Sau đó, nó được truy cập trong dòng 12, bên trong hàm
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]15 và trong dòng 17, bên ngoài hàm. Chúng tôi cũng đã khai báo một biến cục bộ có tên
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]16 bên trong hàm
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]15. Sau đó, nó được truy cập bên trong hàm trong dòng 9.
def function_name[arg1, arg2, arg3 ... argN]: # function body ...2 |
Khi hàm
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]27 được gọi bằng đối số, giá trị của đối số được gán cho biến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]20 và câu lệnh
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]3 sẽ in giá trị của
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]20 sau khi thêm
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]4 vào nó.
Chương trình sau đây trình bày cách gọi một chức năng với đối số.
python101/Chapter-13/function_argument.py
def function_name[arg1, arg2, arg3 ... argN]: # function body ...3 |
Thử ngay bây giờ
Output:
Trong dòng 6, hàm
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]27 được gọi với đối số
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]4. Giá trị của đối số sau đó được gán cho biến tham số
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]20.
Ví dụ 2: Hàm để tính toán giai thừa của một số. Function to calculate the factorial of a number.
python101/Chapter-13/factorial.py
def function_name[arg1, arg2, arg3 ... argN]: # function body ...4 |
Thử ngay bây giờ
Output:
Trong dòng 6, hàm
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]27 được gọi với đối số
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]4. Giá trị của đối số sau đó được gán cho biến tham số
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]20.
def function_name[arg1, arg2, arg3 ... argN]: # function body ...5
Ví dụ 2: Hàm để tính toán giai thừa của một số.
def function_name[arg1, arg2, arg3 ... argN]: # function body ...6 |
Lượng của một số
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]35 được định nghĩa là phép nhân của tất cả các chữ số từ
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]36 thành
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]35.
Trước khi bắt đầu vòng lặp | sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]42 không được xác định | Sau lần lặp thứ nhất | sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]45 |
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]46 | sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]47 | Sau lần lặp thứ 2 | sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]48 |
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]49 | sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]50 | Sau lần lặp thứ 3 | sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]51 |
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]52 | sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]53 | Sau lần lặp thứ 4 | sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]54 |
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]55
sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
56: Passing multiple arguments to the function
python101/Chapter-13/multiple_arguments.py
def function_name[arg1, arg2, arg3 ... argN]: # function body ...7 |
Thử ngay bây giờ
Output:
def function_name[arg1, arg2, arg3 ... argN]: # function body ...8 |
Sau khi vòng lặp lặp thứ 4 chấm dứt và chức năng
import datetime greet[] ## ERROR: trying to call greet[] before its defined def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]3 in giai thừa của số.
Ví dụ 3: Chuyển nhiều đối số cho hàm
Khi hàm sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
58 được gọi trong dòng 8, đối số import datetime
def greet[]:
print["Hello !"]
print["Today is", datetime.datetime.now[]]
greet[]
2 được truyền đến biến tham số sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
60 và sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
61 được chuyển đến biến tham số sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
62.
Thứ tự của các đối số được truyền trong khi gọi hàm phải khớp với thứ tự của các tham số trong tiêu đề hàm, nếu không, bạn có thể nhận được kết quả không mong muốn.
Vượt qua giá trị #
def function_name[arg1, arg2, arg3 ... argN]: # function body ...9 |
Thử ngay bây giờ
Output:
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]0 |
Hãy nhớ lại rằng mọi thứ trong Python là đối tượng. Vì vậy, một biến cho một đối tượng, thực sự là một tham chiếu đến đối tượng. Nói cách khác, một biến lưu trữ địa chỉ nơi một đối tượng được lưu trữ trong bộ nhớ. Nó không chứa chính đối tượng thực tế.
Khi một hàm được gọi với các đối số, đó là địa chỉ của đối tượng được lưu trữ trong đối số được truyền đến biến tham số. Tuy nhiên, chỉ vì mục đích đơn giản, chúng tôi nói rằng giá trị của đối số được chuyển đến tham số trong khi gọi hàm. Cơ chế này được gọi là vượt qua theo giá trị. Xem xét ví dụ sau:
Lưu ý rằng các giá trị
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]
63 là như nhau. Điều này có nghĩa là biếnsum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]
64 vàsum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]
65 tham chiếu cùng một đối tượng. Nói cách khác, cảsum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]
64 vàsum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]
65 đều chỉ vào cùng một vị trí bộ nhớ trong đó đối tượngsum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]
68 [import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]
4] được lưu trữ.Hành vi này có hai hậu quả quan trọng:
Nếu các đối số được truyền cho chức năng là bất biến, thì các thay đổi được thực hiện đối với biến tham số sẽ không ảnh hưởng đến đối số.
Tuy nhiên, nếu đối số được truyền cho hàm là có thể thay đổi, thì các thay đổi được thực hiện đối với biến tham số sẽ ảnh hưởng đến đối số.: Passing immutable objects to function.
python101/Chapter-13/passing_immutable_objects.py
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]1 |
Thử ngay bây giờ
Output:
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]2 |
Hãy xem xét hành vi này bằng cách lấy một số ví dụ:
Ví dụ 1: Chuyển các đối tượng bất biến cho chức năng.
Trong dòng 7, sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
15 được gọi với một đối số sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
64 [chỉ vào một đối tượng bất biến sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
68]. Giá trị của sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
64 được truyền đến tham số sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
65. Bên trong giá trị hàm của sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
65 được tăng lên bởi import datetime
def greet[]:
print["Hello !"]
print["Today is", datetime.datetime.now[]]
greet[]
4 [dòng 3]. Khi hàm kết thúc, câu lệnh in trong dòng 8 được thực thi và chuỗi sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
77 được in vào bảng điều khiển. Điều này chứng minh rằng bất kể chức năng nào làm gì đối với sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
65, giá trị của sum = 0
start = 100
end = 200
for i in range[start, end+1]:
sum += i
print["Sum is", sum]
64 vẫn giữ nguyên.: Passing mutable objects to function
python101/Chapter-13/passing_mutable_objects.py
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]3 |
Thử ngay bây giờ
Output:
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]4 |
Nếu bạn nghĩ về nó, hành vi này có ý nghĩa hoàn hảo. Hãy nhớ lại rằng nội dung của các đối tượng bất biến không thể thay đổi. Vì vậy, bất cứ khi nào chúng tôi gán một giá trị số nguyên mới cho một biến, về cơ bản, chúng tôi về cơ bản, chúng tôi sẽ tạo một đối tượng
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]68 hoàn chỉnh và đồng thời gán tham chiếu của đối tượng mới cho biến. Đây chính xác là những gì đang xảy ra bên trong hàm
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]15.
Ví dụ 2: Chuyển các đối tượng có thể thay đổi cho chức năng
Mã gần như giống nhau, nhưng ở đây chúng tôi đang chuyển một danh sách cho hàm thay vì số nguyên. Vì danh sách là một đối tượng có thể thay đổi, do đó, các thay đổi được thực hiện bởi hàm
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]15 trong dòng 2, ảnh hưởng đến đối tượng được chỉ ra bởi biến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]64.
- Đối số từ vị trí và từ khóa #
- Từ khóa đối số.
Trong phương pháp đầu tiên, chúng tôi chuyển các đối số cho một hàm theo cùng thứ tự với các tham số tương ứng của chúng trong tiêu đề hàm. Chúng tôi đã sử dụng phương pháp này để chuyển các đối số cho các chức năng của chúng tôi. Ví dụ:
python101/Chapter-13/pythagorean_triplets.py
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]5 |
Thử ngay bây giờ
Tuyên bố
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]84 vượt qua
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]85 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]86,
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]41 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]88 và
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]89 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]90 và in
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]91. Tuy nhiên, tuyên bố
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]92, chuyển
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]85 cho cơ sở,
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]89 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]88 và
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]41 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]90 và in
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]98, điều này là sai. Vì vậy, khi sử dụng các đối số vị trí luôn đảm bảo rằng thứ tự của các đối số trong lệnh gọi chức năng và thứ tự của các tham số trong các tiêu đề chức năng phù hợp. Nếu không, bạn có thể nhận được kết quả mong đợi.
Một cách khác để chuyển các đối số cho một hàm là sử dụng các đối số từ khóa. Trong phương pháp này, chúng tôi vượt qua từng đối số trong mẫu sau:
trong đó
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]99 là tên của biến tham số trong tiêu đề hàm và
def function_name[arg1, arg2, arg3 ... argN]: # function body ...00 đề cập đến giá trị bạn muốn chuyển đến biến tham số. Bởi vì, chúng tôi đang liên kết tên tham số với các giá trị, thứ tự đối số trong lệnh gọi hàm không quan trọng.
Dưới đây là một số cách khác nhau mà chúng ta có thể gọi chức năng
def function_name[arg1, arg2, arg3 ... argN]: # function body ...01 bằng cách sử dụng các đối số từ khóa:
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]6 |
Thử ngay bây giờ
Tuyên bố
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]84 vượt qua
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]85 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]86,
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]41 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]88 và
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]89 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]90 và in
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]91. Tuy nhiên, tuyên bố
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]92, chuyển
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]85 cho cơ sở,
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]89 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]88 và
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]41 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]90 và in
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]98, điều này là sai. Vì vậy, khi sử dụng các đối số vị trí luôn đảm bảo rằng thứ tự của các đối số trong lệnh gọi chức năng và thứ tự của các tham số trong các tiêu đề chức năng phù hợp. Nếu không, bạn có thể nhận được kết quả mong đợi.
Một cách khác để chuyển các đối số cho một hàm là sử dụng các đối số từ khóa. Trong phương pháp này, chúng tôi vượt qua từng đối số trong mẫu sau:
trong đó
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]99 là tên của biến tham số trong tiêu đề hàm và
def function_name[arg1, arg2, arg3 ... argN]: # function body ...00 đề cập đến giá trị bạn muốn chuyển đến biến tham số. Bởi vì, chúng tôi đang liên kết tên tham số với các giá trị, thứ tự đối số trong lệnh gọi hàm không quan trọng.
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]7 |
Thử ngay bây giờ
Tuyên bố
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]84 vượt qua
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]85 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]86,
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]41 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]88 và
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]89 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]90 và in
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]91. Tuy nhiên, tuyên bố
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]92, chuyển
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]85 cho cơ sở,
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]89 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]88 và
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]41 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]90 và in
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]98, điều này là sai. Vì vậy, khi sử dụng các đối số vị trí luôn đảm bảo rằng thứ tự của các đối số trong lệnh gọi chức năng và thứ tự của các tham số trong các tiêu đề chức năng phù hợp. Nếu không, bạn có thể nhận được kết quả mong đợi.
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]8 |
Thử ngay bây giờ
Tuyên bố
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]84 vượt qua
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]85 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]86,
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]41 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]88 và
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]89 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]90 và in
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]91. Tuy nhiên, tuyên bố
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]92, chuyển
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]85 cho cơ sở,
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]89 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]88 và
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]41 đến
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]90 và in
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]98, điều này là sai. Vì vậy, khi sử dụng các đối số vị trí luôn đảm bảo rằng thứ tự của các đối số trong lệnh gọi chức năng và thứ tự của các tham số trong các tiêu đề chức năng phù hợp. Nếu không, bạn có thể nhận được kết quả mong đợi.
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]]9 |
Một cách khác để chuyển các đối số cho một hàm là sử dụng các đối số từ khóa. Trong phương pháp này, chúng tôi vượt qua từng đối số trong mẫu sau:
trong đó
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]99 là tên của biến tham số trong tiêu đề hàm và
def function_name[arg1, arg2, arg3 ... argN]: # function body ...00 đề cập đến giá trị bạn muốn chuyển đến biến tham số. Bởi vì, chúng tôi đang liên kết tên tham số với các giá trị, thứ tự đối số trong lệnh gọi hàm không quan trọng.
Dưới đây là một số cách khác nhau mà chúng ta có thể gọi chức năng
def function_name[arg1, arg2, arg3 ... argN]: # function body ...01 bằng cách sử dụng các đối số từ khóa:
Đối số từ khóa có chút linh hoạt vì chúng ta không phải nhớ thứ tự của các tham số trong tiêu đề chức năng.
Trộn các đối số từ khóa và vị trí #
Chúng ta cũng có thể trộn các đối số vị trí và đối số từ khóa trong một cuộc gọi chức năng. Khi làm như vậy, yêu cầu duy nhất là các đối số vị trí phải xuất hiện trước bất kỳ đối số từ khóa nào. Điều đó có nghĩa là hai cuộc gọi sau đây hoàn toàn hợp lệ vì trong cả hai cuộc gọi đối số vị trí xuất hiện trước các đối số từ khóa.
function_name[arg1, arg2, arg3, ... argN]0 |
Tuy nhiên, chúng tôi không thể làm điều này:
Vấn đề ở đây là đối số vị trí [
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]89] đang xuất hiện sau đối số từ khóa [
def function_name[arg1, arg2, arg3 ... argN]: # function body ...03]. Cố gắng gọi
def function_name[arg1, arg2, arg3 ... argN]: # function body ...01 theo cách này dẫn đến lỗi sau:
Thử ngay bây giờ
Trả về giá trị #
function_name[arg1, arg2, arg3, ... argN]1 |
Thử ngay bây giờ
Cho đến thời điểm này, chúng tôi đã tạo ra các chức năng không trả về bất kỳ giá trị nào, các hàm như vậy còn được gọi là các hàm void.
Để trả về giá trị từ một hàm, chúng tôi sử dụng câu lệnh
Hello ! Today is 2017-06-20 13:20:45.2816514. Đó là cú pháp là:
Các dấu ngoặc vuông [
def function_name[arg1, arg2, arg3 ... argN]: # function body ...06] xung quanh
def function_name[arg1, arg2, arg3 ... argN]: # function body ...07 chỉ ra rằng nó là tùy chọn. Nếu bỏ qua một giá trị đặc biệt
Hello ! Today is 2017-06-20 13:20:45.2816517 được trả về.
python101/Chapter-13/return_factorial.py
function_name[arg1, arg2, arg3, ... argN]2 |
Thử ngay bây giờ
Output:
function_name[arg1, arg2, arg3, ... argN]3 |
Khi câu lệnh
Hello ! Today is 2017-06-20 13:20:45.2816514 gặp phải bên trong một hàm, hàm sẽ chấm dứt và giá trị của
def function_name[arg1, arg2, arg3 ... argN]: # function body ...07, sau đó là từ khóa
Hello ! Today is 2017-06-20 13:20:45.2816514 được gửi lại cho một phần của chương trình được gọi là hàm. Tuyên bố
Hello ! Today is 2017-06-20 13:20:45.2816514 có thể xuất hiện ở bất cứ đâu trong phần thân của hàm. Các hàm trả về các giá trị được gọi là các hàm trả lại giá trị.
python101/Chapter-13/is_even_or_odd.py
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]2 | function_name[arg1, arg2, arg3, ... argN]5 |
Thử ngay bây giờ
Đây là một ví dụ:
function_name[arg1, arg2, arg3, ... argN]6 |
Một hàm có thể được gọi theo hai cách, tùy thuộc vào việc chúng có trả lại giá trị hay không.
function_name[arg1, arg2, arg3, ... argN]7 |
Nếu một hàm trả về một giá trị thì một cuộc gọi đến một hàm như vậy có thể được sử dụng như một toán hạng trong bất kỳ biểu thức nào trong chương trình. Ví dụ:
python101/Chapter-13/returning_none.py
function_name[arg1, arg2, arg3, ... argN]8 |
Thử ngay bây giờ
Output:
Trong biểu thức trên, trước tiên chúng ta gọi hàm
def function_name[arg1, arg2, arg3 ... argN]: # function body ...13 và sau đó gán giá trị trả về của hàm cho biến
def function_name[arg1, arg2, arg3 ... argN]: # function body ...14. Nếu chúng tôi không sử dụng câu lệnh
Hello ! Today is 2017-06-20 13:20:45.2816514 trong hàm
def function_name[arg1, arg2, arg3 ... argN]: # function body ...13, chúng tôi sẽ không thể viết mã này. Dưới đây là một số cách khác mà chúng ta có thể gọi hàm
def function_name[arg1, arg2, arg3 ... argN]: # function body ...13.
python101/Chapter-13/grade_calculator.py
function_name[arg1, arg2, arg3, ... argN]9 | greet[] # calling greet[] function0 |
Thử ngay bây giờ
Đầu ra đầu tiên:
greet[] # calling greet[] function1 |
Đầu ra chạy thứ hai:
greet[] # calling greet[] function2 |
Hàm void trả về không. #
Trong Python, các hàm void hơi khác so với các hàm được tìm thấy trong C, C ++ hoặc Java. Nếu cơ thể hàm không có bất kỳ câu lệnh
Hello ! Today is 2017-06-20 13:20:45.2816514 nào thì giá trị đặc biệt
Hello ! Today is 2017-06-20 13:20:45.2816517 được trả về khi hàm kết thúc. Trong Python,
Hello ! Today is 2017-06-20 13:20:45.2816517 là một chữ của loại
Hello ! Today is 2017-06-20 13:20:45.2816519 được sử dụng để biểu thị sự vắng mặt của một giá trị. Nó thường được gán cho một biến để chỉ ra rằng biến không trỏ đến bất kỳ đối tượng nào.
Chương trình sau đây chứng minh rằng các hàm void trả về
Hello ! Today is 2017-06-20 13:20:45.2816517.
python101/Chapter-13/void_function.py
greet[] # calling greet[] function3 |
Thử ngay bây giờ
Output:
Đảm bảo đủ!
def function_name[arg1, arg2, arg3 ... argN]: # function body ...13 Hàm thực sự trả về
Hello ! Today is 2017-06-20 13:20:45.2816517. Vì vậy, chúng ta có thể nói rằng trong Python, tất cả các hàm trả về giá trị cho dù bạn có sử dụng câu lệnh
Hello ! Today is 2017-06-20 13:20:45.2816514 hay không. Tuy nhiên, điều này không có nghĩa là bạn có thể sử dụng các hàm void giống như hàm hoàn trả giá trị. Xem xét ví dụ sau:
python101/Chapter-13/using_void_function_as_non_void_function.py
greet[] # calling greet[] function4 |
Thử ngay bây giờ
Output:
greet[] # calling greet[] function5 |
Trong dòng 5, chúng tôi đang cố gắng thêm giá trị được trả về từ
def function_name[arg1, arg2, arg3 ... argN]: # function body ...13 tức là
Hello ! Today is 2017-06-20 13:20:45.2816517 vào số nguyên
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]4, nhưng thao tác không thành công vì hoạt động
def function_name[arg1, arg2, arg3 ... argN]: # function body ...39 không thể thêm
Hello ! Today is 2017-06-20 13:20:45.2816519 vào
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]68.
Đó là lý do tại sao một hàm void thường được gọi như một tuyên bố như thế này:
Trả về nhiều giá trị #
Để trả về nhiều giá trị từ một hàm, chỉ cần chỉ định từng giá trị được phân tách bằng dấu phẩy [
Hello ! Today is 2017-06-20 13:20:45.2816512] sau từ khóa
Hello ! Today is 2017-06-20 13:20:45.2816514.
greet[] # calling greet[] function6
Khi gọi một hàm trả về nhiều giá trị, số lượng biến ở phía bên trái của toán tử
def function_name[arg1, arg2, arg3 ... argN]: # function body ...44 phải bằng số lượng giá trị được trả về bởi câu lệnh
Hello ! Today is 2017-06-20 13:20:45.2816514. Vì vậy, nếu một hàm trả về hai giá trị thì bạn phải sử dụng 2 biến ở phía bên trái của toán tử
def function_name[arg1, arg2, arg3 ... argN]: # function body ...44. Đây là một ví dụ:
python101/Chapter-13/returning_multiple_values.py
greet[] # calling greet[] function7 |
Thử ngay bây giờ
Output:
greet[] # calling greet[] function8 |
Lưu ý cách các giá trị được gán trong khi gọi hàm. Tuyên bố:
greet[] # calling greet[] function9
gán số nhỏ hơn cho biến
def function_name[arg1, arg2, arg3 ... argN]: # function body ...47 và số lượng lớn hơn cho biến
def function_name[arg1, arg2, arg3 ... argN]: # function body ...48.
Đối số mặc định #
Trong Python, chúng ta có thể xác định một hàm với các giá trị tham số mặc định, giá trị mặc định này sẽ được sử dụng khi một hàm được gọi mà không có bất kỳ đối số nào. Để chỉ định giá trị mặc định cho tham số chỉ cần chỉ định giá trị bằng toán tử gán theo sau là tên tham số. Xem xét ví dụ sau:
python101/Chapter-13/setting_default_values.py
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]0 |
Thử ngay bây giờ
Output:
import datetime def greet[]: print["Hello !"] print["Today is", datetime.datetime.now[]] greet[]1 |
Trong dòng 7, chúng tôi đang gọi hàm
def function_name[arg1, arg2, arg3 ... argN]: # function body ...49 mà không có bất kỳ đối số nào, do đó, các giá trị mặc định
def function_name[arg1, arg2, arg3 ... argN]: # function body ...50 và
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]85 sẽ được gán cho các tham số
def function_name[arg1, arg2, arg3 ... argN]: # function body ...52 và
def function_name[arg1, arg2, arg3 ... argN]: # function body ...53 tương ứng.
Trong dòng 8, chúng tôi đang gọi
def function_name[arg1, arg2, arg3 ... argN]: # function body ...49 bằng cách chuyển
sum = 0 start = 100 end = 200 for i in range[start, end+1]: sum += i print["Sum is", sum]41 đến
def function_name[arg1, arg2, arg3 ... argN]: # function body ...52 và
def function_name[arg1, arg2, arg3 ... argN]: # function body ...57 đến
def function_name[arg1, arg2, arg3 ... argN]: # function body ...53. Vì các giá trị cho cả hai tham số được cung cấp trong khi gọi hàm, giá trị mặc định sẽ không được sử dụng trong trường hợp này. Điều tương tự cũng đúng với cuộc gọi
def function_name[arg1, arg2, arg3 ... argN]: # function body ...49 trong dòng 9, ngoại trừ ở đây chúng tôi đang sử dụng các đối số từ khóa.
Trong dòng 10, chúng tôi chỉ cung cấp giá trị cho tham số
def function_name[arg1, arg2, arg3 ... argN]: # function body ...52 bằng cách sử dụng đối số từ khóa, kết quả là giá trị mặc định cho tham số
def function_name[arg1, arg2, arg3 ... argN]: # function body ...53 sẽ được sử dụng.