Các hàm cơ bản trong Python

Hàm trong Python là gì? Cú pháp, thành phần và các loại hàm trong Python như thế nào? Làm sao để tạo hàm trong Python? Những câu hỏi này của bạn sẽ được giải đáp trong bài học Python dưới đây.

Hàm trong Python là gì?

Trong Python, hàm là một nhóm các lệnh có liên quan đến nhau được dùng để thực hiện một tác vụ, nhiệm vụ cụ thể nào đó. Hàm giúp chia chương trình Python thành những khối/phần/mô-đun nhỏ hơn. Khi chương trình Python quá lớn, hoặc cần mở rộng, thì các hàm giúp chương trình có tổ chức và dễ quản lý hơn.

Hàm còn có một tác dụng vô cùng quan trọng nữa là tránh việc phải lặp lại code để thực thi những tác vụ tương tự nhau, giúp code gọn hơn và có thể tái sử dụng.

Ví dụ, nếu bạn cần viết một ứng dụng vẽ hàng trăm hình tam giác để tạo hiệu ứng vạn hoa, bạn có thể làm theo hai cách:

  • Không sử dụng hàm: Bạn lặp lại mã để vẻ từng hình tam giác một
  • Có sử dụng hàm: Bạn tạo ra một loạt tọa độ và đưa chúng vào hàm vẽ tam giác

Cách thứ 2 hiệu quả hơn, phải viết ít code hơn và thường là phương pháp ưa thích của các lập trình viên. Không chỉ vậy, với cách này nếu muốn thay đổi từ tam giác sang hình vuông, bạn chỉ cần đổi vài dòng code.

Một lợi ích khác của việc sử dụng hàm đó là tính mô-đun và sự gọn nhẹ. Nếu bạn viết một ứng dụng khác có hình tam giác trong đó, bạn có thể copy và paste hàm tam giác mà bạn vừa viết ở trên.

Cú pháp của hàm Python

def ten_ham(các tham số/đối số):
    Khối lệnh bên trong hàm

Lệnh ngoài hàm hoặc lệnh gọi hàm

Về cơ bản, một định nghĩa hàm Python sẽ bao gồm các thành phần sau:

  1. Từ khóa def: Đánh dấu sự bắt đầu của tiêu đề hàm.
  2. ten_ham: Là định danh duy nhất dành cho hàm. Việc đặt tên hàm phải tuân thủ theo quy tắc viết tên và định danh trong Python.
  3. Các tham số/đối số: Tham số/đối số là các biến chúng ta dùng để truyền giá trị vào hàm. Tham số/đối số này là tùy chọn, có thể thêm bao nhiêu tùy thích, miễn là cần phân cách chúng bằng dấu phẩy (,).
  4. Dấu hai chấm (:): Đánh dấu sự kết thúc của tiêu đề hàm.
  5. docstring: Chuỗi văn bản tùy chọn để mô tả chức năng của hàm.
  6. Khối lệnh bên trong hàm: Một hoặc nhiều lệnh Python hợp lệ tạo thành khối lệnh. Các lệnh này phải có cùng một mức thụt đầu dòng (thường là 4 khoảng trắng).
  7. Lệnh return: Lệnh này là tùy chọn, dùng khi cần trả về giá trị từ hàm.

Cách thức làm việc của hàm trong Python:



Ví dụ về hàm trong Python

Dưới đây là một định nghĩa hàm đơn giản, gồm tên hàm, tham số của hàm, mô tả hàm và một câu lệnh:

def chao(ten):
    """Hàm này dùng để chào một người,
        tên được truyền vào như một tham số""" 
    print("Chào bạn " + ten + ". Chúc một ngày vui vẻ!")

Gọi hàm trong Python

Khi một hàm đã được định nghĩa (như ví dụ trên), bạn có thể gọi nó từ một hàm khác, chương trình khác hoặc thậm chí tại dấu nhắc lệnh. Để gọi hàm chúng ta chỉ cần nhập tên hàm với những tham số thích hợp là được.

Ví dụ để gọi hàm chao() vừa định nghĩa bên trên, ta gõ lệnh sau ngay tại dấu nhắc:

chao ("laptrinhcoban.vn")

Kết quả thu được là:

Chào bạn laptrinhcoban.vn. Chúc một ngày vui vẻ!

Lưu ý: Trong Python, định nghĩa hàm phải luôn có trước khi gọi hàm. Nếu không, chúng sẽ báo lỗi như sau:

NameError: name 'chao' is not defined

Một số ví dụ cực kỳ đơn giản về Hàm trong Python.

Ví dụ 1: In ra lời chào trên màn hình:

