Thứ ba, 28/02/2017 | 00:00 GMT+7

Cách xác định hàm trong Python 3

Hàm là một khối lệnh thực hiện một hành động và sau khi được xác định, được dùng lại. Các hàm làm cho mã module hơn, cho phép bạn sử dụng lặp đi lặp lại cùng một mã.

Python có một số hàm tích hợp mà bạn có thể quen thuộc, bao gồm:

  • print() sẽ in một đối tượng vào terminal
  • int() sẽ chuyển đổi kiểu dữ liệu chuỗi hoặc số thành kiểu dữ liệu số nguyên
  • len() trả về độ dài của một đối tượng

Tên hàm bao gồm dấu ngoặc đơn và có thể bao gồm các tham số.

Trong hướng dẫn này, ta sẽ xem xét cách xác định các hàm của bạn để sử dụng trong các dự án mã hóa của bạn.

Xác định một chức năng

Hãy bắt đầu với việc chuyển câu nói cổ điển“Hello, World!” chương trình thành một hàm.

Ta sẽ tạo một file văn bản mới trong editor mà ta chọn và gọi chương trình hello.py . Sau đó, ta sẽ xác định hàm.

Một hàm được xác định bằng cách sử dụng từ khóa def , theo sau là tên bạn chọn, theo sau là một tập hợp các dấu ngoặc đơn chứa bất kỳ tham số nào mà hàm sẽ nhận (chúng có thể để trống) và kết thúc bằng dấu hai chấm.

Trong trường hợp này, ta sẽ định nghĩa một hàm có tên hello() :

hello.py
def hello(): 

Điều này cài đặt câu lệnh ban đầu để tạo một hàm.

Từ đây, ta sẽ thêm dòng thứ hai với khoảng cách thụt lề 4 để cung cấp hướng dẫn về chức năng hoạt động. Trong trường hợp này, ta sẽ in Hello, World! vào console :

hello.py
def hello():     print("Hello, World!")  

Hàm của ta hiện đã được xác định đầy đủ, nhưng nếu ta chạy chương trình tại thời điểm này, sẽ không có gì xảy ra vì ta không gọi hàm.

Vì vậy, bên ngoài khối hàm đã xác định của ta , hãy gọi hàm với hello() :

hello.py
def hello():     print("Hello, World!")  hello()  

Bây giờ, hãy chạy chương trình:

  • python hello.py

Bạn sẽ nhận được kết quả sau:

Output
Hello, World!

Các hàm có thể phức tạp hơn hàm hello() mà ta đã định nghĩa ở trên. Ví dụ: ta có thể sử dụng vòng lặp for , câu lệnh điều kiện , v.v. trong khối chức năng của ta .

Ví dụ: hàm được định nghĩa bên dưới sử dụng câu lệnh điều kiện để kiểm tra xem đầu vào cho biến name có chứa nguyên âm hay không, sau đó sử dụng vòng lặp for để lặp qua các chữ cái trong chuỗi name .

names.py
# Define function names() def names():     # Set up name variable with input     name = str(input('Enter your name: '))     # Check whether name has a vowel     if set('aeiou').intersection(name.lower()):         print('Your name contains a vowel.')     else:         print('Your name does not contain a vowel.')      # Iterate over name     for letter in name:         print(letter)  # Call the function names()  

Hàm names() mà ta đã xác định ở trên cài đặt một câu lệnh điều kiện và một vòng lặp for , cho thấy cách mã có thể được tổ chức trong một định nghĩa hàm. Tuy nhiên, tùy thuộc vào những gì ta dự định với chương trình của bạn và cách ta muốn cài đặt mã của bạn , ta có thể cần xác định câu lệnh điều kiện và vòng lặp for là hai hàm riêng biệt.

Việc xác định các hàm trong một chương trình làm cho mã của ta trở nên module và có thể sử dụng lại để ta có thể gọi các hàm tương tự mà không cần viết lại chúng.

Làm việc với các tham số

