Hướng dẫn function parameters python - tham số hàm python

Dẫn nhập

Trong bài trước, Kteam đã giới thiệu đến bạn VÒNG LẶP FOR TRONG PYTHON.

Và ở bài này Kteam sẽ lại tìm hiểu với các bạn KIỂU DỮ LIỆU FUNCTION TRONG PYTHON - Sơ lược về hàm.KIỂU DỮ LIỆU FUNCTION TRONG PYTHON - Sơ lược về hàm.


Nội dung

Để đọc hiểu bài này tốt nhất bạn cần:

  • Cài đặt sẵn MÔI TRƯỜNG PHÁT TRIỂN CỦA PYTHON.
  • Xem qua bài CÁCH CHẠY CHƯƠNG TRÌNH PYTHON.
  • Nắm CÁCH GHI CHÚ và BIẾN TRONG PYTHON.
  • CÁC KIỂU DỮ LIỆU ĐƯỢC GIỚI THIỆU TRONG PYTHON
  • CÂU ĐIỀU KIỆN IF TRONG PYTHON
  • VÒNG LẶP WHILE và VÒNG LẶP FOR TRONG PYTHON
  • NHẬP XUẤT TRONG PYTHON

Bạn và Kteam sẽ cùng tìm hiểu những nội dung sau đây

  • Vấn đề.
  • Khai báo hàm. (Create function)
  • Gọi hàm. (Call function)
  • Đừng viết lại code! (DRY – Don’t Repeat Yourself)
  • Parameter và Argument.
  • Giá trị mặc định của parameter. (default argument)

Vấn đề

Bạn đã được giới thiệu qua HÀM PRINT. Vậy bạn có biết người ta đã tạo nên hàm đó như thế nào không? Kteam nghĩ bạn cũng không nên tìm hiểu làm gì vì vốn nó cũng rất phức tạp!

Vậy nếu bây giờ không có hàm print thì có phải mỗi lần bạn muốn in ra thứ gì đó trên Shell thì bạn phải viết một dãy lệnh dài để có thể làm điều đó đúng chứ?Shell thì bạn phải viết một dãy lệnh dài để có thể làm điều đó đúng chứ?

Ta thử tính đơn giản thôi!

Ví dụ: hàm print chỉ tốn 10 dòng để có thể in ra một chuỗi (thật sự là nhiều hơn vậy rất nhiều), vậy nếu bạn dùng 10 lần print thì nó đã tới 100 dòng. hàm print chỉ tốn 10 dòng để có thể in ra một chuỗi (thật sự là nhiều hơn vậy rất nhiều), vậy nếu bạn dùng 10 lần print thì nó đã tới 100 dòng.

Mà với một chương trình, liệu bạn chỉ có sử dụng mỗi hàm print? Nếu không nhờ những kĩ sư đã viết sẵn cho chúng ta rất nhiều hàm để cho chúng ta sử dụng liệu chúng ta tốn mất bao lâu và bao nhiêu dòng code cho một script in ra dòng chữ “Hello Kteam!” ở trên Shell?print? Nếu không nhờ những kĩ sư đã viết sẵn cho chúng ta rất nhiều hàm để cho chúng ta sử dụng liệu chúng ta tốn mất bao lâu và bao nhiêu dòng code cho một script in ra dòng chữ “Hello Kteam!” ở trên Shell?

Thời gần xưa, con người ta khi viết các dòng code thì sẽ viết từ trên viết xuống, lệnh nào làm trước thì viết trước và cứ thế hoàn thành đoạn script. Ta gọi, đó là Lập trình tuyến tính (linear programming).script. Ta gọi, đó là Lập trình tuyến tính (linear programming).

Và khi nhiều vấn đề phát sinh từ linear programming như việc sửa đổi, cập nhật, rất khó khăn và nhiều nguyên nhân khác đã đưa ra một thời kì lập trình mới, đó chính là Lập trình thủ tục (procedural programming)linear programming như việc sửa đổi, cập nhật, rất khó khăn và nhiều nguyên nhân khác đã đưa ra một thời kì lập trình mới, đó chính là Lp trình thủ tục (procedural programming)

Để có thể có một chương trình theo hướng procedural programming, thì ta phải biết khái niệm hàm và cụ thể trong bài này, Kteam sẽ giới thiệu với các bạn về nó. procedural programming, thì ta phải biết khái niệm hàm và cụ thể trong bài này, Kteam sẽ giới thiệu với các bạn về nó.


Khai báo hàm (create function)

Ở đây, Kteam sử dụng từ “khai báo”, và với tựa bài có cụm từ “kiểu dữ liệu” để muốn nói với bạn rằng trong Python, những hàm mà ta tạo là những biến đặc biệt mà ta khai báo.khai báo”, và với tựa bài có cụm từ “kiểu dữ liệu” để muốn nói với bạn rằng trong Python, những hàm mà ta tạo là những biến đặc biệt mà ta khai báo.

