Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Bài 12: Hàm trong Python

1, Hàm là gì?

Thực sự thì về khái niệm của hàm thì nó cũng rất khó có thể giải thích được, ở đây mình sẽ tóm lại bằng một khái niệm đơn giản như sau:

Hàm là một tập các khối code được viết ra nhằm cho việc tái sử dụng code.

Nếu như bạn thấy khó hiểu, thì bạn hãy tưởng tượng như bạn có một đoạn code tính tổng 2 số chẳng hạn, nếu như ở một vị trí khác bạn cũng cần tính tổng 2 số thì bạn lại phải viết lại đoạn code đã từng viết rồi => như thế sẽ rất tốn thời gian. Và Khái niệm hàm sinh ra để giải quyết vấn đề đó. Nó giúp cho chúng ta có thể tái sử dụng lại những đoạn code có chức năng giống nhau....

2, Khai báo hàm trong Python.

Để khai báo một hàm trong Python thì chúng ta sử dụng keyword def với cú pháp như sau:

def ten_ham(param...):
    #code

Trong đó:

  • ten_ham là tên của hàm mà bạn muốn đặt. Lưu ý: Tên hàm không được bắt đầu bằng số và không được chứa các ký tự đặc biệt trừ ký tự _
  • param... là các tham số bạn muốn truyền vào hàm, nếu không có tham số thì để trống trường này.

VD1: Mình sẽ khai báo một hàm in ra chữ "Welcome to toidicode.com!".

def say():
    print("Welcome to toidicode.com")

VD2: Mình sẽ khai báo một hàm tính tổng của 2 số bất kỳ do người dùng truyền vào.

def sum(a, b):
    print("sum = " + str(a + b))

Trong ví dụ này a, b sẽ là tham số mà chúng ta truyền vào khi gọi hàm.

3, Gọi hàm.

Để gọi một hàm đã được khai báo rồi, thì chúng ta sử dụng cú pháp sau:

ten_ham()
#hoặc
ten_ham(param...)

Trong đó:

  • ten_ham là tên của hàm là chúng ta muốn gọi.
  • param... là các tham số chúng ta muốn truyền vào trong hàm.

VD3: Mình sẽ gọi hàm say ở trong VD1.

def say():
    print("Welcome to toidicode.com")
say()
# Ket qua: Welcome to toidicode.com

VD4: Mình sẽ gọi hàm sum ở trong VD2.

def sum(a, b):
    print("sum = " + str(a + b))
# tinh tong 2 so 4,5
sum(4, 5)
# Ket qua: sum = 9

# tinh tong 2 so 3,7
sum(3, 7)
# Ket qua sum = 10

4, Hàm có kết quả trả về.

Trong trường hợp bạn muốn sử dụng kết quả của hàm vừa tính để thực hiện các mục đíc khác. Thì bạn chỉ cần thêm keyword return trước kết quả bạn muốn trả về.

VD: Mình sẽ khai báo lại hàm sum ở VD2 thành hàm có kết quả trả về.

def sum(a, b):
   return a+ b

Bây giờ khi muốn sử dụng kết quả của nó thì ta có thể gán nó vào một biến, hay một đối tượng và sử dụng như bình thường.

def sum(a, b):
   return a+ b

c = sum(4, 5);
print("Tong cua 4 va 5 = " + str(c))

5, Tham số mặc định cho hàm.

Thông thường nếu như chúng ta khai báo hàm mà có tham số truyền vào, nhưng lúc gọi hàm chúng ta lại không truyền tham số đó vào thì chương trình sẽ báo lỗi.

VD: Giả sử mình có hàm tính tổng như sau.

def sum(a, b):
   return a + b

Và mình sẽ cố tình gọi mà không truyền tham số vào hàm.

Gọi hàm không truyền tham số

Nó đã báo lỗi là chúng ta đang thiếu 2 giá trị, bắt buộc phải truyền vào hàm....

Và để hạn chế trường hợp này thì trong Python cũng cung cấp cho chúng ta thiết lập luôn giá trị mặc định của tham số khi khai báo hàm. Bằng cách sử dụng dấu = với cú pháp như sau:

def ten_ham(param = defaultValue):
    # code

Trong đó:

  • defaultValue là giá trị mặc định của tham số đó mà bạn muốn gán.

