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
Nội dung chính
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:
- Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
- Ebook về python tại đây.
- Các series tự học lập trình khác
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!