Cho đến nay ta đã xem xét các hàm có dấu ngoặc trống không nhận đối số, nhưng ta có thể xác định các tham số trong các định nghĩa hàm trong dấu ngoặc của chúng.

Tham số là một thực thể được đặt tên trong định nghĩa hàm, chỉ định một đối số mà hàm có thể chấp nhận.

Hãy tạo một chương trình nhỏ có tham số x , yz . Ta sẽ tạo một hàm bổ sung các tham số với nhau trong các cấu hình khác nhau. Tổng của những thứ này sẽ được in bởi hàm. Sau đó, ta sẽ gọi hàm và chuyển các số vào hàm.

add_numbers.py
def add_numbers(x, y, z):     a = x + y     b = x + z     c = y + z     print(a, b, c)  add_numbers(1, 2, 3)  

Ta đã chuyển số 1 vào cho tham số x , 2 in cho tham số y3 in cho tham số z . Các giá trị này tương ứng với từng tham số theo thứ tự chúng được đưa ra.

Về cơ bản, chương trình đang thực hiện phép toán sau dựa trên các giá trị mà ta đã truyền cho các tham số:

a = 1 + 2 b = 1 + 3 c = 2 + 3 

Hàm cũng in ra a , bc , và dựa trên phép toán ở trên, ta mong đợi a bằng 3 , b bằng 4c bằng 5 . Hãy chạy chương trình:

  • python add_numbers.py
Output
3 4 5

Khi ta truyền 1 , 23 dưới dạng tham số cho hàm add_numbers() , ta sẽ nhận được kết quả mong đợi.

Tham số là các đối số thường được định nghĩa là các biến trong định nghĩa hàm. Chúng có thể được gán giá trị khi bạn chạy phương thức, truyền các đối số vào hàm.

Đối số từ khóa

Ngoài việc gọi các tham số theo thứ tự, bạn có thể sử dụng các đối số từ khóa trong một lệnh gọi hàm, trong đó trình gọi xác định các đối số bằng tên tham số.

Khi bạn sử dụng các đối số từ khóa, bạn có thể sử dụng các tham số không theo thứ tự vì trình thông dịch Python sẽ sử dụng các từ khóa được cung cấp để khớp các giá trị với các tham số.

Hãy tạo một chức năng sẽ hiển thị thông tin profile của ta cho một user . Ta sẽ chuyển các tham số cho nó dưới dạng username (dự định là một chuỗi) và followers (dự định dưới dạng số nguyên).

profile.py
# Define function with parameters def profile_info(username, followers):     print("Username: " + username)     print("Followers: " + str(followers))  

Trong câu lệnh định nghĩa hàm, usernamefollowers được chứa trong dấu ngoặc đơn của hàm profile_info() . Khối của hàm in ra thông tin về user dưới dạng chuỗi, sử dụng hai tham số.

Bây giờ, ta có thể gọi hàm và gán các tham số cho nó:

profile.py
def profile_info(username, followers):     print("Username: " + username)     print("Followers: " + str(followers))  # Call function with parameters assigned as above profile_info("sammyshark", 945)  # Call function with keyword arguments profile_info(username="AlexAnglerfish", followers=342)  

Trong lần gọi hàm đầu tiên, ta đã điền thông tin với tên user là sammyshark và người theo dõi là 945 , trong lần gọi hàm thứ hai, ta đã sử dụng các đối số từ khóa, gán giá trị cho các biến đối số.

Hãy chạy chương trình:

  • python profile.py
Output
Username: sammyshark Followers: 945 Username: AlexAnglerfish Followers: 342

Kết quả hiển thị cho ta tên user và số lượng người theo dõi của cả hai user .

Điều này cũng cho phép ta sửa đổi thứ tự của các tham số, như trong ví dụ này về cùng một chương trình với một lệnh gọi khác:

profile.py
def profile_info(username, followers):     print("Username: " + username)     print("Followers: " + str(followers))  # Change order of parameters profile_info(followers=820, username="cameron-catfish")  

