Xuyên suốt các bài viết đã qua trong series Python, chúng ta đã sử dụng rất nhiều các phương thức được cung cấp sẵn bởi Python. Trong bài viết dưới đây, Stringee sẽ cùng bạn tìm hiểu cách tự định nghĩa phương thức của mình, học cách nhận biết khi nào cần chia chương trình ra thành nhiều phần nhỏ và các công cụ cần thiết để thực hiện công việc này.
>>> Xem thêm các bài viết trong chuỗi bài hướng dẫn lập trình Python tại đây:
- Bài 1: Cài đặt Python và tạo dựng môi trường làm việc
- Bài 2: Biến và kiểu dữ liệu cơ bản trong Python
- Bài 3: Câu lệnh điều kiện if trong Python
- Bài 4: Cấu trúc điều kiện else và elif trong Python
- Bài 5: Vòng lặp WHILE trong Python
- Bài 6: Vòng lặp FOR trong Python
- Bài 7: List trong Python
- Bài 8: Hàm (Functions) trong Python
1. Hàm trong Python
Bạn có thể đã quen với khái niệm về một hàm. Hàm là một mối quan hệ giữa một hoặc nhiều giả thiết với một tập hợp các kết luận. Trong toán học, một hàm về cơ bản sẽ được định nghĩa dưới dạng:
y = f(x)
Ở đây, f là một hàm thực hiện phép toán trên đầu vào là x và trả ra một kết quả nó tính toán được là y. Tuy nhiên, một hàm trong lập trình tối giản và ổn định hơn nhiều so với một hàm trong toán học. Thực tế, việc định nghĩa hàm một cách hợp lý được hầu hết các ngôn ngữ lập trình hiện đại hỗ trợ trong cả các hàm được định nghĩa sẵn hay các hàm người dùng định nghĩa.
Trong lập trình, một hàm là một khối mã đóng gói lại một công việc hoặc một khối các nhiệm vụ cụ thể. Giả sử như hàm id() nhận vào một biến và trả về một số nguyên độc nhất tương ứng với đối tượng đó:
>>> var = 'foo'
>>> id(var)
4365375664
Mỗi hàm built-in đều thực hiện một nhiệm vụ cụ thể nào đó. Đoạn mã thực hiện task có thể được định nghĩa ở đâu đó, nhưng chúng ta không thực sự cần biết chúng ở đâu hay đoạn code đó hoạt động như thế nào. Bạn chỉ cần biết về interface của hàm để sử dụng nó:
- Các biến nó nhận vào là gì
- Giá trị trả về có hay không
Tiếp đó, chúng ta có thể gọi hàm với các biến phù hợp, chương trình thực thi đúng đoạn mã và trả về đúng kết quả mà chúng ta mong muốn. Khi phương thức hoàn tất, tiến trình xử lý sẽ tiếp tục thực hiện đoạn mã kế tiếp mà nó vừa thực hiện hàm xong, đó chính là vị trí ngay sau điểm mà hàm được gọi.
2. Điều quan trọng của một hàm trong Python
Dưới đây là một số lý do khiến chúng ta nên sử dụng hàm tự định nghĩa.
2.1. Mang tính bao quát và có tính sử dụng lại cao
Giả sử bạn viết các đoạn mã thực hiện nhiều công việc có ích. Sau này, khi tiếp tục phát triển phần mềm, chúng ta phát hiện ra rằng có rất nhiều task khác thực hiện các công việc giống như vậy và lặp đi lặp lại nhiều lần tại các vị trí khác nhau. Và chúng ta đã làm gì khi giải quyết các công việc này? Đa số việc chúng ta làm là sử dụng lại đoạn mã bằng cách nhân bản chúng tại những nơi mà cần tới chúng, sử dụng khả năng copy-paste mà trình soạn thảo hỗ trợ.
2.2. Khả năng module hóa chương trình
Hàm cho phép các tiến trình phức tạp được phân tách thành nhiều bước thực hiện nhỏ hơn. Tưởng tượng bạn có một chương trình thực hiện đọc một file, tiến trình thực hiện đọc nội dung file và ghi kết quả ra một file khác. Đoạn mã của bạn có thể sẽ trông như thế này:
# Main program
# Code to read file in
<statement>
<statement>
<statement>
<statement>
# Code to process file
<statement>
<statement>
<statement>
<statement>
# Code to write file out
<statement>
<statement>
<statement>
<statement>
Trong ví dụ này, ta có thể thấy chương trình bao gồm rất nhiều dòng code được sắp xếp lần lượt theo một thứ tự giãn cách nhau bằng một dòng và có thêm các đoạn comment để phân biệt. Tuy nhiên, nếu chương trình ngày càng phình to ra và cấu trúc các đoạn mã ngày các phức tạp thì việc triển khai chương trình như trên hoàn toàn là điều bất khả thi.
Thay vào đó, chúng ta có thể gom các đoạn code thực hiện một công việc vào thành một hàm, cụ thể như dưới đây:
def read_file():
# Code to read file in
<statement>
<statement>
<statement>
<statement>
def process_file():
# Code to process file
<statement>
<statement>
<statement>
<statement>
def write_file():
# Code to write file out
<statement>
<statement>
<statement>
<statement>
# Main program
read_file()
process_file()
write_file()
Đây là ví dụ của việc module hóa chương trình của mình, thay vì việc để cả chương trình tại một chỗ, nó sẽ được chia ra thành nhiều hàm riêng biệt, mỗi hàm sẽ có nhiệm vụ của riêng mình, ở đây ta có thể thấy các hàm thực hiện đọc, thao tác với file và ghi nội dung vào một file khác.
>>> Xem thêm bài viết:
- Bài 1: Cài đặt Python và tạo dựng môi trường làm việc
- Bài 2: Biến và kiểu dữ liệu cơ bản trong Python
- Bài 3: Câu lệnh điều kiện if trong Python
2.3. Phân chia namespace cho phù hợp với chương trình của mình
Một namespace là một khu vực của chương trình được đánh dấu bằng một tên cố định. Một khi hàm trong Python được gọi, nó sẽ tự động tạo một namespace mới phân biệt so với những cái đã tồn tại trước đó.
Biến được định nghĩa trong Python có thể sử dụng trong một hàm hoặc trong chương trình chính. Trong các trường hợp này, sẽ không có sự nhầm lẫn nào giữa các biến với các interface vì chúng được giữ trong cùng một namespace.
Điều này có nghĩa là khi bạn viết các đoạn mã trong một hàm, bạn có thể sử dụng tên biến và các từ định danh mà không cần lo lắng việc chúng đã được khai báo ở đâu đó ngoài hàm.
3. Gọi hàm và định nghĩa hàm
Cú pháp để định nghĩa một hàm như sau:
def <function_name>([<parameters>]):
<statement(s)>
Trong đó:
Thành phần | Ý nghĩa |
def | Từ khóa để cho Python biết chúng ta bắt đầu định nghĩa một hàm |
<function_name> | Một biến hợp lệ dùng để đặt tên cho hàm |
<parameters> | (Không bắt buộc) Là một danh sách các biến đầu vào được phân cách bởi dấu phẩy, chúng có thể được sử dụng để điền vào hàm |
: | Điểm kết thúc khai báo tên của một hàm |
<statement(s)> | Một khối mã Python hợp lệ |
Item cuối cùng được gọi là body của hàm. Body là một khối mã được thực thi khi hàm được gọi. Body của hàm được định nghĩa bằng cách thụt đầu dòng theo luật việt vị đã được nhắc tới từ những bài viết đầu tiên.
Cú pháp để gọi một hàm trong Python như sau:
<function_name>([<arguments>])
<arguments> là các giá trị được truyền vào hàm, chúng phải phù hợp với định nghĩa parameters trong khi định nghĩa hàm.
Chúng ta hoàn toàn có thể định nghĩa một hàm mà không nhận vào một biến nào cả nhưng cặp dấu đóng mở ngoặc vấn là bắt buộc.
Dưới đây là một số ví dụ về cách sử dụng hàm trong Python:
- Hàm không có biến đầu vào:
def func():
s = 'calling func'
print(s)
print('prepare to call func()')
func()
print('after calling func()')
Thực hiện chương trình ta sẽ thu được:
prepare to call func()
calling func
after calling func()
- Hàm có biến đầu vào:
def func(qty, item, price):
print(f'{qty} {item} cost ${price:.2f}')
func(5, 'pencil', 2.6)
Kết quả thu được là
5 pencil cost $2.60
Kết
Hàm là một khái niệm quan trọng và hữu ích trong mọi ngôn ngữ, Python cũng vậy. Nắm vững được cách định nghĩa một hàm, khi nào nên tách hàm để thực hiện các nhiệm vụ riêng sẽ giúp bạn có thể lập trình tốt hơn, chương trình dễ đọc và bảo trì hơn.
Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.
Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy, Adavigo, bTaskee…
Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: