Hàm def trong Python
Hi every body! Ở bài trước thì mình có giới thiệu cũng như ví dụ demo về biến và cấu trúc rẽ nhánh trong Python (ai chưa xem thì có thể xem lại tại đây). Và như thường lệ để tiếp tục với loạt bài tìm hiểu về Python hôm nay, chúng ta sẽ đi tìm hiểu về functions (sau này mình xin phép được gọi bằng ngôn ngữ quen thuộc của chúng ta là "hàm" nhé) trong Python cũng như một số ứng dụng của nó. Show
Trước hết thì mình có tìm thấy khái niệm về hàm bằng tiếng anh như sau:
Và sau khi dùng tran-sờ-lết của chị google thì mình đã có được kết quả là: Cú phápĐể tạo một hàm trong Python thì các bạn cần sử dụng từ khóa def. Cú pháp khai báo và định nghĩa một hàm như sau:
Hàm không có tham số và giá trị trả về.
Trong ví dụ trên mình tạo một hàm in ra dòng "Hello World!". Hàm này mình không dùng danh sách tham số cũng như không cấp giá trị trả về cho nó. Và như vậy, sau này mỗi khi mình muốn in ra "HelloWorld!" nhưng lười gõ thì mình chỉ việc gọi printHelloWorld() bao nhiêu lần tùy thích mà thôi. Hàm có tham số và giá trị trả về.
Lưu vào file demo.py và thực thi ta sẽ có kết quả như sau: Hàm có tham số với giá trị mặc địnhCác bạn cũng có thể đưa một List vào như là một tham số của hàm đó:
Và đây là kết quả: Bài tập áp dụng Sau đây mình sẽ áp dụng những hiểu biết về hàm để viết một chương trình đơn giản dùng để tính tổng, hiệu, tích, thương của 2 số nhập vào từ bàn phím. Hàm trong Python là một khối lệnh được tổ chức và có thể tái sử dụng, để thực hiện một hành động nào đó. Trong các bài trước, bạn đã làm quen với một số hàm đã được xây dựng sẵn trong Python, điển hình như hàm print(). Tuy nhiên bạn cũng có thể tạo riêng cho mình một hàm với cách định nghĩa và kiểu giá trị cho riêng bạn. Các hàm này được gọi là user-defined function. Nội dung chính
Định nghĩa một hàm trong PythonKhi định nghĩa các hàm để cung cấp một tính năng nào đó, bạn cần theo các qui tắc sau:
Cú pháp hàm trong Pythondef ten_ham( cac_tham_so ): "function_docstring" function_suite return [bieu_thuc] Ví dụ: Hàm sau nhận một chuỗi là tham số input và in nó ra màn hình: def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return Làm thế nào để gọi hàm trong PythonĐể thực thi một hàm, bạn cần gọi hàm đó. Phần định nghĩa hàm cung cấp thông tin về tên hàm các tham số và định nghĩa những hoạt động nào được thực hiện bởi hàm đó. Để thực thi phần định nghĩa của hàm, bạn cần gọi hàm đó. Cú pháp như sau: ten_ham( cac_tham_so ) Ví dụ sau minh họa cách gọi hàm printme(): # Phan dinh nghia ham o day def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return;# Bay gio ban co the goi ham printme printme("Loi goi dau tien toi custom func!") printme("Loi goi thu hai toi custom func") Khi code trên được thực thi sẽ cho kết quả: Loi goi dau tien toi custom func! Loi goi thu hai toi custom func Hàm return() trong PythonHàm return(bieu_thuc) được sử dụng để gửi điều khiển quay trở lại người gọi với bieu_thuc đã cho. Trong trường hợp không cung cấp bieu_thuc, thì hàm return này sẽ trả về None. Nói cách khác, lệnh return được sử dụng để thoát khỏi định nghĩa hàm. Các ví dụ trên không trả về bất cứ giá trị nào. Bạn có thể trả về một giá trị từ một hàm như sau: # Phan dinh nghia ham o day def sum( arg1, arg2 ): # Cong hai tham so va tra ve ket qua." total = arg1 + arg2 print "Ben trong ham : ", total return total;# Bay gio ban co the goi ham sum nay total = sum( 10, 20 ); print "Ben ngoai ham : ", total Kết quả là: Ben trong ham : 30 Ben ngoai ham : 30 Phân biệt đối số (argument) và tham số (parameter) trong PythonCó hai kiểu dữ liệu được truyền trong hàm:
Ví dụ: def addition(x,y): print x+y x=15 addition(x ,10) addition(x,x) y=20 addition(x,y) Kết quả là: 25 30 35 Với cách phân biệt trên, bạn có thể hiểu hơn về đâu là kiểu tham số bạn đang dùng, còn thực sự thì mình nghĩ nó cũng không quan trọng lắm. Do đó, trong phần tiếp theo, chúng tôi sẽ gọi chung chúng là tham số. Truyền tham chiếu và giá trị trong PythonTất cả parameter (argument) trong Python được truyền bởi tham chiếu. Nghĩa là nếu bạn thay đổi những gì mà một parameter tham chiếu tới bên trong một hàm, thì thay đổi này cũng phản ánh trong hàm đang gọi. Ví dụ: # Phan dinh nghia ham o day def changeme( mylist ): "Thay doi list da truyen cho ham nay" mylist.append([1,2,3,4]); print "Cac gia tri ben trong ham la: ", mylist return# Bay gio ban co the goi ham changeme function mylist = [10,20,30]; changeme( mylist ); print "Cac gia tri ben ngoai ham la: ", mylist Ở đây, chúng ta đang duy trì tham chiếu của đối tượng đang truyền và đang phụ thêm các giá trị trong cùng đối tượng đó. Vì thế đoạn code này sẽ cho kết quả: def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return0 Bạn theo dõi một ví dụ nữa, tại đây tham số đang được truyền bởi tham chiếu và tham chiếu đang được ghi đè bên trong hàm được gọi. def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return1 Tham số mylist là cục bộ (local) với hàm changeme. Việc thay đổi mylist bên trong hàm này không ảnh hưởng tới mylist. Và cuối cùng code trên sẽ cho kết quả: def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return2 Phạm vi biến trong PythonTất cả các biến trong một chương trình không phải là có thể truy cập tại tất cả vị trí ở trong chương trình đó. Điều này phụ thuộc vào nơi bạn đã khai báo một biến. Phạm vi biến quyết định nơi nào của chương trình bạn có thể truy cập một định danh cụ thể. Trong Python, có hai khái niệm về phạm vi biến là:
Biến cục bộ trong PythonCác biến được khai báo bên trong một thân hàm là biến cục bộ. Tức là các biến cục bộ này chỉ có thể được truy cập ở bên trong hàm mà bạn đã khai báo, không thể được truy cập ở bên ngoài thân hàm đó. Ví dụ: def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return3 Kết quả sẽ cho một lỗi vì biến là cục bộ. def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return4 Biến toàn cục trong PythonBiến được định nghĩa bên ngoài hàm được gọi là biến toàn cục. Biến toàn cục có thể được truy cập bởi tất cả các hàm ở khắp nơi trong chương trình. Do đó phạm vi của biến toàn cục là rộng nhất. Ví dụ: def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return5 Kết quả là: def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return6 Tham số hàm trong PythonSau khi đã tìm hiểu về phạm vi biến, tiếp theo chúng ta cùng tìm hiểu về các loại tham số hàm. Python hỗ trợ các kiểu tham số chính thức sau:
Tham số bắt buộc trong PythonCác tham số bắt buộc là các tham số được truyền tới một hàm theo một thứ tự chính xác. Ở đây, số tham số trong lời gọi hàm nên kết nối chính xác với phần định nghĩa hàm. Bạn theo dõi ví dụ dưới đây: def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return7 Khi code trên được thực thi sẽ cho một lỗi như sau: def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return8 Giải thích: 1, Trong trường hợp đầu tiên, khi hàm sum() được gọi đã được truyền hai giá trị là 10 và 20, đầu tiên Python so khớp với phần định nghĩa hàm, sau đó 10 và 20 được gán tương ứng cho a và b. Do đó hàm sum được tính toán và được in. 2, Trong trường hợp thứ hai, khi bạn chỉ truyền cho hàm sum() một giá trị là 20, giá trị này được truyền tới phần định nghĩa hàm. Tuy nhiên phần định nghĩa hàm chấp nhận hai tham số trong khi chỉ có một giá trị được truyền, do đó sẽ tạo ra một lỗi như trên. Tham số mặc định trong PythonTham số mặc định là tham số mà cung cấp các giá trị mặc định cho các tham số được truyền trong phần định nghĩa hàm, trong trường hợp mà giá trị không được cung cấp trong lời gọi hàm. Ví dụ: def printme( str ): "Chuoi nay duoc truyen vao trong ham" print str return9 Kết quả là: ten_ham( cac_tham_so )0 Giải thích: 1, Trong trường hợp đầu tiên, khi hàm msg() được gọi đang truyền ba giá trị là 100, Hoang, và 20, thì các giá trị này sẽ được gán tương ứng cho các tham số và do đó chúng được in ra tương ứng. 2, Trong trường hợp thứ hai, khi bạn chỉ truyền hai tham số cho hàm msg() được gọi là 101 và Thanh, thì các giá trị này được gán tương ứng cho ID và Ten. Không có giá trị nào được gán cho tham số thứ ba trong lời gọi hàm, và vì thế hàm sẽ lấy giá trị mặc định là 21. Tham số từ khóa trong PythonSử dụng tham số từ khóa, tham số được truyền trong lời gọi hàm được kết nối với phần định nghĩa hàm dựa trên tên của tham số. Với trường hợp này, vị trí của các tham số trong lời gọi hàm là tùy ý. Ví dụ: ten_ham( cac_tham_so )1 Kết quả là: ten_ham( cac_tham_so )2 Giải thích: 1, Trong trường hợp đầu tiên, trong lời gọi hàm msg(), bạn đã truyền hai giá trị và truyền vị trí giống như của chúng trong phần định nghĩa hàm. Sau khi so khớp với phần định nghĩa hàm, thì các giá trị này được truyền tương ứng với các tham số trong phần định nghĩa hàm. Điều này được thực hiện dựa trên tên tham số. 2, Trong trường hợp thứ hai, trong lời gọi hàm msg(), bạn cũng cũng truyền hai giá trị nhưng với vị trí khác với phần định nghĩa hàm. Thì ở đây, dựa vào tên của tham số, các giá trị này cũng được truyền tương ứng cho các tham số trong phần định nghĩa hàm. Hàm với số tham số thay đổi trong PythonBạn có thể cần xử lý một hàm mà có số tham nhiều hơn là bạn đã xác định trong khi định nghĩa hàm. Những tham số này được gọi là các tham số có số tham số thay đổi (variable-length args) và không được đặt tên trong định nghĩa hàm, không giống như các tham số bắt buộc và tham số mặc định. Cú pháp cho một hàm có số thay đổi là: ten_ham( cac_tham_so )3 Một dấu * được đặt trước tên biến để giữ các giá trị của các tham số loại này. Tuple này vẫn là trống nếu không có tham số bổ sung nào được xác định trong khi gọi hàm. Dưới đây là ví dụ đơn giản. ten_ham( cac_tham_so )4 Kết quả là: ten_ham( cac_tham_so )5 Hàm nặc danh trong PythonHàm nặc danh (hàm vô danh), hiểu theo cách đơn giản, là hàm không có tên và chúng không được khai báo theo cách chính thức bởi từ khóa def. Để khai báo hàm này, bạn sử dụng từ khóa lambda. Lambda nhận bất kỳ lượng tham số nào và chỉ trả về một giá trị trong dạng một biểu thức đã được ước lượng. Bạn không thể gọi trực tiếp gọi hàm nặc danh để in bởi vì labda cần một biểu thức. Ngoài ra, các hàm lambda có namespace cục bộ của chúng. Dưới đây là cú pháp của hàm lamda: ten_ham( cac_tham_so )6 Bạn theo dõi ví dụ sau để hiểu cách hàm lambda làm việc: ten_ham( cac_tham_so )7 Kết quả là: ten_ham( cac_tham_so )8 So sánh hàm chính thức và hàm nặc danh trong Python?Bạn theo dõi hai ví dụ sau: Ví dụ cho hàm chính thức: ten_ham( cac_tham_so )9 Ví dụ cho hàm nặc danh: ten_ham( cac_tham_so )7 Giải thích: Hàm nặc danh được tạo bởi sử dụng từ khóa lambda, không phải bởi từ khóa def. Hàm này chỉ trả về một giá trị dưới dạng một biểu thức đã được ước lượng. |