Khi ta chạy lại chương trình bằng lệnh python profile.py , ta sẽ nhận được kết quả sau:

Output
Username: cameron-catfish Followers: 820

Bởi vì định nghĩa hàm duy trì cùng một thứ tự của các câu print() , nếu ta sử dụng các đối số từ khóa, thì việc ta chuyển chúng vào lệnh gọi hàm không quan trọng.

Giá trị đối số mặc định

Ta cũng có thể cung cấp các giá trị mặc định cho một hoặc cả hai tham số. Hãy tạo giá trị mặc định cho thông số followers với giá trị 1 :

profile.py
def profile_info(username, followers=1):     print("Username: " + username)     print("Followers: " + str(followers)) 

Bây giờ, ta có thể chạy chức năng chỉ với chức năng tên user được gán và số lượng người theo dõi sẽ tự động mặc định là 1. Ta vẫn có thể thay đổi số lượng người theo dõi nếu muốn.

profile.py
def profile_info(username, followers=1):     print("Username: " + username)     print("Followers: " + str(followers))  profile_info(username="JOctopus") profile_info(username="sammyshark", followers=945) 

Khi ta chạy chương trình bằng lệnh python profile.py , ta sẽ nhận được kết quả sau:

Output
Username: JOctopus Followers: 1 Username: sammyshark Followers: 945

Việc cung cấp các tham số mặc định với các giá trị có thể cho phép ta bỏ qua việc xác định giá trị cho từng đối số đã có giá trị mặc định.

Trả lại giá trị

Bạn có thể truyền một giá trị tham số vào một hàm và một hàm cũng có thể tạo ra một giá trị.

Một hàm có thể tạo ra một giá trị bằng câu lệnh return , câu lệnh này sẽ thoát khỏi một hàm và tùy chọn chuyển một biểu thức trở lại trình gọi. Nếu bạn sử dụng câu lệnh return không có đối số, hàm sẽ trả về None .

Lúc này, ta đã sử dụng câu print() thay vì câu lệnh return trong các hàm của bạn . Hãy tạo một chương trình thay vì in sẽ trả về một biến.

Trong một file văn bản mới có tên square.py , ta sẽ tạo một chương trình bình phương tham số x và trả về biến y . Ta thực hiện lệnh gọi để in biến result , biến này được hình thành bằng cách chạy hàm square() với 3 được truyền vào đó.

square.py
def square(x):     y = x ** 2     return y  result = square(3) print(result)  

Ta có thể chạy chương trình và xem kết quả:

  • python square.py
Output
9

Số nguyên 9 được trả về dưới dạng kết quả , đó là điều ta mong đợi bằng cách yêu cầu Python tìm bình phương của 3.

Để hiểu thêm về cách hoạt động của câu lệnh return , ta có thể comment câu lệnh return trong chương trình:

square.py
def square(x):     y = x ** 2     # return y  result = square(3) print(result)  

Bây giờ, hãy chạy lại chương trình:

  • python square.py
Output
None

Nếu không sử dụng câu lệnh return ở đây, chương trình không thể trả về một giá trị nên giá trị được mặc định là None .

Như một ví dụ khác, trong chương trình add_numbers.py ở trên, ta có thể swap câu print() cho một câu lệnh return .

add_numbers.py
def add_numbers(x, y, z):     a = x + y     b = x + z     c = y + z     return a, b, c  sums = add_numbers(1, 2, 3) print(sums)  

Bên ngoài hàm, ta đặt các sums biến bằng kết quả của hàm nhận trong 1 , 23 như ta đã làm ở trên. Sau đó, ta gọi một bản in của biến sums .

Bây giờ hãy chạy lại chương trình khi nó có câu lệnh return :

  • python add_numbers.py
Output
(3, 4, 5)

