Thứ Tư, 15 tháng 5, 2024

24. Hàm trong Python phần 3 viết hàm tào lao

Chúng ta sẽ viết một hàm trong Python với phong cách...tào lao!

Lý do chúng tôi muốn cùng bạn viết một hàm tào lao vì chỉ có vậy chúng ta mới có thể "gom" được nhiều vấn đề trong một hàm.

Vẫn tiếp tục với IDE Online

Trước hết chúng ta tạo một hàm đơn giản nhất với nhiệm vụ chính là in ra màn hình một dòng text. Trong Python, một hàm được định nghĩa bằng từ khóa def.

 

def my_function():
  print("Xin Chao Dat Viet Lap Trinh")

my_function()

 

Chạy chương trình


 

Trong chương trình trên, sau khi định nghĩa hàm bằng từ khóa def, chúng ta gọi hàm bằng cách sử dụng tên hàm cùng với dấu ().

Chúng ta sẽ thêm một tham số (parameter) vào hàm gọi là ten. Trong lời gọi hàm, chúng ta sẽ truyền đối số (argument) "Nguyen Van A" cho hàm.


def my_function(ten):
  print("Xin Chao Dat Viet Lap Trinh")

my_function("Tran Van A")


Chạy chương trình


Chúng ta không thấy kết quả có gì khác lạ? Đó là vì chúng ta chưa "sử dụng" tham số tên trong hàm. Chúng ta thêm một lệnh in ten trong hàm.


def my_function(ten):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten)

my_function("Tran Van A")


Chạy chương trình, bây giờ đã thấy "khác"!

 


 

Chúng ta tiếp tục thêm một tham số nữa vào hàm, gọi là lop.

 

def my_function(ten, lop):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten)

my_function("Tran Van A")

 

Chạy chương trình, chúng ta sẽ nhận báo lỗi.

 


Lý do  vì theo mặc định, một hàm phải được gọi với số lượng đối số chính xác. Có nghĩa là nếu hàm của bạn cần có 2 đối số, bạn phải gọi hàm với 2 đối số, không nhiều hơn cũng không ít hơn. Trong lời gọi hàm, chúng ta cần phải truyền thêm đối số lớp, ví dụ "Cong Nghe Thong Tin"


def my_function(ten, lop):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten)

my_function("Tran Van A", "Cong Nghe Thong Tin")


Chạy chương trình, mọi thứ ổn, nhưng không thấy lớp được in ra?


Chúng ta thêm tham số lop, chúng ta cần truyền giá trị cho nó khi gọi hàm, nhưng chúng ta muốn "thấy gì" thì chúng ta cần "làm gì đó" bên trong hàm.

def my_function(ten, lop):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)

my_function("Tran Van A", "Cong Nghe Thong Tin")


Chạy chương trình


 

Chúng ta tiếp tục thêm một tham số *monHoc. Lưu ý là có dấu * phía trước.

 

def my_function(ten, lop, *monHoc):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)

my_function("Tran Van A", "Cong Nghe Thong Tin")

 

Chạy chương trình, mặc dầu đã thêm một tham số và không làm gì khi gọi hàm nhưng chương trình vẫn chạy tốt và không báo lỗi.

 


Nếu chúng ta không biết có bao nhiêu đối số sẽ được truyền vào hàm của mình, hãy thêm * trước tên tham số trong định nghĩa hàm. 

Bây giờ chúng ta sẽ làm gì đó với tham số *monHoc. Chúng ta sẽ thêm 2 đối số là "Python" và "Java", đồng thời thêm lệnh in print(monHoc[0])

def my_function(ten, lop, *monHoc):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)
  print(monHoc[0])

my_function("Tran Van A", "Cong Nghe Thong Tin","Python", "Java")

 

Chạy chương trình

 


 

Nếu muốn, chúng ta có thể thêm vài đối số khác như "PHP", "C++" và thay đổi lệnh in print(monHoc[0]) thành print(monHoc[1]) hay print(monHoc[2])....

Chúng ta tiếp tục thêm một tham số là nam

def my_function(ten, lop, *monHoc, nam):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)
  print(monHoc[0])

my_function("Tran Van A", "Cong Nghe Thong Tin","Python", "Java")


Lần này chạy thử chương trình sẽ bị lỗi chứ không "may mắn" như lần trước.



Chúng ta sẽ sử dụng tham số nam như key, sau đó ta sẽ truyền một đối số từ khóa cho hàm, ta sẽ sử dụng cú pháp key = value.

 

def my_function(ten, lop, *monHoc, nam):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)
  print(monHoc[0])

my_function("Tran Van A", "Cong Nghe Thong Tin","Python", "Java", nam="2024")