def ltcbHello():
    print("laptrinhcoban.vn xin chào các bạn!")
    return;

ltcbHello()

Đây là cách định nghĩa một hàm trong Python và gọi nó. Khi chạy chương trình kết quả thu được là:

laptrinhcoban.vn xin chào các bạn!

Ở đây, chúng ta định nghĩa hàm ltcbHello và gọi nó ra. Trước tiên, chúng ta cần định nghĩa hàm bằng câu lệnh def, sau đó chúng ta có thể thêm bất cứ dòng code nào vào trong hàm. Lệnh return thường được dùng để thoát hàm và trở về nơi mà tại đó hàm được gọi.

Bạn nên viết hoa từng chữ trong tên hàm của mình. Đây là một cách viết code phổ biến và hữu ích, nó giúp phân biệt các hàm trong Python và các câu lệnh.

Từ giờ trở đi, bất cứ khi nào muốn gửi lời chào tới mọi người, bạn chỉ cần viết ltcbHello () là xong.

Ví dụ:

def ltcbHello():
    print("laptrinhcoban.vn xin chào các bạn!")
    return;

ltcbHello()
print("Bạn đang học về Python trên laptrinhcoban.vn")
ltcbHello()

Chạy chương trình này bạn sẽ thấy dòng chữ "laptrinhcoban.vn xin chào các bạn!" được hiển thị 2 lần.

laptrinhcoban.vn xin chào các bạn!
Bạn đang học về Python trên laptrinhcoban.vn
laptrinhcoban.vn xin chào các bạn!

Vì code định nghĩa hàm và gọi hàm tách biệt nhau nên chương trình sẽ không chạy cho tới khi bạn sử dụng chức năng gọi hàm trong Python. Bạn cũng có thể gọi hàm từ một hàm khác, ví dụ:

def ltcbHello():
    print("laptrinhcoban.vn xin chào các bạn!")
    HomNayTotNgay()
    return;

def HomNayTotNgay():
    print("Hôm nay là một ngày tốt, đúng không nhỉ!")
    return;

ltcbHello()

Khi chạy chương trình kết quả thu được là:

laptrinhcoban.vn xin chào các bạn!
Hôm nay là một ngày tốt, đúng không nhỉ!

Bây giờ bạn đã biết cách định nghĩa và gọi hàm trong Python. Tuy nhiên, bây giờ chúng ta mới đi khám phá sức mạnh thực sự của hàm trong Python.

Cách truyền dữ liệu vào hàm trong Python

Mặc dù hàm rất hữu ích để thực hiện các nhiệm vụ lặp đi lặp lại nhưng sức mạnh thực sự của nó lại nằm ở khả năng cho và nhận dữ liệu. Python cho phép chúng ta gọi một hàm trong khi truyền dữ liệu vào nó.

Ví dụ 1:

def XinChao(Name):
    print("Xin chào " + Name)
    return;

XinChao("laptrinhcoban.vn")

Khi chạy chương trình, kết quả thu được là:

Xin chào laptrinhcoban.vn

Điều này có nghĩa là cùng một hàm có thể thực hiện các chức năng hơi khác nhau, tùy thuộc vào các biến mà chúng ta đưa vào.

Ví dụ 2: Đưa dữ liệu người dùng tự nhập vào hàm

def XinChao(Name):
    print("Xin chào " + Name)
    return;

Name = input("Nhập tên của bạn: ")
XinChao(Name)

Kết quả khi chạy lệnh sẽ tự chào theo tên mà người dùng nhập vào:

Nhập tên của bạn: laptrinhcoban.vn
Xin chào laptrinhcoban.vn

Cách thao tác dữ liệu trong hàm

Thậm chí, hàm trong Python còn có thể chuyển đổi dữ liệu. Để làm được điều này, chúng ta cần chuyển thông tin vào hàm, thực hiện các hành động và sau đó trả về thông tin.

Đây là một ví dụ:

def PhepNhan(Number):
    return Number * 10;

print(PhepNhan(5))

Ở đây, kết quả trả về là 50 bởi vì chúng ta đã thêm giá trị 5 vào bằng cách gọi hàm trong Python và kết quả là 5 nhân với 10. Hãy để ý rằng chúng ta có thể gọi hàm Python giống như tên của một số nguyên. Điều này cho phép chúng ta code nhanh và linh hoạt hơn.

Có vô số cách để chúng ta sử dụng tính năng này. Dưới đây là một ví dụ khác, chỉ cần có 3 dòng code:

def DemTen(Name):
    return len(Name);

DienTen = "laptrinhcoban.vn"

print(DemTen(DienTen))