Ta nhận được các số 3 , 45 giống như kết quả mà ta đã nhận được trước đó bằng cách sử dụng câu print() trong hàm. Lần này nó được gửi dưới dạng một bộdanh sách biểu thức của câu lệnh return có ít nhất một dấu phẩy.

Các hàm thoát ngay lập tức khi chúng gặp câu lệnh return , cho dù chúng có trả về một giá trị hay không.

return_loop.py
def loop_five():     for x in range(0, 25):         print(x)         if x == 5:             # Stop function at x == 5             return     print("This line will not execute.")  loop_five()  

Sử dụng câu lệnh return trong vòng lặp for sẽ kết thúc hàm, do đó, dòng nằm ngoài vòng lặp sẽ không chạy. Thay vào đó, nếu ta sử dụng câu lệnh break , thì chỉ có vòng lặp mới thoát ra tại thời điểm đó và dòng print() cuối cùng sẽ chạy.

Câu lệnh return thoát khỏi một hàm và có thể trả về một giá trị khi được cấp một tham số.

Sử dụng main() như một hàm

Mặc dù trong Python, bạn có thể gọi hàm ở cuối chương trình của bạn và nó sẽ chạy (như ta đã làm trong các ví dụ ở trên), nhiều ngôn ngữ lập trình (như C ++ và Java) yêu cầu một hàm main để thực thi. Bao gồm một hàm main() , mặc dù không bắt buộc, có thể cấu trúc các chương trình Python của ta theo cách hợp lý để đặt các thành phần quan trọng nhất của chương trình vào một hàm. Nó cũng có thể làm cho các chương trình của ta dễ đọc hơn đối với các lập trình viên không sử dụng Python.

Ta sẽ bắt đầu với việc thêm một hàm main() vào chương trình hello.py ở trên. Ta sẽ giữ lại hàm hello() , sau đó định nghĩa một hàm main() :

hello.py
def hello():     print("Hello, World!")  def main(): 

Trong hàm main() , hãy bao gồm một câu print() để cho ta biết rằng ta đang ở trong hàm main() . Ngoài ra, hãy gọi hàm hello() trong hàm main() :

hello.py
def hello():     print("Hello, World!")   def main():     print("This is the main function")     hello() 

Cuối cùng, ở cuối chương trình, ta sẽ gọi hàm main() :

hello.py
def hello():     print("Hello, World!")  def main():     print("This is the main function.")     hello()  main()  

Đến đây, ta có thể chạy chương trình của bạn :

  • python hello.py

Ta sẽ nhận được kết quả sau:

Output
This is the main function. Hello, World!

Bởi vì ta đã gọi hàm hello() trong main() và sau đó chỉ gọi hàm main() để chạy nên Hello, World! văn bản chỉ được in một lần, sau chuỗi cho biết ta đang ở trong hàm chính.

Tiếp theo, ta sẽ làm việc với nhiều hàm, vì vậy cần xem lại phạm vi thay đổi của các biến local và toàn cục . Nếu bạn xác định một biến trong một khối hàm, bạn sẽ chỉ có thể sử dụng biến đó trong hàm đó. Nếu bạn muốn sử dụng các biến trên các hàm thì tốt hơn nên khai báo một biến toàn cục.

Trong Python, '__main__' là tên của phạm vi nơi mã cấp cao nhất sẽ thực thi. Khi một chương trình được chạy từ đầu vào chuẩn, tập lệnh hoặc từ dấu nhắc tương tác, __name__ của chương trình được đặt bằng '__main__' .

Do đó, có một quy ước để sử dụng cấu trúc sau:

if __name__ == '__main__':     # Code to run when this is the main program here 

Điều này cho phép các file chương trình được sử dụng:

  • như chương trình chính và chạy những gì sau sự if tuyên bố
  • như một module và không chạy những gì sau sự if tuyên bố.

Bất kỳ mã nào không có trong câu lệnh này sẽ được thực thi khi chạy. Nếu bạn đang sử dụng file chương trình của bạn dưới dạng module , mã không có trong câu lệnh này cũng sẽ thực thi khi nhập trong khi chạy file phụ.

