Hàm trong Python là gì?
Hàm trong Python được sử dụng để tận dụng mã nguồn ở nhiều nơi trong cùng một chương trình, đôi khi còn được gọi là phương thức hoặc thủ tục. Python cung cấp cho bạn nhiều hàm dựng sẵn như print(), nhưng bạn cũng có thể viết hàm của chính mình.
Trong bài này, chúng ta sẽ tìm hiểu
- Cách định nghĩa và gọi hàm trong Python
- Ý nghĩa của thụt lề (khoảng trắng) trong Python
- Hàm trả về giá trị như thế nào?
- Đối số trong hàm
Cách định nghĩa và gọi hàm trong Python
Hàm trong Python được định nghĩa bởi câu lệnh “def” theo sau là tên hàm và dấu ngoặc đơn (())
Thí dụ:
Cùng khai báo một hàm bằng cách sử dụng lệnh “def func1 ():” và gọi hàm. Đầu ra của hàm sẽ là “I am learning Python function”.
Lời gọi func1() sẽ gọi tới hàm func1() ta đã định nghĩa và in ra dòng chữ: “I am learning Python function”
Việc định nghĩa một hàm trong Python cũng có một số quy tắc
- Bất kỳ đối số hoặc tham số đầu vào nào cũng cần được đặt trong dấu ngoặc đơn.
- Câu lệnh đầu tiên của hàm có thể là một câu lệnh tùy chọn – docstring hay chuỗi tài liệu của hàm.
- Mã nguồn trong mỗi hàm bắt đầu sau dấu hai chấm (:) và phải được thụt lề (dùng khoảng trắng)
- Câu lệnh return(biểu thức) sẽ khiến chương trình thoát ra khỏi hàm, nó trả về một giá trị cho người gọi. Câu lệnh return không có đối số tương tự với việc gọi return None.
Ý nghĩa của thụt lề (khoảng trắng) trong Python
Trước khi tìm hiểu sâu hơn về hàm, chúng ta cần nắm được quy tắc thụt lề để khai báo hàm trong Python. Các quy tắc này cũng được áp dụng cho các đối tượng khác của Python như khai báo điều kiện, vòng lặp hoặc biến.
Python tuân theo một kiểu thụt lề nhất định để xác định đâu là mã nguồn, vì các hàm trong Python không được khai báo theo cách sử dụng dấu ngoặc nhọn để xác định nơi bắt đầu và kết thúc của hàm, vì vậy Python cần dựa vào quy tắc thụt lề. Ở đây chúng ta lấy một ví dụ đơn giản với lệnh “print”. Khi chúng ta viết hàm “print” ngay bên dưới def func1(): Chương trình sẽ báo lỗi: “indentation error: expected an indented block”.
Bây giờ, khi bạn thêm thụt lề (dấu cách) phía trước hàm “print”, chương trình sẽ in ra kết quả như mong đợi.
Bạn cần ít nhất một dấu cách để chương trình có thể chạy đúng. Tuy nhiên, thường khuyến khích việc thụt lề với 4 dấu cách (Trong các IDE bạn có thể thiết lập để dùng tab thay cho khoảng trắng, IDE sẽ có các tùy chọn cho chuyển đổi từ 1 tab thành 2, 4 hoặc 8 dấu cách).
Ngoài ra, khi khai báo kèm theo thụt lề, bạn nên thực hiện việc thụt lề giống nhau cho toàn bộ chương trình. Ví dụ, trong ảnh chụp màn hình bên dưới khi chúng ta gọi một câu lệnh khác là “still in func1” và khi nó không được khai báo thẳng hàng ngay bên dưới câu lệnh print đầu tiên, chương trình sẽ báo một lỗi thụt lề: “unindent does not match any other indentation level.”
Bây giờ, khi chúng ta áp dụng cùng một cách thụt lề cho cả hai câu lệnh và sắp xếp chúng thẳng hàng, chương trình sẽ chạy như mong muốn.
Hàm trả về giá trị như thế nào?
Lệnh return trong Python chỉ định giá trị nào sẽ trả lại cho lời gọi hàm.
Cùng tìm hiểu thông qua ví dụ sau:
Bước 1) Ở đây – chúng ta sẽ thấy hàm không có câu lệnh “trả về”. Ví dụ: chúng ta muốn tính bình phương của “4”, chương trình sẽ in ra “16”. Chúng ta cũng có thể làm được điều này với câu lệnh đơn giản “print x*x”, nhưng khi bạn gọi hàm “print square”, chương trình sẽ trả về “None”. Điều này là do khi bạn gọi hàm, không có giá trị trả về và hàm kết thúc. Python trả về “None” khi rời khỏi hàm.
Bước 2) Để quan sát rõ hơn, chúng ta thay thế lệnh print bằng phép gán. Hãy kiểm tra đầu ra.
Khi bạn chạy lệnh “print square(4)”, chương trình sẽ in ra kết quả trả về của hàm square, nhưng do chúng ta không khai báo giá trị trả về trong hàm nên kết quả in ra là “None”.
Bước 3) Giờ chúng ta sẽ tìm cách thu được kết quả thông qua lệnh “return”. Khi bạn gọi hàm “return” và thực thi mã nguồn, chương trình sẽ trả về giá trị “16”.
Bước 4) Bản thân các hàm trong Python chính là một đối tượng, và một đối tượng sẽ có giá trị nhất định. Ở đây chúng ta có thể thấy cách Python tương tác với các đối tượng. Khi bạn chạy lệnh “print square”, nó sẽ trả về giá trị của đối tượng. Vì chúng ta không truyền vào bất kỳ đối số nào, chúng ta cũng không có hàm cụ thể nào để chạy nên chương trình trả về một giá trị mặc định (0x021B2D30), giá trị này chính là địa chỉ của đối tượng.
Đối số trong hàm
Đối số là một giá trị được truyền cho hàm khi nó được gọi.
Nói cách khác, ở phía người gọi, nó là đối số, còn ở phía hàm, nó được coi là tham số.
Cùng tìm hiểu cách đối số hoạt động trong Python:
Bước 1) Các đối số được khai báo trong định nghĩa hàm. Khi gọi hàm, bạn có thể truyền các giá trị cho đối số đó như hình bên dưới
Bước 2) Để khai báo giá trị mặc định của đối số, ta cầm gán cho nó một giá trị trong định nghĩa hàm.
Ví dụ: x không có giá trị mặc định. Giá trị mặc định của y=0. Khi chúng ta thực hiện lời gọi hàm multiply với chỉ một đối số, Python sẽ gán giá trị cho x trong khi vẫn giữ nguyên giá trị của y=0. Tức là bạn đang thực hiện phép nhân: x*y=0
Bước 3) Lần này chúng ta sẽ thay đổi giá trị thành y = 2 thay vì giá trị mặc định y = 0 và chương trình sẽ in ra kết quả là (4×2) = 8.
Bước 4) Bạn cũng có thể thay đổi thứ tự mà các đối số có thể được truyền vào Python. Ở đây chúng ta đã đảo ngược thứ tự của giá trị x và y thành x = 4 và y = 2.
Bước 5) Chúng ta có thể truyền vào nhiều đối số thông qua một mảng. Trong ví dụ dưới, chúng ta sẽ truyền vào nhiều đối số (1,2,3,4,5) bằng cách gọi hàm với (* args).
Ví dụ: Khai báo nhiều đối số dưới dạng (1,2,3,4,5) khi chúng ta gọi hàm với (* args); chương trình sẽ in ra kết quả là (1,2,3,4,5)
Lưu ý:
- Trong Python 2.7. nạp chồng hàm không được hỗ trợ. Nạp chồng hàm cho phép bạn tạo nhiều phương thức có cùng tên nhưng cách thực thi khác nhau. Nạp chồng hàm được hỗ trợ đầy đủ trong Python3.
- Có một sự nhập nhằng giữa phương thức và hàm. Phương thức trong Python thường được gắn liền với đối tượng trong khi hàm thì không. Khi Python thực hiện lời gọi phương thức, nó sẽ gán tham số đầu tiên của lời gọi đó với tham chiếu của đối tượng thích hợp. Nói đơn giản hơn, hàm độc lập trong Python là một “hàm”, còn hàm được khai báo là một thuộc tính của một lớp hoặc một đối tượng được coi là một “phương thức”.
Đây là mã nguồn đầy đủ sử dụng Python 3
#define a function
def func1():
print ("I am learning Python function")
print ("still in func1")
func1()
def square(x):
return x*x
print(square(4))
def multiply(x,y=0):
print("value of x=",x)
print("value of y=",y)
return x*y
print(multiply(y=2,x=4))
Đây là mã nguồn đầy đủ sử dụng Python 2
#define a function
def func1():
print " I am learning Python function"
print " still in func1"
func1()
def square(x):
return x*x
print square(4)
def multiply(x,y=0):
print"value of x=",x
print"value of y=",y
return x*y
print multiply(y=2,x=4)
in bội (y = 2, x = 4)
Tổng kết
Hàm trong Python là một đoạn mã có thể tái sử dụng nhằm thực hiện một công việc duy nhất. Trong bài này, chúng ta thấy rằng:
- Hàm được định nghĩa bởi câu lệnh def
- Mã nguồn trong mỗi hàm bắt đầu sau dấu hai chấm (:) và phải được thụt lề (khoảng trắng)
- Bất kỳ đối số hoặc tham số đầu vào cũng cần được đặt trong dấu ngoặc đơn.
- Sau khi khai báo hàm, ít nhất một khoảng trắng cần được đặt ở đầu dòng chứa mã nguồn.
- Kiểu thụt lề cần được giữ nguyên trong toàn bộ mã nguồn trong thân hàm.
- Việc thụt lề ba hoặc bốn khoảng trắng được khuyến khích trong thực tế.
- Bạn có thể sử dụng lệnh “return” để trả về giá trị cho lời gọi hàm.
- Python sẽ in một giá trị ngẫu nhiên như (0x021B2D30) khi đối số không được truyền vào trong lời gọi hàm. Ví dụ “hàm print”
- Ở phía người gọi, giá trị truyền vào hàm được gọi là đối số, còn ở phía hàm, chúng được gọi là tham số.
- Giá trị mặc định trong đối số – Nếu chúng ta chỉ truyền vào một đối số trong khi hàm cần nhiều tham số hơn, giá trị mặc định sẽ được gán cho các tham số còn lại.
- Python cũng cho phép bạn đảo ngược thứ tự của đối số