Hàm là một tập các câu lệnh mà nhận vào các inputs – dữ liệu đầu vào, thực hiện một số tính toán cụ thể và tạo ra output – kết quả. Ý tưởng ở đây là kết hợp một số tác vụ chung hoặc được thực hiện lặp đi lặp lại với nhau và tạo ra một hàm, làm vậy chúng ta sẽ tránh được việc phải viết lặp đi lặp lại nhiều lần cùng một đoạn code cho các inputs khác nhau, thay vào đó ta đơn giản là chỉ cần gọi đến hàm đã được tạo.

Python có cung cấp các hàm được xây dựng/tích hợp sẵn như print(), v.v… Nhưng chúng ta cũng có thể tạo ra các hàm của riêng mình. Các hàm như vậy được gọi là user-defined functions, tức là các hàm do người dùng tự định nghĩa ra.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------

# A simple Python function to check 
# whether x is even or odd 
def evenOdd( x ): 
    if (x % 2 == 0): 
        print "even"
    else: 
        print "odd"
  
# Driver code 
evenOdd(2) 
evenOdd(3) 

Kết quả in ra là:

even
odd

1. Truyền tham chiếu (Pass by reference) hay truyền tham trị (pass by value)?

Một điều quan trọng cần lưu ý là, trong Python mỗi tên biến (variable name) đều là một tham chiếu. Khi chúng ta truyền một biến cho một hàm, một tham chiếu mới đến đối tượng này (ý là cái biến được truyền vào hàm) sẽ được tạo ra. Việc truyền tham số vào các hàm trong Python vận hành giống với truyền tham chiếu (reference passing) trong Java.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------

# Here x is a new reference to same list lst 
def myFun(x): 
   x[0] = 20
  
# Driver Code (Note that lst is modified 
# after function call. 
lst = [10, 11, 12, 13, 14, 15]  
myFun(lst); 
print(lst)  

Kết quả in ra là:

[20, 11, 12, 13, 14, 15]

Khi chúng ta truyền vào một tham chiếu cho một hàm, và ở bên trong hàm đó ta tiến hành thay đổi tham chiếu vừa nhận được (ví dụ, cho nó trỏ sang cái gì đó khác), thì liên kết giữa tham số được truyền vào hàm và tham số vừa nhận được (lúc này ở bên trong thân hàm) sẽ bị ngắt. Ví dụ, xét đoạn chương trình dưới đây:


def myFun(x): 
  
   # After below line link of x with previous 
   # object gets broken. A new object is assigned 
   # to x. 
   x = [20, 30, 40] 
  
# Driver Code (Note that lst is not modified 
# after function call. 
lst = [10, 11, 12, 13, 14, 15]  
myFun(lst); 
print(lst)  

Kết quả in ra là:

[10, 11, 12, 13, 14, 15]

Một ví dụ khác để mô tả quá trình mà liên kết giữa hai tham chiếu bị ngắt khi gán một giá trị mới (bên trong hàm).


def myFun(x): 
  
   # After below line link of x with previous 
   # object gets broken. A new object is assigned 
   # to x. 
   x = 20
  
# Driver Code (Note that lst is not modified 
# after function call. 
x = 10 
myFun(x); 
print(x)  

Kết quả in ra là:

10

2. Các đối số mặc định – Default argument

Một đối số mặc định (default argument) là một tham số (parameter) có sở hữu một giá trị mặc định để sử dụng trong trường hợp không có giá trị nào được cung cấp cho đối số đó, khi gọi hàm. Ví dụ dưới đây sẽ minh họa về cách thức hoạt động của đối số mặc định.


def swap(x, y): 
    temp = x; 
    x = y; 
    y = temp; 
  
# Driver code 
x = 2
y = 3
swap(x, y) 
print(x) 
print(y) 

Kết quả in ra là:

2
3

Giống với khái niệm các đối số mặc định trong ngôn ngữ lập trình C++, trong Python, số lượng các đối số sở hữu giá trị mặc định là không giới hạn, tuy nhiên, một khi chúng ta đã chỉ định một đối số mặc định (default argument) cho hàm, thì các đối số nằm ở bên phải đối số mặc định này cũng phải có các giá trị mặc định.

3. Các đối số từ khóa – Keyword arguments

Ý tưởng về đối số từ khóa là để cho phép đối tượng gọi hàm – caller có thể dễ dàng xác định tên đối số nào ứng với giá trị nào, nhờ đó caller không cần phải cố gắng nhớ thứ tự của các tham số của hàm.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------

# Python program to demonstrate 
# default arguments 
def myFun(x, y=50): 
    print("x: ", x) 
    print("y: ", y) 
  
# Driver code (We call myFun() with only 
# argument) 
myFun(10) 

Kết quả in ra là:

('x: ', 10)
('y: ', 50)

3. Các đối số độ dài biến – Variable length arguments

Chúng ta có thể chỉ định cho số lượng các đối số bình thường truyền vào hàm là tùy ý bằng tham số *argv hoặc chỉ định cho số lượng các đối số từ khóa truyền vào hàm là tùy ý bằng tham số **kwargs.

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


# Python program to illustrate   
# *args for variable number of arguments 
def myFun(*argv):  
    for arg in argv:  
        print (arg) 
    
myFun('Hello', 'Welcome', 'to', 'Cafedevn')  

Kết quả in ra là:

Hello
Welcome
to
Cafedevn

# Python program to illustrate   
# *kargs for variable number of keyword arguments 
  
def myFun(**kwargs):  
    for key, value in kwargs.items(): 
        print ("%s == %s" %(key, value)) 
  
# Driver code 
myFun(first ='Cafedev', mid ='for', last='Cafedev')     

Kết quả in ra là:

last == Cafedev
mid == for
first == Cafedev

4. Hàm vô danh – Anonymous functions

Trong Python, hàm vô danh là các hàm không có tên. Bạn cần lưu ý là, chúng ta thường sử dụng từ khóa def để định nghĩa các hàm bình thường và từ khóa lambda để tạo ra các hàm vô danh.


# Python code to illustrate cube of a number   
# using labmda function  
    
cube = lambda x: x*x*x  
print(cube(7))  

Kết quả in ra là:

343

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!