Hãy mở rộng chương trình names.py của ta ở trên và tạo một file mới có tên more_names.py . Trong chương trình này, ta sẽ khai báo một biến toàn cục và sửa đổi hàm names() ban đầu của ta để các lệnh nằm trong hai hàm riêng biệt.

Hàm đầu tiên, has_vowel() sẽ kiểm tra xem chuỗi name có chứa một nguyên âm hay không.

Hàm thứ hai print_letters() sẽ in ra từng ký tự của chuỗi name .

more_names.py
# Declare global variable name for use in all functions name = str(input('Enter your name: '))   # Define function to check if name contains a vowel def has_vowel():     if set('aeiou').intersection(name.lower()):         print('Your name contains a vowel.')     else:         print('Your name does not contain a vowel.')   # Iterate over letters in name string def print_letters():     for letter in name:         print(letter) 

Với cài đặt này, hãy xác định hàm main() sẽ chứa một lệnh gọi đến cả hàm has_vowel()print_letters() .

more_names.py
# Declare global variable name for use in all functions name = str(input('Enter your name: '))   # Define function to check if name contains a vowel def has_vowel():     if set('aeiou').intersection(name.lower()):         print('Your name contains a vowel.')     else:         print('Your name does not contain a vowel.')   # Iterate over letters in name string def print_letters():     for letter in name:         print(letter)   # Define main method that calls other functions def main():     has_vowel()     print_letters() 

Cuối cùng, ta sẽ thêm cấu trúc if __name__ == '__main__': ở cuối file . Đối với mục đích của ta , vì ta đã đặt tất cả các chức năng ta muốn thực hiện trong hàm main() , ta sẽ gọi hàm main() theo sau câu lệnh if này.

more_names.py
# Declare global variable name for use in all functions name = str(input('Enter your name: '))   # Define function to check if name contains a vowel def has_vowel():     if set('aeiou').intersection(name.lower()):         print('Your name contains a vowel.')     else:         print('Your name does not contain a vowel.')   # Iterate over letters in name string def print_letters():     for letter in name:         print(letter)   # Define main method that calls other functions def main():     has_vowel()     print_letters()   # Execute main() function if __name__ == '__main__':     main()  

Bây giờ ta có thể chạy chương trình:

  • python more_names.py

Chương trình sẽ hiển thị kết quả tương tự như chương trình names.py , nhưng ở đây mã được tổ chức hơn và được dùng theo cách module mà không cần sửa đổi.

Nếu bạn không muốn khai báo một hàm main() , bạn có thể kết thúc chương trình như sau:

more_names.py
... if __name__ == '__main__':     has_vowel()     print_letters() 

Sử dụng hàm main() như một hàm và câu lệnh if __name__ == '__main__': có thể tổ chức mã của bạn theo cách hợp lý, làm cho nó dễ đọc hơn và dễ đọc hơn.

Kết luận

Hàm là các khối mã lệnh thực hiện các hành động trong chương trình, giúp làm cho mã của ta có thể tái sử dụng và theo module .

Để tìm hiểu thêm về cách làm cho mã của bạn có nhiều module hơn, bạn có thể đọc hướng dẫn của ta về Cách viết module trong Python 3 .


Tags:

Các tin liên quan

Phân tích và trực quan hóa dữ liệu với pandas và notebook Jupyter bằng Python 3
2017-02-23
Cách vẽ biểu đồ tần suất từ bằng matplotlib với Python 3
2017-02-17
Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10
Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10
Cách cài đặt gói pandas và làm việc với cấu trúc dữ liệu trong Python 3
2017-02-10
Cách viết module trong Python 3
2017-02-03
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên server Ubuntu 16.04
2017-02-01
Cách khai báo module trong Python 3
2017-02-01
Hiểu Tuples trong Python 3
2017-01-19
Cách tạo các vòng lặp trong Python 3
2017-01-12