Ứng dụng nhỏ này là một bộ đếm chiều dài tên. Bằng cách sử dụng hàm len() tích hợp sẵn của Python với chức năng trả về một số nguyên dựa trên độ dài của chuỗi. Lưu ý, hàm len() sẽ tính cả dấu cách.

Docstring trong Python

Chuỗi đầu tiên ngay sau tiêu đề hàm được gọi là docstring (documentation string), nó được dùng để giải thích chức năng cho hàm. Mặc dù docstring là không bắt buộc, nhưng việc bạn giải thích ngắn gọn về chức năng của hàm sẽ giúp người dùng sau, thậm chí là bạn, khi gọi hàm có thể hiểu ngay hàm sẽ làm gì mà không cần phải tìm lại định nghĩa hàm để xem xét.

Việc thêm tài liệu ghi chú cho code là một thói quen tốt. Chẳng có gì đảm bảo là sau 1 vài tháng quay trở lại bạn nhớ được chi tiết, rõ ràng đoạn code đã viết trước đó mà không có sai sót gì.

Trong ví dụ bên trên chúng ta có một docstring ngay bên dưới tiêu đề hàm. Docstring thường được viết trong cặp 3 dấu ngoặc kép. Chuỗi này sẽ xuất hiện như một thuộc tính __doc__ của hàm.

Để kiểm tra docstring của hàm chao() bên trên, bạn nhập code sau và chạy thử nhé:

def chao(ten):
    """Hàm này dùng để chào một người,
        tên được truyền vào như một tham số""" 
    print("Chào bạn " + ten + ". Chúc một ngày vui vẻ!")

print(chao.__doc__)

Đây là kết quả:

Hàm này dùng để chào một người,
        tên được truyền vào như một tham số

Lệnh return trong hàm Python

Lệnh return thường được dùng để thoát hàm và trở về nơi mà tại đó hàm được gọi.

Cú pháp của lệnh return:

return [danh_sach_bieu_thuc]

Lệnh này có thể chứa biểu thức được tính toán và giá trị trả về. Nếu không có biểu thức nào trong câu lệnh hoặc không có lệnh return trong hàm thì hàm sẽ trả về None.

Ví dụ về lệnh return:

def gia_tri_tuyet_doi(so):
    """Hàm này trả về giá trị tuyệt đối
    của một số nhập vào"""
    if so >= 0:
        return so
    else:
        return -so

# Đầu ra: 5
print(gia_tri_tuyet_doi(5))

# Đầu ra: 8
print(gia_tri_tuyet_doi(-8))

# Đầu ra: Giá trị tuyệt đối của số nhập vào
num=int(input("Nhập số cần lấy giá trị tuyệt đối: "))
print (gia_tri_tuyet_doi(num))

Khi chạy code trên, ta được kết quả như sau:

5
8
Nhập số cần lấy giá trị tuyệt đối: -7
7

Phạm vi và thời gian tồn tại của các biến

Phạm vi của biến là đoạn chương trình mà ở đó biến được thừa nhận. Các tham số và biến được xác định bên trong một hàm không thể "nhìn thấy" từ bên ngoài. Do đó, những biến và tham số này chỉ có phạm vi trong hàm.

Thời gian tồn tại của biến là khoảng thời gian mà biến đó xuất hiện trong bộ nhớ. Khi hàm được thực thi thì biến sẽ tồn tại.

Biến bị hủy khi chúng ta thoát khỏi hàm. Hàm không nhớ giá trị của biến trong những lần gọi hàm trước đó.

x = 30
def ham_in():
    x = 15
    print("Giá trị bên trong hàm:",x)

ham_in()
print("Giá trị bên ngoài hàm:",x)

Trong chương trình trên, ta dùng cùng một biến x, một biến bên trong hàm ham_in(), một biến x ở ngoài và thực hiện lệnh in hai giá trị này để bạn nhận thấy phạm vi của biến. Giá trị của x chúng ta khởi tạo là 30, mặc dù hàm ham_in() đã thay đổi giá trị của x thành 15, nhưng nó không ảnh hưởng gì đến giá trị của x ở bên ngoài hàm. Khi chạy chương trình ta được kết quả:

Giá trị bên trong hàm: 15
Giá trị bên ngoài hàm: 30

Điều này là do biến x bên trong hàm là khác với biến x bên ngoài hàm. Dù chúng có cùng tên, nhưng thực ra lại là 2 biến khác nhau với phạm vi khác nhau. Biến x trong hàm là biến cục bộ, chỉ có tác dụng trong hàm đó. Biến x bên ngoài hàm có thể nhìn thấy từ bên trong hàm và có phạm vi trên toàn bộ chương trình.

