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.
NỘI DUNG BÀI VIẾT
- Hàm trong Python là gì?
- Cú pháp của hàm Python
- Cách thức làm việc của hàm trong Python:
- Ví dụ về hàm trong Python
- Gọi hàm trong Python
- Một số ví dụ cực kỳ đơn giản về Hàm trong Python.
- Cách truyền dữ liệu vào hàm trong Python
- Cách thao tác dữ liệu trong hàm
- Docstring trong Python
- Lệnh return trong hàm Python
- Phạm vi và thời gian tồn tại của các biến
- Các loại hàm trong Python
Hàm trong Python là gì?
Một hàm là một khối code có tổ chức và có thể tái sử dụng được dùng để triển khai một hành động liên quan. Hàm trong Python cung cấp tính mô đun tốt hơn cho ứng dụng của bạn, đồng thời cho cấp độ tái sử dụng code cao hơn.
Như bạn đã biết, Python có sẵn nhiều hàm như print()
… nhưng bạn cũng có thể tự tạo hàm riêng. Những hàm này gọi là user-defined functions.
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.
Định nghĩa một hàm
Bạn có thể định nghĩa các hàm để cung cấp chức năng được yêu cầu. Dưới đây là những quy tắc đơn giản để xác định một hàm trong Python.
- Các khối hàm bắt đầu bằng từ khóa def được theo sau bởi tên hàm và dấu ngoặc "()".
- Bất kỳ tham số nhập vào hoặc đối số đều được đặt bên trong dấu ngoặc. Bạn cũng có thể xác định các tham số bên trong những dấu ngoặc.
- Lệnh đầu tiên của một hàm có thể là lệnh tùy chọn - chuỗi tài liệu của hàm này hoặc docstring.
- Khối code bên trong mỗi hàm bắt đầu bằng một dấu (:) và được thụt vào.
- Lệnh này trả về [biểu thức] thoát một hàm, tùy chọn chuyển lại một biểu thức tới caller. Một lệnh trả về không có các đối số cũng giống như câu lệnh trả về None.
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
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 hello(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 hello()
vừa định nghĩa bên trên, ta gõ lệnh sau ngay tại dấu nhắc:
hello ("CHIA SẺ KIẾN THỨC")
Kết quả thu được là:
Chào bạn CHIA SẺ KIẾN THỨC. 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 'hello' 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 HeyHello():
print("CHIA SẺ KIẾN THỨC xin chào các bạn!")
return;
HeyHello()
Đâ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à:
CHIA SẺ KIẾN THỨC xin chào các bạn!
Ở đây, chúng ta định nghĩa hàm HeyHello
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 HeyHello()
là xong.
Ví dụ:
def HeyHello():
print("CHIA SẺ KIẾN THỨC xin chào các bạn!")
return;
HeyHello()
print("Bạn đang học về Python trên CHIA SẺ KIẾN THỨC")
HeyHello()
Chạy chương trình này bạn sẽ thấy dòng chữ "CHIA SẺ KIẾN THỨC xin chào các bạn!
" được hiển thị 2 lần.
CHIA SẺ KIẾN THỨC xin chào các bạn!
Bạn đang học về Python trên CHIA SẺ KIẾN THỨC
CHIA SẺ KIẾN THỨC 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 HeyHello():
print("CHIA SẺ KIẾN THỨC 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;
HeyHello()
Khi chạy chương trình kết quả thu được là:
CHIA SẺ KIẾN THỨC 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("CHIA SẺ KIẾN THỨC")
Khi chạy chương trình, kết quả thu được là:
Xin chào CHIA SẺ KIẾN THỨC
Đ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: CHIA SẺ KIẾN THỨC
Xin chào CHIA SẺ KIẾN THỨC
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 = "CHIA SẺ KIẾN THỨC"
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 hello()
bên trên, bạn nhập code sau và chạy thử nhé:
def hello(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(hello.__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
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.
Một số hàm Python bạn cần biết
Hàm reduce()
Hàm reduce()
của Python lặp từng mục trong một danh sách hay bất kỳ kiểu dữ liệu có thể lặp khác, và trả về một giá trị đơn lẻ. Nó là một trong số phương thức của class functools
có sẵn trong Python. Ví dụ:
from functools import reduce
def add_num(a, b):
return a+b
a = [1, 2, 3, 10]
print(reduce(add_num, a))
<strong>Output: </strong>16
Bạn cũng có thể định dạng một danh sách của các chuỗi bằng hàm reduce()
:
from functools import reduce
def add_str(a,b):
return a+' '+b
a = ['CHIA SẺ KIẾN THỨC', 'là', 'một', 'web', 'thông tin tổng hợp']
print(reduce(add_str, a))
<strong>Output:</strong> CHIA SẺ KIẾN THỨC là một một web thông tin tổng hợp
Hàm split()
Hàm split()
ngắt một chuỗi dựa theo tiêu chí thiết lập. Bạn có thể dùng nó để tách một giá trị chuỗi từ một biểu mẫu web. Ví dụ:
words = "column1 column2 column3"
words = words.split(" ")
print(words)
<strong>Output:</strong> ['column1', 'column2', 'column3']
Hàm enumerate()
Hàm enumerate()
trả về độ dài của một vòng lặp và có thể lặp đồng thời qua các mục của nó. Ví dụ:
fruits = ["grape", "apple", "mango"]
for i, j in enumerate(fruits):
print(i, j)
<strong>Output:</strong>
0 grape
1 apple
2 mango
Hàm eval()
Hàm eval()
của Python cho phép bạn triển khai những phương trình toán học trên số nguyên hoặc float, ngay cả ở dạng chuỗi của chúng. Nó thường hữu ích nếu một phép tính ở dạng chuỗi.
Dưới đây là cách nó hoạt động:
g = "(4 * 5)/4"
d = eval(g)
print(d)
<strong>Output:</strong> 5.0
Hàm Round()
Bạn có thể làm tròn kết quả của phép tính tới số cụ thể bằng cách dùng hàm round()
:
raw_average = (4+5+7/3)
rounded_average=round(raw_average, 2)
print("The raw average is:", raw_average)
print("The rounded average is:", rounded_average)
<strong>Output:</strong>
The raw average is: 11.333333333333334
The rounded average is: 11.33
Hàm Max()
Hàm max()
trả về mục được xếp hạng cao nhất trong một lần lặp. Tuy nhiên, hãy cẩn thận để không nhầm lẫn điều này với giá trị xảy ra thường xuyên nhất. Ví dụ, in giá trị được xếp hạng cao nhất trong từ điển bên dưới bằng hàm max()
:
b = {1:"grape", 2:"apple", 3:"applesss", 4:"zebra", 5:"mango"}
print(max(b.values()))
<strong>Output:</strong> zebra
Code trên xếp hạng các mục trong từ điển theo thứ tự bảng chữ cái và in mục gần nhất.
Giờ dùng hàm max() để thấy số nguyên lớn nhất trong một danh sách:
a = [1, 65, 7, 9]
print(max(a))
<strong>Output:</strong> 65
Hàm Min()
Cách sử dụng hàm min() ngược hẳn hàm max() trong Python. Ví dụ:
fruits = ["grape", "apple", "applesss", "zebra", "mango"]
b = {1:"grape", 2:"apple", 3:"applesss", 4:"zebra", 5:"mango"}
a = [1, 65, 7, 9]
print(min(a))
print(min(b.values()))
<strong>Output:</strong>
1
apple
Hàm Map()
Giống như reduce()
, hàm map()
cho phép bạn lặp qua từng mục trong một lần lặp. Tuy nhiên, thay vì cho một kết quả duy nhất, map()
hoạt động độc lập trên từng mục.
Cuối cùng, bạn có thể thực hiện các phép toán trên hai hoặc nhiều danh sách bằng hàm map()
. Bạn thậm chí có thể sử dụng nó để thao tác với một mảng chứa bất kỳ kiểu dữ liệu nào.
Đây là cách tìm tổng kết hợp của hai danh sách chứa số nguyên bằng hàm map()
:
b = [1, 3, 4, 6]
a = [1, 65, 7, 9]
<strong># Declare a separate function to handle the addition:</strong>
def add(a, b):
return a+b
<strong># Pass the function and the two lists into the built-in map() function:</strong>
a = sum(map(add, b, a))
print(a)
<strong>Output:</strong> 96
Hàm getattr()
Hàm getattr()
của Python trả về thuộc tính của một đối tượng. Nó chấp nhận 2 tham số: tên thuộc tính class và mục tiêu.
Ví dụ:
class ty:
def __init__(self, number, name):
self.number = number
self.name = name
a = ty(5*8, "Idowu")
b = getattr(a, 'name')
print(b)
<strong>Output:</strong>Idowu