Cấp bậc tác giả:

TRAINING

[Tự học Python]Xây dựng hàm

Được viết bởi webmaster ngày 21/11/2016 lúc 04:14 PM
Hàm là một khái niệm vô cùng quen thuộc với bất kỳ một lập trình viên nào. Tuy nhiên ở mỗi ngôn ngữ khác nhau thì hàm cũng tồn tại những điểm không giống nhau. Vậy hàm trong python sẽ như thế nào? Nó có gì khác biệt so với hàm ở các ngôn ngữ khác?
  • 0
  • 6632

[Tự học Python]Xây dựng hàm

Khái niệm

Hàm là một đoạn chương trình được người ta định nghĩa để thực hiện một công việc nào đó mà có thể sử dụng được khi cần đến. Hoặc bạn cũng có thể hiểu hàm là một chương trình con trong chương trình lớn, nó sẽ luôn sẵn sàng để thực thi khi được gọi đến.

Hàm nhận (hoặc không) các đối số truyền vào và trả về (hoặc không) một giá trị nào đó cho chương trình gọi nó.

Ví dụ

Bạn có 2 số nguyên 3 và 4. Khi bạn gọi hàm tính tổng 2 số này. Hàm tính tổng sẽ  thực hiện công việc tính tổng của 2 số 3 và 4 nó nhận vào. Sau đó trả về giá trị là tổng của 2 số đó.
Hàm giúp cho việc phân đoạn chương trình thành những thành phần riêng lẻ, hoạt động độc lập với chương trình lớn, có nghĩa một hàm có thể được sử dụng trong chương trình này mà cũng có thể được sử dụng trong chương trình khác, dễ cho việc kiểm tra và bảo trì chương trình.

Định nghĩa hàm

Cú pháp

def function_name(arg1, arg2…):
     function_body 

Trong đó:
  • def là từ khoá để khai báo định nghĩa một hàm.
  • function_name là tên hàm.
  • arg1, arg2, ... là các đối số được truyền vào hàm (có thể có hoặc không).
  • function_body là công việc (khối lệnh) nào đó bạn muốn hàm thực hiện.
Ví dụ
def add(a, b):
return a + b
print (add(3, 4))
print (add('DOTNET ', 'GROUP'))

Kết quả in ra màn hình

7
DOTNET GROUP

Lưu ý

Ví dụ trên tôi định nghĩa hàm add với mục đích để cộng 2 số, tuy nhiên trong python kiểu dữ liệu là kiểu động nên tôi có thể dùng hàm này cho việc nối 2 strings với nhau. Đây cũng là một điểm khác biệt thú vị trong python so với các ngôn ngữ khác.

Gọi hàm

Tương tự các ngôn ngữ khác, để gọi một hàm trong Python ta cần tên hàm và các tham số truyền vào (nếu có).

Xét lại ví dụ trên
def add(a, b):
return a + b
print (add(3, 4))
print (add('DOTNET ', 'GROUP'))
Để ý dòng 3 và dòng 4 sẽ dễ dàng nhận thấy được cách để gọi một hàm là add(3, 4) và add('DOTNET ', 'GROUP'). Trong đó add là tên hàm cần gọi, 3 và 4 của dòng 3 (hoặc 'DOTNET ' và 'GROUP' ở dòng 4) là các đối số được truyền vào.

Một ví dụ khác

def printme( str ):
   print (str)
   return
printme('Hello STDIO!')

Kết quả in ra màn hình

Hello STDIO!
Dòng 4 ở ví dụ trên là một cách gọi hàm. Hàm được gọi là hàm printme và tham số được truyền vào là một strings.

Tham số mặc định

Tôi định nghĩa một hàm tính tổng của 4 số nguyên như sau:
def TinhTong( num1, num2, num3, num4):
   return (num1 + num2 + num3 + num4)
   
print (TinhTong(3, 4, 2, 1))