Với biến bên ngoài hàm, ta có thể đọc giá trị của biến ở trong hàm, nhưng không thể thay đổi được giá trị của nó. Để thay đổi giá trị cho các biến kiểu này, chúng phải được khai báo là các biến global bằng cách sử dụng từ khóa global.

Các loại hàm trong Python


HàmMô tả
abs()Trả về giá trị tuyệt đối của một số
all()Trả về True khi tất cả các phần tử trong iterable là đúng
any()Kiểm tra bất kỳ phần tử nào của iterable là True
ascii()Tả về string chứa đại diện (representation) có thể in
bin()Chuyển đổi số nguyên sang chuỗi nhị phân
bool()Chuyển một giá trị sang Boolean
bytearray()Trả về mảng kích thước byte được cấp
bytes()Trả về đối tượng byte không đổi
callable()Kiểm tra xem đối tượng có thể gọi hay không
chr()Trả về một ký tự (một chuỗi) từ Integer
classmethod()Trả về một class method cho hàm
compile()Trả về đối tượng code Python
complex()Tạo một số phức
delattr()Xóa thuộc tính khỏi đối tượng
dict()Tạo Dictionary
dir()Trả lại thuộc tính của đối tượng
divmod()Trả về một Tuple của Quotient và Remainder
enumerate()Trả về đối tượng kê khai
eval()Chạy code Python trong chương trình
exec()Thực thi chương trình được tạo động
filter()Xây dựng iterator từ các phần tử True
float()Trả về số thập phân từ số, chuỗi
format()Trả về representation được định dạng của giá trị
frozenset()Trả về đối tượng frozenset không thay đổi
getattr()Trả về giá trị thuộc tính được đặt tên của đối tượng
globals()Trả về dictionary của bảng sumbol toàn cục hiện tại
hasattr()Trả về đối tượng dù có thuộc tính được đặt tên hay không
hash()Trả về giá trị hash của đối tượng
help()Gọi Help System được tích hợp sẵn
hex()Chuyển Integer thành Hexadecimal
id()Trả về định danh của đối tượng
input()Đọc và trả về chuỗi trong một dòng
int()Trả về số nguyên từ số hoặc chuỗi
isinstance()Kiểm tra xem đối tượng có là Instance của Class không
issubclass()Kiểm tra xem đối tượng có là Subclass của Class không
iter()Trả về iterator cho đối tượng
len()Trả về độ dài của đối tượng
list()Tạo list trong Python
locals()Trả về dictionary của bảng sumbol cục bộ hiện tại
map()Áp dụng hàm và trả về một list
max()Trả về phần tử lớn nhất
memoryview()Trả về chế độ xem bộ nhớ của đối số
min()Trả về phần tử nhỏ nhất
next()Trích xuất phần tử tiếp theo từ Iterator
object()Tạo một đối tượng không có tính năng (Featureless Object)
oct()Chuyển số nguyên sang bát phân
open()Trả về đối tượng File
ord()Trả về mã Unicode code cho ký tự Unicode
pow()Trả về x mũ y
print()In đối tượng được cung cấp
property()Trả về thuộc tính property
range()Trả về chuỗi số nguyên từ số bắt đầu đến số kết thúc
repr()Trả về representation có thể in của đối tượng
reversed()Trả về iterator đảo ngược của một dãy
round()Làm tròn số thập phân
set()Tạo một set các phần tử mới
setattr()Đặt giá trị cho một thuộc tính của đối tượng
slice()Cắt đối tượng được chỉ định bằng range()
sorted()Trả về list được sắp xếp
staticmethod()Tạo static method từ một hàm
str()Chuyển đối tượng đã cho thành chuỗi
sum()Thêm một mục vào Iterable
super()Cho phép tham chiếu đến Parent Class bằng super
tuple()Tạo một Tuple
type()Trả về kiểu đối tượng
vars()Trả về thuộc tính __dict__ của class
zip()Trả về Iterator của Tuple
__import__()Hàm nâng cao, được gọi bằng import

Trong thời gian tới, mình sẽ cố gắng viết bài chi tiết về các hàm này để các bạn hiểu rõ cú pháp, cũng như cách dùng của từng hàm.

Nếu muốn biết hàm này cụ thể làm gì, có đối số nào, bạn chỉ cần nhập lệnh:

print(ten_ham.__doc__)

Python sẽ giải thích khá đầy đủ về hàm, bạn có thể đọc và làm vài ví dụ để hiểu hàm đó.

Đừng quên làm bài tập Python nhé!

Về cơ bản, Python có 2 loại hàm chính: hàm được tích hợp sẵn trong Python và hàm do người dùng định nghĩa. Trong các bài tới, chúng ta sẽ tìm hiểu kỹ hơn về 2 loại hàm này.