VD: Bây giờ mình sẽ lại hàm sum ở trên và gọi khi không truyền giá trị và có truyền giá trị.

Hàm trong Python

6, Phạm vi của biến trong hàm.

Khi một biến được khai báo ở trong hàm thì nó chỉ có thể được sử dụng ở trong hàm đó thôi.

VD:

def say_hello():
    a = "Hello"
    print(a)

print(a)
# Lỗi: name 'a' is not defined

Và chúng ta cũng không thể nào thay đổi giá trị của biến (biến bình thường) mà tác động ra ngoài hàm được.

VD:

a = "Hello Guy!"
def say(a):
    a = "Toidicode.com"
    print(a)

say(a)
# KQ: Toidicode.com
print(a)
# KQ: Hello Guy!

Nhưng nếu như biến mà có kiểu dữ liệu là list thì chúng ta lại có thể là được điều đó.

VD:

a = [5, 10, 15]
def change(a):
    a[0] = 1000
    print(a)

change(a)
# KQ: [1000, 10, 15]
print(a)
# KQ: [1000, 10, 15]

7, Biến Global.

Ngoài những cách hoạt động của biến mình đã trình bày ở phần 6 ra thì chúng ta còn có 1 cách nữa để có thể tác động đến các biến bên ngoài hàm khi đang ở trong hàm. Đó là sử dụng global variable - biến toàn cầu, khi một biến là global thì chúng ta có thể gọi và tác động đến nó từ bất kỳ đâu trong chương trình.

Để khai báo một biến là global thì chúng ta chỉ cần thêm keyword global trước tên của nó như sau:

global tenbien

VD: Mình sẽ thay đổi giá trị của biến khi ở trong hàm.

a = "Hello Guy!"
def say():
    global a
    a = "Toidicode.com"
    print(a)

say()
# KQ: Toidicode.com
print(a)
# KQ: Toidicode.com

8, Truyền vô số tham số vào hàm.

Trên thực tế, không phải lúc nào chúng ta cũng biết được chính xác số lượng biến truyền vào trong hàm. Chính vì thế trong Python có cũng cấp cho chúng ta khai báo một param đại diện cho các biến truyền vào hàm bằng cách thêm dấu * vào trước param đó.

VD: Mình sẽ khai báo hàm get_sum để tính tổng các tham số truyền vào hàm.

def get_sum(*num):
    tmp = 0
    # duyet cac tham so
    for i in num:
        tmp += i
    return tmp

result = get_sum(1, 2, 3, 4, 5)

print(result)
# KQ: 15

9, Lời kết.

Phần hàm này rất quan trọng và sẽ sử dụng rất nhiều ở trong các phần sau nên các bạn cần chú ý và ôn luyện thật nhiều nhé!

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

8 Comments

ở chỗ phần số 6: Phạm vi của biến trong hàm

Mình nghĩ là List chứ không phải là Tuple

Khi mình thử tuple thì nhận được thông báo lỗi như sau:

       TypeError: 'tuple' object does not support item assignment

annymous

7 năm trước

Cám ơn bạn nhé!
Mình viết nhầm đó bạn. VD viết List mà lúc trình bày lại nhầm sang tuple.

Vũ Thanh Tài

7 năm trước

xin cám ơn bài học của Anh.

Em đã thực hiện và học được nhiều điều.

Chúc Anh thành công!

 

Châu

6 năm trước

- Làm sao để chia/đánh dấu scope của hàm đẻ nó clear hơn a nhỉ, vd trong javascript/c# la dấu {}

- Tương tự làm sao biết kết thức của một lệnh vd trong javascript/c# la dấu chấm phải

Điền Trần

5 năm trước

may có cái này chứ mọi người cứ bảo đọc python rất là cơ bản của Võ Duy Tuấn mà đọc xong chả hiểu gì.

Minh

4 năm trước

Bạn cho mình hỏi điểm khác nhau giữa return và print có phải là

Hieu

4 năm trước

Nội dung các bài học rất hay, dễ hiểu, đầy đủ. Cảm ơn ad đã chia sẻ! Nếu gặp nhau nhất định sẽ mời cf.

Xuân Hồng

3 năm trước

Chào Xuân Hồng,

Cảm ơn bạn nhé!

Vũ Thanh Tài

3 năm trước

Bình luận

Captcha