Vấn đề được nảy sinh khi tôi chỉ muốn tính tổng của 2 số nguyên, hoặc 3 số nguyên. Có nhiều cách để giải quyết vấn đề này như là bạn có thể định nghĩa thêm một hàm mới để tính tổng của 2 số hoặc 3 số nguyên , hoặc bạn cũng có thể sử dụng lại hàm trên bằng cách gọi hàm và truyền vào các tham số không cần thiết với giá trị là 0. Tuy nhiên cách giải quyết vấn đề như thế là chưa thật sự tối ưu và thoả mãn đối với bạn. 

Tương tự các ngôn ngữ lập trình khác, Python hỗ trợ lập trình viên khai báo hàm với tham số mặc định nhằm giải quyết các vấn đề trên. Hàm có tham số mặc định giúp cho lập trình viên truyền ít tham số hơn khi gọi hàm.

Lưu ý: Một lưu ý nhỏ là vấn đề nêu trên chỉ là một trong các vấn đề có thể gặp phải khi không sử dụng hàm có tham số mặc định. Có thể tồn tại nhiều vấn đề khác mà tham số mặc đính trong hàm sẽ giúp được bạn giải quyết nó.

Cú pháp

def function_name(arg1, arg2,..., argn, arg_df1 = value1, arg_df2 = value2,..., arg_dfn = valuen):
       function_body 

Trong đó:
  • arg1, arg2,..., argn là các tham số được khai báo bình thường.
  • arg_df1, arg_df2,..., arg_dfn là các tham số có giá trị mặc định lần lượt là value1, value2,..., valuen.
Một số lưu ý quan trọng

Một lời gọi bất kỳ đến hàm này đều phải có đầy đủ các tham số ứng với arg1,…, argn (không phải tham số có giá trị mặc định). Nhưng có thể có hoặc không các tham số có giá trị mặc định ứng với arg1_df1,…, arg_dfn. Nếu tham số nào không có thì nó sẽ tự động gán với giá trị ngầm định đã khai báo.

Các tham số có giá trị mặc định phải được khai báo liên tục và xuất hiện cuối cùng trong danh sách tham số.

Quay lại vấn đề

Giờ tôi sẽ giải quyết lại vấn đề nêu trên bằng cách sử dụng hàm có tham số mặc định.

def TinhTong(num1, num2, num3 = 0, num4 = 0):
   return (num1 + num2 + num3 + num4)
   
print ('Tong 4 so: ', TinhTong(3, 4, 2, 1))
print ('Tong 3 so: ', TinhTong(3, 4, 2))
print ('Tong 2 so: ', TinhTong(3, 4))

Kết quả in ra màn hình

Tong 4 so:  10
Tong 3 so:  9
Tong 2 so:  7

Một ví dụ khác

Ví dụ
def printHello(str = 'STDIO'):
   print ('Hello ' + str + '!')
   
printHello()
printHello('Python')

Kết quả in ra màn hình

Hello STDIO!
Hello Python!

Tham số sử dụng từ khoá (keyword argument)

Khi sử dụng hàm có tham số mặc định ở cách trên sẽ tồn tại một điểm hạn chế  là bạn không thể truyền tham số mặc định thứ n vào được nếu như không truyền tham số mặc định thứ n - 1, n - 2,... Hiểu được sự hạn chế này, Python cho phép lập trình viên truyền bất kỳ tham số nào trong danh sách các tham số mặc định mà không cần phải truyền vào các tham số mặc định còn lại.

Ví dụ
def printInfomation(name = 'DOTNET GROUP', mail = 'webmaster@dotnet.vn', skype = 'quang.it'):
info =  \
'Name: ' + name + '\n' +\
'Mail: ' + mail + '\n' +\
'Skype: ' + skype
print (info)
printInfomation(mail = 'quangltn.dotnet.vn@gmail.com')

Kết quả in ra màn hình

Name: DOTNET GROUP
Mail: quangltn.dotnet.vn@gmail.com
Skype: quang.it

Ví dụ trên tôi thực hiện truyền giá trị vào tham số mail mà không cần phải truyền vào tham số trước nó là name. Đây cũng là cách dùng tham số sử dụng từ khoá (keyword argument) mà tôi muốn hướng dẫn đến các bạn.

Nguồn bài viết: Sưu tầm

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML