Hàm hay chương trình con trong lập trình là một tập hợp các lệnh để thực hiện một chức năng nào đó. Ví dụ trong một chương trình chúng ta cần tính diện tích, chu vi và vẽ hình cho nhiều hình chữ nhật với chiều dài và chiều rộng khác nhau. Rõ ràng việc viết lại đoạn lệnh thực hiện các tác vụ trên nhiều lần sẽ rất mất thời gian, dễ gây nhàm chán cho người lập trình đồng thời gây ra cảm giác khó đọc cho người khác. Các giải quyết là đưa tất cả các đoạn lệnh đó vào một khối chung và đặt tên là HinhChuNhat. Bất cứ lúc nào chúng ta muốn thực hiện lại dãy thao tác trên chỉ cần gọi lại tên khối HinhChuNhat. Đó chính là ý tưởng của hàm (chương trình con) trong hầu hết các ngôn ngữ lập trình và python cũng không ngoại lệ.
Có hai loại hàm:
Hàm chuẩn: các hàm đã được viết sẵn trong Python, chúng ta chỉ gọi ra sử dụng khi cần, ví dụ math.sqrt(), math.sin(),...
Hàm tự định nghĩa: do người lập trình tự định nghĩa để thực hiện những tác vụ theo ý đồ của mình, như thực hiện các thao tác với HinhChuNhat ở trên
Để định nghĩa hàm, Python dùng từ khóa def
Cú pháp:
def <tên hàm>():
Các lệnh con của hàm
Ví dụ:
def Chao():
print("Chao mung den voi ham trong Python!")
Để gọi hàm, chúng ta chỉ cần viết đúng tên của nó
Cú pháp:
<tên hàm>()
Ví dụ:
def Chao():
print("Chao mung den voi ham trong Python!")
Chao()
Kết quả xuất ra màn hình:
Chao mung den voi ham trong Python!
Nhiệm vụ 1. Viết một hàm đặt tên tùy ý, bên trong hàm xuất dòng chữ chào "Họ tên em", sau đó gọi lại hàm này để xem kết quả.
Chúng ta có thể truyền một tham số vào hàm để xử lý các tác vụ bên trong. Cú pháp như sau:
Khai báo hàm:
def <Tên hàm>(danh sách thanh số):
Các tác vụ bên trong
Gọi hàm:
<Tên hàm>(danh sách tham số)
Ví dụ:
#Định nghĩa hàm
def PrintThongTinHS( name, age ):
"""Ham nay xuat ra thong tin ten va tuoi cua hoc sinh"""
print("Name: ", name)
print("Age ", age)
#Gọi hàm
PrintThongTinHS( "Tu Anh", 16 )
Kết quả xuất ra màn hình:
Name: Tu Anh
Age: 16
Nhiệm vụ 2. Viết chương trình định nghĩa một hàm có hai tham số tương ứng với chiều dài và chiều rộng hình chữ nhật. Trong trong hàm thực hiện việc tính và xuất ra màn hình chu vi và diện tích của hình.
Sau đó cho người dùng nhập vào chiều dài, chiều rộng rồi gọi hàm trên để thực hiện tác vụ.
Đôi khi vì lý do gì đó người dùng quên truyền đối số vào lúc gọi hàm, hoặc có ý bỏ qua vì lý do riêng. Để tránh bị báo lỗi thiếu đối số, chúng ta có thể truyền tham số mặc định khi khai báo hàm.
Ví dụ:
#Định nghĩa hàm
def PrintThongTinHS( name, age = 16 ):
"""Ham nay xuat ra thong tin ten va tuoi cua hoc sinh"""
print("Name: ", name)
print("Age ", age)
#Gọi hàm
PrintThongTinHS( "Tu Anh")
PrintThongTinHS( "Van Nghi", 17)
Kết quả xuất ra màn hình:
Name: Tu Anh
Age: 16
Name: Van Nghi
Age: 17
Nhiệm vụ 3. Viết chương trình khai báo hàm xuất thông tin học sinh, truyền vào ba tham số là Tên, Điểm Toán, Điểm Van. Bên trong hàm viết lệnh tính trung bình cộng hai điểm này. Xuất ra bốn dòng, dòng đầu là tên học sinh, dòng 2 là điểm Toán, dòng ba là điểm Văn, dòng cuối cùng là điểm trung bình.
Sau đó nhập thông tin cho học sinh gồm tên, điểm Toán, điểm Văn rồi gọi hàm xuất thông tin học sinh để thực hiện các tác vụ như trên.
Ở ví dụ PrintThongTinHS trên, nếu lúc gọi hàm em truyên sai thứ tự đối số, ví dụ PrintThongTinHS(17, "Van Nghi") thì kết quả sẽ ra ngược. Để giúp người gọi hàm đỡ nhớ thứ tự của tham số, Python cho phép chúng ta truyền đối số bằng từ khóa (hay tên tham số)
Ví dụ:
#Định nghĩa hàm
def PrintThongTinHS( name, age ):
"""Ham nay xuat ra thong tin ten va tuoi cua hoc sinh"""
print("Name: ", name)
print("Age ", age)
#Gọi hàm
PrintThongTinHS( name = "Tu Anh", age = 16)
PrintThongTinHS( age = 17, name = "Van Nghi")
Kết quả xuất ra màn hình:
Name: Tu Anh
Age: 16
Name: Van Nghi
Age: 17
Nhiệm vụ 4. Viết một hàm tương tự như ở nhiệm vụ 3.
Sau đó yêu cầu người dùng nhập vào N là số học sinh muống xử lý. Sau đó nhập các thông tin tương ứng cho từng học sinh, gọi hàm xuất thông tin.
Python còn cho phép chúng ta khai báo danh sách tham số với số lượng tùy ý để linh động khi gọi hàm. Muốn vậy, chúng ta phải dùng ký tự '*"
Ví dụ:
#Định nghĩa hàm
def PrintThongTinHS( *DanhSachHS ):
"""Ham nay xuat ra thong tin của nhieu hoc sinh"""
for hocsinh in DanhSachHS:
print(hocsinh)
#Gọi hàm
PrintThongTinHS("Tu", "Ha", "Nhung", "Vuong")
Kết quả xuất ra màn hình:
Tu
Ha
Nhung
Vuong
Thông thường các hàm có tính toán, chúng ta luôn muốn khi gọi hàm đó sẽ đưa về một kết quả. Ví dụ chúng ta gọi hàm TinhDienTichHCN, thì chúng ta mong muốn kết quả trả về là diện tích của hình chữ nhật tương ứng với hai cạnh chúng ta truyển vào. Để làm vậy chúng ta dùng cú pháp:
Khai báo hàm:
def <Tên hàm>(danh sách thanh số):
Các tác vụ bên trong
return <biểu thức>
Gọi hàm:
<Tên hàm>(danh sách tham số)
Ví dụ:
#Định nghĩa hàm
def DienTichHCN( l, w ):
"""Ham nay tra ve dien tich hinh chu nhat"""
s = l*w
return s
#Gọi hàm
Print(DientichHCN(3,4)
Kết quả xuất ra màn hình:
12
Nhiệm vụ 5. Viết chương trình khai báo hàm tính diện tích hình tròn với tham số là bán kính R. Bên trong hàm tính diện tích tương ứng với R. Giá trị trả về là diện tích.
Sau đó yêu cầu người dùng nhập bán kính và gọi hàm tính diện tích để tính. Xuất diện tích ra màn hình.
Nhiệm vụ 6. Viết chương trình khai báo hàm kiểm tra một số có phải số chính phương hay không. Biết rằng số chính phương là bình phương của một số nguyên.
Nhiệm vụ 7. Viết chương trình khai báo hàm kiểm tra một số có phải số chính phương hay không. Biết rằng số chính phương là bình phương của một số nguyên.
Sau đó cho người dùng nhập vào số nguyên N. Đếm số lượng số chính phương trong khoản từ 1 đến N.
Vòng đời của một biến từ khi được khởi tạo (khai báo) cho đến khi giải phóng phụ thuộc vào phạm vi mà nó được phép hoạt động.
Hai phạm vi chính của một biến là trên toàn bộ chương trình hoặc trong một hàm nào đó, ta thường gọi tắt là biến toán cục và biến cục bộ.
Là biến được khai báo và khởi tạo trong một hàm, nó chỉ hoạt động trong hàm đó và tự biến mất khi hàm kết thúc
Ví dụ:
def myFun():
x = 20
print(x)
myFun()
#Nguồn code: Tham khảo từ GeeksforGeeks.org
Kết quả ra màn hình:
20
Ở đây, x là biến cục bộ, chỉ có phạm vi trong hàm myFun()
Là biến được khai báo và khởi tạo trong chương trình chính, nó hoạt động trong khi chương trình python còn hoạt động và có tầm ảnh hưởng đến cả bên trong các hàm con.
Ví dụ:
x = 300
def myFun():
print(x)
myFun()
print(x)
#Nguồn code: Tham khảo từ GeeksforGeeks.org
Kết quả ra màn hình:
300
300
Ở đây, x là biến toàn cục, nên phạm vy ảnh hưởng của nó là cả trong chương trình chính và chương trình con myFun()
Tuy nhiên cần cẩn thận với điều sau đây:
x = 300
def myFun():
x = 200
print(x)
myFun()
print(x)
#Nguồn code: Tham khảo từ GeeksforGeeks.org
Kết quả lúc này sẽ khác:
200
300
Nhiệm vụ 8. Viết chương trình cho phép người dùng nhập vào list có N phần tử số nguyên. Sau đó xuất ra danh sách các số chính phương của list đó.
Biết rằng hàm kiểm tra số chính phương viết tương tự như ở nhiệm vụ 7.
Nhiệm vụ 9. Viết chương trình cho phép người dùng nhập vào list N xâu. Sau đó xuất ra số từ của mỗi xâu. Biết rằng thao tác đếm số từ của xâu được viết thành một hàm riêng.
Nhiệm vụ 10. Viết chương trình cho phép người dùng nhập vào list N xâu. Sau đó xuất ra các xâu đối xứng. Biết rằng thao tác kiểm tra xâu đối xứng được viết thành một hàm riêng.
Nhiệm vụ 11. Viết chương trình cho phép người dùng nhập vào list N xâu chứa các ký tự trong bảng chữ cái tiếng Anh. Sau đó xuất ra số nguyên âm của mỗi xâu. Biết rằng thao tác đếm số lượng nguyên âm trong xâu được viết thành một hàm riêng.
Nhiệm vụ 12. Viết một hàm cho phép truyền vào một xâu, trả ra từ có số lần xuất hiện nhiều nhất trong xâu đó. Nếu có nhiều từ có cùng số lượng thì xuất ra từ có thứ tự từ điển nhỏ nhất.
Ví dụ:
Input:
Chung ta dang hoc lap trinh tren ngon ngu lap trinh python
output:
lap
Giải thích: Từ 'lap' và từ 'trinh' đều xuất hiện 2 lần, nhưng từ 'lap' có thứ tự từ điển nhỏ hơn.
Nhiệm vụ 13. Viết một hàm cho phép truyền vào một biểu thức số học chỉ chứa số, phép +, -, *, / và không chứa ngoặc đơn, kết quá trả về là giá trị biểu thức đó.
Ví dụ:
input: '2+3*5'
output: 17
Nhiệm vụ 14. Viết một hàm cho phép truyền vào ngày tháng năm theo kiểu Việt Nam, trả ra ngày tháng năm kiểu long day của tiếng Anh.
Ví dụ:
input: '22/12/2023'
output: December 22, 2023
Bài 1. Viết chương trình định nghĩa sẵn các hàm: nhập dữ liệu Nhap(lst), xuất dữ liệu Xuat(lst), tính tổng chẵn TongChan(lst), Tìm Max(lst), tính trung bình TB(lst) để thực hiện các tác vụ tương ứng.
Trong chương trình chính lần lượt gọi các hàm này để nhập liệu vào list, trong hàm xuất sẽ xuất ra list đã nhập và xuất các dữ liệu tương ứng: Tổng các số chẵn, số lớn nhất của list, trung bình cộng của các phần tử của list.
Bài 2. Viết chương trình định nghĩa sẵn các hàm xuất thông tin khách hàng, nhập thông tin khách hàng, xét điều kiện khuyến mãi. với tham số một list tên KhachHang, list KhachHang này chứa các thông tin: Họ tên, giới tính, năm sinh, doanh số, điểm tích lũy.
Trong chương trình chính cho phép người dùng nhập vào số khách hàng cần xử lý, sau khi người dùng nhập vào số nguyên N, thực hiện N lần công việc sau:
Nhập thông tin người thứ i
Xuất thông tin người thứ i
Thông báo khách hàng có được khuyến mãi không? (điều kiện để được khuyến mãi do em tự quy định dựa vào điểm tích lũy)
***Nâng cao: Sau khi người dùng nhập vào số nguyên N, em sẽ cho nhập thông tin của N khách hàng, sau đó xuất ra một danh sách gồm các khách hàng được khuyến mãi (điều kiện được khuyến mãi cũng do em tự quy định dựa vào điểm tích lũy)