Chạy thử chương trình, mọi thứ bây giờ đã ổn, key nam value 2024, nhưng ta cần "nhìn thấy" kết quả


 

Ta sẽ in tham số nam ra màn hình.

 

def my_function(ten, lop, *monHoc, nam):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)
  print(monHoc[0])
  print("Nam tot nghiep: "+ nam)

my_function("Tran Van A", "Cong Nghe Thong Tin","Python", "Java", nam="2024")


Chạy chương trình



Chúng ta tiếp tục thêm một tham số mặc định bằng cách gán giá trị cho tham số đó quequan="Quang Nam"


def my_function(ten, lop, *monHoc, nam,quequan="Quang Nam"):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)
  print(monHoc[0])
  print("Nam tot nghiep: "+ nam)

my_function("Tran Van A", "Cong Nghe Thong Tin","Python", "Java", nam="2024")


Chạy chương trình


 

Bây giờ ta sẽ thêm lệnh in quê quán trong hàm tào lao của chúng ta


def my_function(ten, lop, *monHoc, nam,quequan="Quang Nam"):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)
  print(monHoc[0])
  print("Nam tot nghiep: "+ nam)
  print("Que quan: " +quequan)

my_function("Tran Van A", "Cong Nghe Thong Tin","Python", "Java", nam="2024")


Chạy chương trình, lưu ý là chúng ta không truyền đối số quê quán cho lời gọi hàm



Để thấy sự khác biệt, ta gọi hàm thêm một lần nữa và truyền một giá trị cho tham số quequan

 

def my_function(ten, lop, *monHoc, nam,quequan="Quang Nam"):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)
  print(monHoc[0])
  print("Nam tot nghiep: "+ nam)
  print("Que quan: " +quequan)

my_function("Tran Van A", "Cong Nghe Thong Tin","Python", "Java", nam="2024")
my_function("Nguyen Van B", "Cong Nghe Thong Tin","Python", "Java", nam="2024", "Khanh Hoa") 

 

Chạy thử chương trình, đáng tiếc là ta lại gặp lỗi "SyntaxError: positional argument follows keyword argument"


Lỗi đối số vị trí lỗi theo sau đối số từ khóa (positional argument follows keyword argument) có nghĩa là nếu bất kỳ đối số từ khóa nào được sử dụng trong lệnh gọi hàm thì nó phải luôn được theo sau bởi các đối số từ khóa. Chỉ cần hiểu đơn giản vậy thôi. Trong chương trình của chúng ta, tham số nam nên đươc đặt cuối cùng.


def my_function(ten, lop, *monHoc, quequan="Quang Nam", nam):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)
  print(monHoc[0])
  print("Nam tot nghiep: "+ nam)
  print("Que quan: " +quequan)

my_function("Tran Van A", "Cong Nghe Thong Tin","Python", "Java", nam="2024")
my_function("Nguyen Van B", "Cong Nghe Thong Tin","Python", "Java", "Khanh Hoa", nam="2024")


Tuy nhiên khi chúng ta chạy chương trình, mặc dù đã hết bị lỗi, nhưng kết quả lại không như ý.

 


 

 

Lý do là tham số *monHoc sẽ khiến Python không rõ có bao nhiêu môn học...Vì vậy "Khanh Hoa" cũng sẽ được Python đối xử y như "Python" hay "Java". Chúng ta cần chuyển tham số quê quán ra trước tham số *monHoc.

def my_function(ten, lop, quequan="Quang Nam",*monHoc, nam):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)
  print(monHoc[0])
  print("Nam tot nghiep: "+ nam)
  print("Que quan: " +quequan)

my_function("Tran Van A", "Cong Nghe Thong Tin","Python", "Java", nam="2024")
my_function("Nguyen Van B", "Cong Nghe Thong Tin","Khanh Hoa", "Python", "Java", nam="2024")

Bây giờ hàm tào lao đã hoạt động trơn tru, nhưng có gì đó sai sai với sinh viên A, quê quán đã biến thành...Python! Thật ra chúng ta đang "nhồi nhét" quá nhiều thứ, mà một trong "các thứ đó" không đi cùng nhau đươc. Tạm thời chúng ta sẽ bỏ tham số mặc định quequan.

def my_function(ten, lop, *monHoc, nam):
  print("Xin Chao Dat Viet Lap Trinh")
  print(ten +". Lop: " + lop)
  print(monHoc[0])
  print("Nam tot nghiep: "+ nam)
 

my_function("Tran Van A", "Cong Nghe Thong Tin","Python", "Java", nam="2024")
my_function("Nguyen Van B", "Cong Nghe Thong Tin","Python", "Java", nam="2024")

 

Chạy chương trình


 

 

Phần tiếp theo

 

Phần trước



 






Không có nhận xét nào:

Đăng nhận xét