Python có một loạt các chức năng tích hợp sẵn hữu ích mà bạn có thể sử dụng để thực hiện mọi loại công việc. Và mỗi người thực hiện một nhiệm vụ cụ thể.
Nhưng bạn có biết rằng Python cũng cho phép bạn định nghĩa các chức năng của riêng mình không?
Bài viết này sẽ chỉ cho bạn cách tạo và gọi các hàm Python của riêng bạn. Nó cũng sẽ cung cấp cho bạn cái nhìn tổng quan về cách truyền các tham số và đối số đầu vào cho các hàm của bạn.
Chức năng là gì?
Hàm là một khối mã biệt lập thực hiện một tác vụ cụ thể.
Các hàm rất hữu ích trong lập trình vì chúng loại bỏ việc sao chép và dán mã không cần thiết và quá mức trong một chương trình.
Nếu một hành động nhất định được yêu cầu thường xuyên và ở những nơi khác nhau, thì đó là một dấu hiệu tốt để bạn có thể viết một hàm cho nó. Các chức năng có nghĩa là có thể tái sử dụng.
Các chức năng cũng giúp tổ chức mã của bạn.
Nếu cần thực hiện thay đổi, bạn chỉ cần cập nhật chức năng nhất định đó. Điều này giúp bạn không phải tìm kiếm các đoạn mã khác nhau nằm rải rác ở các vị trí khác nhau trong chương trình của bạn bằng cách sao chép và dán.
Điều này tuân thủ nguyên tắc DRY (Don’t Repeat Yourself) trong phát triển phần mềm.
Mã bên trong hàm chỉ chạy khi hàm được gọi.
Các hàm có thể chấp nhận các đối số và giá trị mặc định và có thể hoặc không trả lại các giá trị cho người gọi sau khi mã đã chạy.
Cách xác định hàm trong Python
Cú pháp chung để tạo một hàm trong Python giống như sau:
def function_name(parameters):
function body
Hãy chia nhỏ những gì đang xảy ra ở đây:
def
là một từ khóa cho Python biết một chức năng mới đang được xác định.- Tiếp đến là tên hàm hợp lệ do bạn chọn. Tên hợp lệ bắt đầu bằng một chữ cái hoặc dấu gạch dưới nhưng có thể bao gồm các số. Các từ là chữ thường và được phân tách bằng dấu gạch dưới. Điều quan trọng cần biết là tên hàm không thể là từ khóa dành riêng cho Python.
- Sau đó, chúng ta có một tập hợp các dấu ngoặc đơn mở và đóng,
()
. Bên trong chúng, có thể có không, một hoặc nhiều không bắt buộc các tham số được phân tách bằng dấu phẩy với chúng không bắt buộc các giá trị mặc định. Chúng được chuyển đến chức năng. - Tiếp theo là dấu hai chấm,
:
kết thúc dòng định nghĩa của hàm. - Sau đó, có một dòng mới theo sau là mức độ thụt lề (bạn có thể thực hiện việc này với 4 dấu cách bằng bàn phím hoặc bằng 1 Tab thay thế). Việc thụt đầu dòng rất quan trọng vì nó cho phép Python biết mã nào sẽ thuộc về hàm.
- Sau đó, chúng ta có phần thân của hàm. Đây là mã sẽ được thực thi – nội dung với các hành động sẽ được thực hiện khi hàm được gọi.
- Cuối cùng, có một không bắt buộc return trong phần thân của hàm, trả lại một giá trị cho người gọi khi thoát khỏi hàm.
Hãy nhớ rằng nếu bạn quên dấu ngoặc đơn()
hoặc ruột kết :
khi cố gắng xác định một chức năng mới, Python sẽ cho bạn biết bằng một SyntaxError
.
Cách xác định và gọi một hàm cơ bản trong Python
Dưới đây là một ví dụ về hàm cơ bản không có câu lệnh trả về và không nhận bất kỳ tham số nào.
Nó chỉ in hello world
bất cứ khi nào nó được gọi.
def hello_world_func():
print("hello world")
Khi bạn đã xác định một chức năng, mã sẽ không tự chạy.
Để thực thi mã bên trong hàm, bạn phải tạo một gọi hàm hoặc nếu không một gọi hàm.
Sau đó, bạn có thể gọi hàm bao nhiêu lần tùy thích.
Để gọi một chức năng, bạn cần làm điều này:
function_name(arguments)
Đây là một sự cố của mã:
- Nhập tên chức năng.
- Tên chức năng phải được theo sau bởi dấu ngoặc đơn. Nếu có bất kỳ đối số bắt buộc nào, chúng phải được chuyển vào trong dấu ngoặc đơn. Nếu hàm không nhận bất kỳ đối số nào, bạn vẫn cần dấu ngoặc đơn.
Để gọi hàm từ ví dụ trên, hàm không nhận bất kỳ đối số nào, hãy làm như sau:
hello_world_func()
#Output
#hello world
Cách xác định và gọi hàm có tham số
Cho đến giờ, bạn đã thấy các chức năng đơn giản không thực sự làm được gì nhiều ngoài việc in một thứ gì đó ra bàn điều khiển.
Điều gì sẽ xảy ra nếu bạn muốn chuyển một số dữ liệu bổ sung cho hàm?
Chúng tôi đã sử dụng thuật ngữ ở đây như tham số và tranh luận.
định nghĩa của họ chính xác là gì?
Các tham số là một trình giữ chỗ được đặt tên chuyển thông tin vào các hàm.
Chúng hoạt động như các biến được định nghĩa cục bộ trong dòng định nghĩa của hàm.
def hello_to_you(name):
print("Hello " + name)
Trong ví dụ trên, có một tham số, name
.
Chúng tôi có thể đã sử dụng f-string formatting
thay vào đó – nó hoạt động giống như ví dụ trước:
def hello_to_you(name):
print(f"Hello {name}")
Có thể có một danh sách các tham số bên trong dấu ngoặc đơn, tất cả được phân tách bằng dấu phẩy.
def name_and_age(name,age):
print(f"I am {name} and I am {age} years old!")
Ở đây, các tham số trong hàm là name
và age
.
Khi một hàm được gọi, các đối số được truyền vào.
Đối số, giống như tham số, là thông tin được truyền cho hàm.
Cụ thể, chúng là các giá trị thực tế tương ứng với các tham số trong định nghĩa hàm.
Việc gọi hàm từ một ví dụ trước và chuyển vào một đối số sẽ giống như sau:
def hello_to_you(name):
print(f"Hello {name}")
hello_to_you("Timmy")
#Output
# Hello Timmy
Hàm có thể được gọi nhiều lần, mỗi lần truyền các giá trị khác nhau.
def hello_to_you(name):
print(f"Hello {name}")
hello_to_you("Timmy")
hello_to_you("Kristy")
hello_to_you("Jackie")
hello_to_you("Liv")
#Output:
#"Hello Timmy"
#"Hello Kristy"
#"Hello Jackie"
#"Hello Liv"
Các đối số trình bày cho đến nay được gọi là đối số vị trí.
Tất cả các đối số vị trí là rất nhiều cần thiết.
Số lượng đối số vị trí quan trọng
Khi gọi các hàm, bạn cần truyền đúng số đối số, nếu không sẽ xảy ra lỗi.
Khi nói đến các đối số vị trí, số lượng đối số được truyền vào lệnh gọi hàm phải hoàn toàn giống với số lượng tham số trong định nghĩa của hàm.
Bạn không thể bỏ đi hoặc thêm vào bất kỳ điều gì nữa.
Giả sử rằng bạn có chức năng này có hai tham số:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
Nếu hàm được gọi chỉ với một đối số được truyền vào, như thế này, sẽ có lỗi:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy")
Đầu ra:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello_to_you() missing 1 required positional argument: 'last_name'
Nếu hàm được gọi với ba đối số được truyền vào, sẽ lại xảy ra lỗi:
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy","Jones",34)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello_to_you() takes 2 positional arguments but 3 were given
Cũng sẽ có lỗi nếu chúng ta vượt qua không tranh luận.
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: hello_to_you() missing 2 required positional arguments: 'first_name' and 'last_name'
Thay vào đó, chúng ta cần hai đối số, vì hai tham số được liệt kê trong định nghĩa hàm.
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy","Jones")
#Output:
# Hello,Timmy Jones
Thứ tự của các đối số vị trí quan trọng
Bên cạnh đó bao gồm các chính xác con số của các lập luận, điều quan trọng cần lưu ý là trật tự trong đó các đối số được thông qua trong các vấn đề.
Các đối số cần được truyền theo đúng thứ tự như thứ tự của các tham số đã được khai báo trong định nghĩa của hàm.
Nó hoạt động giống như phép gán biến.
Đối số đầu tiên là giá trị của tham số đầu tiên trong định nghĩa của hàm. Đối số thứ hai là giá trị của tham số thứ hai trong định nghĩa của hàm – v.v.
def hello_to_you(first_name,last_name):
print(f"Hello, {first_name} {last_name}")
hello_to_you("Timmy","Jones")
#Output
#Hello,Timmy Jones
#you can visualise it like:
#first_name = "Timmy"
#last_name = "Jones"
Nếu thứ tự không chính xác, đầu ra có thể không có nhiều ý nghĩa và không như ý bạn muốn.
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language("Python","Dionysia")
#output:
#Hello, I am Python and my favorite programming language is Dionysia
#it is like you did
#name="Python"
#language = "Dionysia"
Cách sử dụng đối số từ khóa trong hàm Python
Cho đến giờ, bạn đã thấy một loại đối số, đối số vị trí.
Với các đối số vị trí, các hàm được gọi chỉ với các giá trị được truyền trong lệnh gọi hàm. Ở đó, mỗi giá trị tương ứng trực tiếp với số lượng, thứ tự và vị trí của từng tham số trong định nghĩa hàm.
Tuy nhiên, các hàm trong Python có thể chấp nhận một loại đối số khác, đó là đối số từ khóa.
Trong trường hợp này, thay vì chỉ truyền vào các giá trị trong lệnh gọi hàm, thay vào đó, bạn chỉ định tên của tham số và sau đó là giá trị bạn muốn gán cho nó, ở dạng key = value
.
Mỗi phím khớp với từng tham số trong định nghĩa hàm.
Việc gọi rõ ràng tên của các tham số và giá trị mà chúng nhận sẽ giúp hiểu rõ hơn về những gì bạn đang truyền vào và tránh bất kỳ sự nhầm lẫn nào có thể xảy ra.
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language(name="Dionysia",language="Python")
#output:
#Hello, I am Dionysia and my favorite programming language is Python
Các đối số từ khóa, như đã thấy ở trên, có thể theo một thứ tự cụ thể. Nhưng chúng linh hoạt hơn các đối số theo vị trí theo nghĩa là thứ tự của các đối số bây giờ không thành vấn đề.
Vì vậy, bạn có thể làm điều này và sẽ không có lỗi:
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language(language="Python",name="Dionysia")
#output:
#Hello, I am Dionysia and my favorite programming language is Python
Nhưng bạn vẫn phải đưa ra chính xác con số của lập luận.
Bạn có thể sử dụng cả đối số vị trí và từ khóa cùng nhau trong một lệnh gọi hàm, giống như ví dụ bên dưới khi có một đối số vị trí và một đối số từ khóa:
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language("dionysia",language="Python")
#output:
#Hello, I am dionysia and my favorite programming language is Python
Trong trường hợp này, thứ tự lại quan trọng.
Các đối số vị trí luôn đi trước và tất cả các đối số từ khóa phải tuân theo các đối số vị trí. Nếu không sẽ có lỗi:
def fave_language(name,language):
print(f"Hello, I am {name} and my favorite programming language is {language}")
fave_language(language="Python","dionysia")
Cách xác định tham số có giá trị mặc định trong Python
Đối số chức năng cũng có thể có giá trị mặc định. Họ được gọi là đối số mặc định hoặc tùy chọn.
Để đối số hàm có giá trị mặc định, bạn phải gán giá trị mặc định cho tham số trong định nghĩa của hàm.
Bạn làm điều này với key=value
hình thức, ở đâu value
sẽ là giá trị mặc định cho tham số đó.
def fave_language(language="python"):
print(f"My favorite programming language is {language}!")
fave_language()
#output
#My favorite programming language is python!
Như bạn thấy, đối số mặc định là không phải được yêu cầu trong lệnh gọi hàm và giá trị của language
sẽ luôn mặc định là Python nếu giá trị khác không được cung cấp trong cuộc gọi.
Tuy nhiên, các giá trị mặc định có thể dễ dàng bị ghi đè nếu bạn cung cấp một giá trị khác trong lệnh gọi của hàm:
def fave_language(language="python"):
print(f"My favorite programming language is {language}!")
fave_language("Java")
#prints "My favorite programming language is Java!" to the console
Có thể có nhiều hơn một giá trị mặc định được truyền cho hàm.
Khi hàm được gọi, không, một, một số hoặc tất cả các đối số mặc định có thể được cung cấp và thứ tự không quan trọng.
def personal_details(name="Jimmy",age=28,city="Berlin"):
print(f"I am {name},{age} years old and live in {city}")
#We can do:
personal_details()
#output:
#I am Jimmy,28 years old and live in Berlin
personal_details(age=30)
#I am Jimmy,30 years old and live in Berlin
personal_details(city="Athens",name="Ben",age=24)
##I am Ben,24 years old and live in Athens
Các đối số mặc định có thể được kết hợp với các đối số không mặc định trong lời gọi của hàm.
Đây là một hàm chấp nhận hai đối số: một đối số vị trí, không mặc định (name
) và một tùy chọn, mặc định (language
).
def fave_language(name,language="Python"):
print(f"My name is {name} and my favorite programming language is {language}!")
fave_language("Dionysia")
#output:
#"My name is Dionysia and my favorite programming language is Python!"
Đối số mặc định, langyage="Python"
Là không bắt buộc. Nhưng đối số vị trí, name
, sẽ luôn luôn được yêu cầu. Nếu khác language
không được chuyển vào, giá trị sẽ luôn mặc định là Python.
Một điều khác cần đề cập ở đây là, khi mặc định và không mặc định được sử dụng cùng nhau, thứ tự chúng được xác định trong định nghĩa hàm có ý nghĩa quan trọng.
Tất cả các đối số vị trí đi trước và được theo sau bởi các đối số mặc định.
Điều này sẽ không hoạt động:
def fave_language(language="Python",name):
print(f"My name is {name} and my favorite programming language is {language}!")
fave_language("Dionysia")
Đầu ra:
File "<stdin>", line 1
SyntaxError: non-default argument follows default argument
Phần kết luận
Trong bài viết này, bạn đã học cách khai báo các hàm và gọi chúng bằng các tham số trong ngôn ngữ lập trình Python.
Đây là phần giới thiệu về cách tạo các hàm đơn giản và cách truyền dữ liệu vào chúng cùng với các tham số. Chúng tôi cũng đã xem xét các loại lập luận khác nhau như vị trí, từ khóavà mặc định tranh luận.
Tóm lại:
- Thứ tự và số lượng vị trí lập luận quan trọng.
- Với từ khóa đối số, thứ tự không quan trọng. Tuy nhiên, số lượng không quan trọng vì mỗi đối số từ khóa tương ứng với từng tham số trong định nghĩa của hàm.
- Mặc định đối số là hoàn toàn tùy chọn. Bạn có thể vượt qua tất cả chúng, một số trong số chúng hoặc không có gì cả.
Nếu bạn muốn tìm hiểu sâu hơn và tìm hiểu thêm về ngôn ngữ lập trình Python, freeCodeCamp có chứng chỉ Python miễn phí.
Bạn sẽ bắt đầu từ những điều cơ bản và nguyên tắc cơ bản của ngôn ngữ, sau đó tiến tới các khái niệm nâng cao hơn như cấu trúc dữ liệu và cơ sở dữ liệu quan hệ. Cuối cùng, bạn sẽ xây dựng 5 dự án để thực hành những gì bạn đã học.
Cảm ơn bạn đã đọc và học tập vui vẻ.