Bạn nên nắm rõ điều này để sau này có khi bạn sẽ tiếp cận tới khái niệm meta class (siêu lớp) sẽ hiểu rõ hơn. meta class (siêu lớp) sẽ hiểu rõ hơn.

Để khai báo một hàm, ta sử dụng từ khóa “def” với cú pháp như saudef” với cú pháp như sau

Cú pháp:

def (parameter_1 [: ], parameter_2[: ], .., parameter_n[: ])[-> ](parameter_1 [: <kiểu dữ liệu gợi ý của parameter_1>], parameter_2 [: <kiểu dữ liệu gợi ý của parameter_2>], .., parameter_n [: <kiểu dữ liệu gợi ý của parameter_n>])[-> ]

    function-block

Trong cú pháp đó, bạn không được bỏ sót bất kì thứ nào ngoại trừ bạn có thể bỏ trống các parameter. Phần kiểu dữ liệu gợi ý (Kteam đã đánh dấu bằng màu đỏ và xanh là không bắt buộc (nhưng Kteam khuyến khích các bạn để chú thích này đi kèm với code, để nó tường minh hơn).parameter. Phần kiểu dữ liệu gợi ý (Kteam đã đánh dấu bằng màu đỏxanh là không bắt buộc (nhưng Kteam khuyến khích các bạn để chú thích này đi kèm với code, để nó tường minh hơn).

Ví dụ:

>>> def kteam():
...     pass
...
>>> kteam
<function kteam at 0x014EC5D0>
>>> type(kteam)
<class 'function'>

Lưu ý:

Cũng giống như vòng lặp, lệnh pass ở trên là một lệnh “giữ chỗ” (placeholder statement) để giúp cho các block của Python không bị thiếu câu lệnh trong trường hợp bạn chưa biết viết gì cho phù hợp. giống như vòng lặp, lệnh pass ở trên là một lệnh “giữ chỗ” (placeholder statement) để giúp cho các block của Python không bị thiếu câu lệnh trong trường hợp bạn chưa biết viết gì cho phù hợp.

Bạn có thể thấy, khi in ra hàm kteam, bạn sẽ nhận được một dòng khá tương một một generator expression. generator expression.

Ví dụ 2: dụ 2:

>>> def P(SomeThing: str) -> None:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> P
<function P at 0x000002D893AF3E20>
>>> type(P)
<class 'function'>
>>> P("Kteam")
Kteam
Printed by Print-function

Để cho chương trình của bạn được tường minh hơn, các bạn nên tạo thói quen chú thích kiểu dữ liệu cho các parameter của một function cũng như là kiểu dữ liệu trả về của nó.

Python không ép buộc các bạn phải sử dụng các parameter đúng với kiểu dữ liệu mà bạn đã đặt gợi ý. Nhưng để việc đặt các gợi ý này có ý nghĩa, đừng bao giờ dùng các parameter khác với kiểu đã được gợi ý của hàm.

>>> def P(SomeThing: int) -> str:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> P("Kteam") # Hoàn toàn hợp lệ, nhưng không khuyến khích
Kteam
Printed by Print-function

Gọi hàm (call function)

Việc gọi hàm, ta có cú pháp sau đây

Cú pháp:

def (parameter_1 [: ], parameter_2[: ], .., parameter_n[: ])[-> ]()

    function-block

Ví dụ:

>>> def kteam():
...     print('Hello Kteam!')
...
>>> kteam
<function kteam at 0x0323FD68>
>>> kteam()
Hello Kteam!

Lưu ý:print in ra màn hình một dòng chuỗi.

Cũng giống như vòng lặp, lệnh pass ở trên là một lệnh “giữ chỗ” (placeholder statement) để giúp cho các block của Python không bị thiếu câu lệnh trong trường hợp bạn chưa biết viết gì cho phù hợp.

Bạn có thể thấy, khi in ra hàm kteam, bạn sẽ nhận được một dòng khá tương một một generator expression. =  

Ví dụ 2:

>>> def P(SomeThing: str) -> None:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> t = P
>>> t is P
True
>>> P("print Kteam with P")
print Kteam with P
Printed by Print-function
>>> t("print Kteam with t")
print Kteam with t
Printed by Print-function

Để cho chương trình của bạn được tường minh hơn, các bạn nên tạo thói quen chú thích kiểu dữ liệu cho các parameter của một function cũng như là kiểu dữ liệu trả về của nó.

Python không ép buộc các bạn phải sử dụng các parameter đúng với kiểu dữ liệu mà bạn đã đặt gợi ý. Nhưng để việc đặt các gợi ý này có ý nghĩa, đừng bao giờ dùng các parameter khác với kiểu đã được gợi ý của hàm.script với nhiệm vụ in ra 8 dòng in ra “Hello Kteam!” và “Free Education

print('Hello Kteam!')

print("Free Education")

print('Hello Kteam!')

print("Free Education")

print('Hello Kteam!')

print("Free Education")

print('Hello Kteam!')

print("Free Education")

Lưu ý::

Cũng giống như vòng lặp, lệnh pass ở trên là một lệnh “giữ chỗ” (placeholder statement) để giúp cho các block của Python không bị thiếu câu lệnh trong trường hợp bạn chưa biết viết gì cho phù hợp.

Bạn có thể thấy, khi in ra hàm kteam, bạn sẽ nhận được một dòng khá tương một một generator expression.Hello Kteam!” thành “Hi Kteam!”, vậy là bạn phải chỉnh sửa lại 4 dòng lệnh.

Giờ ta đưa vấn đề xa hơn một tí nữa. Nếu nhiệm vụ của bạn không chỉ là print ra tám dòng chữ mà còn phải làm nhiều thứ khác, thì có phải bạn đang viết lại rất nhiều code không? Và khi chỉnh sửa mà nếu chỉnh sửa nhiều thì bạn sẽ phải mất rất nhiều công sức. print ra tám dòng chữ mà còn phải làm nhiều thứ khác, thì có phải bạn đang viết lại rất nhiều code không? Và khi chỉnh sửa mà nếu chỉnh sửa nhiều thì bạn sẽ phải mất rất nhiều công sức.

Để có thể tránh được việc đó, ta hãy sử dụng hàm

def kteam():
    print('Hello Kteam!')
    print("Free Education")
kteam()
kteam()
kteam()
kteam()

Và khi muốn chỉnh sửa, ta chỉ cần chỉnh sửa bên trong hàm, thì ta sẽ thay đổi được tất cả.


Parameter và Argument

Hiểu một cách đơn giản, parameter chính là tham số của hàm – là tên các biến sẽ được sử dụng trong hàm. Còn argument là đối số, tức là giá trị mà ta truyền cho parameter.

Ví dụ:

>>> def Print(sthing): # sthing là parameter (tham số)
...     print(sthing)
...
>>> Print("Kteam") # “Kteam” là argument (đối số)
Kteam

Cụ thể:

Đầu tiên, ta khởi tạo một hàm có các parameterparameter

>>> def kteam(text):
…     print(text)

Và khi gọi hàm có parameter, bạn phải truyền vào argument tương ứng.parameter, bạn phải truyền vào argument tương ứng.

>>> kteam('Hello Kteam!')
Hello Kteam!

Ở đây, argument chúng ta đưa vào là một chuỗi. Chuỗi này sẽ được đưa vào gán cho parameter tương ứng là text. Và rồi hàm thực hiện việc in text ra.argument chúng ta đưa vào là một chuỗi. Chuỗi này sẽ được đưa vào gán cho parameter tương ứng là text. Và rồi hàm thực hiện việc in text ra.

Đương nhiên là chúng ta có thể biến hóa nhiều ra nữa

>>> def P(SomeThing: str) -> None:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> P
<function P at 0x000002D893AF3E20>
>>> type(P)
<class 'function'>
>>> P("Kteam")
Kteam
Printed by Print-function
0

Giá trị mặc định của parameter (Default argument)

Hãy coi ví dụ sau:

>>> def P(SomeThing: str) -> None:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> P
<function P at 0x000002D893AF3E20>
>>> type(P)
<class 'function'>
>>> P("Kteam")
Kteam
Printed by Print-function
1

Ta thấy, tần suất xuất hiện chuỗi “Hi” cho parameter greating rất cao. Giờ ta cần một parameter giữ giá trị là chuỗi “Hi” nhưng vẫn cho ta thay đổi khi cần. Bấy giờ, ta nên sử dụng default argument.Hi” cho parameter greating rất cao. Giờ ta cần một parameter giữ giá trị là chuỗi “Hi” nhưng vẫn cho ta thay đổi khi cần. Bấy giờ, ta nên sử dụng default argument.

>>> def P(SomeThing: str) -> None:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> P
<function P at 0x000002D893AF3E20>
>>> type(P)
<class 'function'>
>>> P("Kteam")
Kteam
Printed by Print-function
2

Lưu ý:

Khi bạn đưadefault argument cho các parameter, phải để các parameter có default argumentở sau cùng.default argument cho các parameter, phải để các parameter default argumentở sau cùng.

Default argument là một unhashable container là một unhashable container

Như các bạn đã biết, unhashable container phổ biến mà ta đã từng biết như LIST, DICT, SET. Ở đây có một cảnh báo cho bạn việc bạn sử dụng default argument cho parameter là một unhashable container đó là giá trị của nó không được  làm mới (refresh) sau mỗi lần gọi hàm mà không pass argument mới cho parameter đó. Đương nhiên là nếu bạn có pass cho nó một argument mới thì container đó vẫn không hề mất giá trị nếu lần sau bạn gọi nó.unhashable container phổ biến mà ta đã từng biết như LIST, DICT, SET. Ở đây có một cảnh báo cho bạn việc bạn sử dụng default argument cho parameter là một unhashable container đó là giá trị của nó không được  làm mới (refresh) sau mỗi lần gọi hàm mà không pass argument mới cho parameter đó. Đương nhiên là nếu bạn có pass cho nó một argument mới thì container đó vẫn không hề mất giá trị nếu lần sau bạn gọi nó.

>>> def P(SomeThing: str) -> None:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> P
<function P at 0x000002D893AF3E20>
>>> type(P)
<class 'function'>
>>> P("Kteam")
Kteam
Printed by Print-function
3

Sử dụng hàm kết hợp với phương thức sort dụng hàm kết hợp với phương thức sort

Các bạn còn nhớ bài Các phương thưc với list trong Python chứ ? Kteam đã từng giới thiệu cho các bạn về phương thức sort. bạn còn nhớ bài Các phương thưc với list trong Python chứ ? Kteam đã từng giới thiệu cho các bạn về phương thức sort.

.sort(key=None, reverse=False).sort(key=Nonereverse=False)

Chúng ta sẽ cùng đi sâu hơn một chút về tham số key. Như Kteam đã đề cập, thì bạn có thể dùng một hàm để làm tham số key, và các phần tử trong list sẽ được sắp xếp dựa vào cách mà hàm đó hoạt động.Kteam đã đề cập, thì bạn có thể dùng một hàm để làm tham số key, và các phần tử trong list sẽ được sắp xếp dựa vào cách mà hàm đó hoạt động.

Ví dụ:

Cụ thể:

Đầu tiên, ta khởi tạo một hàm có các parameter

Và khi gọi hàm có parameter, bạn phải truyền vào argument tương ứng.

Ở đây, argument chúng ta đưa vào là một chuỗi. Chuỗi này sẽ được đưa vào gán cho parameter tương ứng là text. Và rồi hàm thực hiện việc in text ra.

Đương nhiên là chúng ta có thể biến hóa nhiều ra nữa # sắp xếp list dựa trên độ dài của các phần tử (chuỗi) của list

Giá trị mặc định của parameter (Default argument)

Hãy coi ví dụ sau:

>>> def P(SomeThing: str) -> None:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> P
<function P at 0x000002D893AF3E20>
>>> type(P)
<class 'function'>
>>> P("Kteam")
Kteam
Printed by Print-function
4
>>> def P(SomeThing: str) -> None:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> P
<function P at 0x000002D893AF3E20>
>>> type(P)
<class 'function'>
>>> P("Kteam")
Kteam
Printed by Print-function
5

Ta thấy, tần suất xuất hiện chuỗi “Hi” cho parameter greating rất cao. Giờ ta cần một parameter giữ giá trị là chuỗi “Hi” nhưng vẫn cho ta thay đổi khi cần. Bấy giờ, ta nên sử dụng default argument.

Lưu ý:

Khi bạn đưadefault argument cho các parameter, phải để các parameter có default argumentở sau cùng.

>>> def P(SomeThing: str) -> None:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> P
<function P at 0x000002D893AF3E20>
>>> type(P)
<class 'function'>
>>> P("Kteam")
Kteam
Printed by Print-function
6
>>> def P(SomeThing: str) -> None:
...     print(SomeThing)
...     print("Printed by Print-function")
...
>>> P
<function P at 0x000002D893AF3E20>
>>> type(P)
<class 'function'>
>>> P("Kteam")
Kteam
Printed by Print-function
7

Default argument là một unhashable container

Như các bạn đã biết, unhashable container phổ biến mà ta đã từng biết như LIST, DICT, SET. Ở đây có một cảnh báo cho bạn việc bạn sử dụng default argument cho parameter là một unhashable container đó là giá trị của nó không được  làm mới (refresh) sau mỗi lần gọi hàm mà không pass argument mới cho parameter đó. Đương nhiên là nếu bạn có pass cho nó một argument mới thì container đó vẫn không hề mất giá trị nếu lần sau bạn gọi nó.

Sử dụng hàm kết hợp với phương thức sort

Các bạn còn nhớ bài Các phương thưc với list trong Python chứ ? Kteam đã từng giới thiệu cho các bạn về phương thức sort.“Luyện tập – Thử thách – Không ngại khó”.


Chúng ta sẽ cùng đi sâu hơn một chút về tham số key. Như Kteam đã đề cập, thì bạn có thể dùng một hàm để làm tham số key, và các phần tử trong list sẽ được sắp xếp dựa vào cách mà hàm đó hoạt động.

>>> def compare(value: str) -> int: