2.14. Định nghĩa hàm¶
Một hàm đóng gói một khối mã dưới một cái tên để có thể được gọi từ nhiều nơi. Bất cứ khi nào một phép tính, hành động, hoặc một đoạn công việc cụ thể xuất hiện nhiều hơn một lần, hàm biến nó thành một thứ duy nhất có tên.
Từ khóa là def:
def greet(name):
print("hello,", name)
greet("Alice")
greet("Bob")
Kết quả:
hello, Alice
hello, Bob
Dòng bắt đầu bằng def là định nghĩa -- nó tạo ra hàm nhưng không chạy phần thân. Việc gọi greet("Alice") mới là thứ chạy khối lệnh được thụt vào.
2.14.1. Tham số và đối số¶
Các tên trong dấu ngoặc đơn trên dòng def là tham số -- các chỗ giữ chỗ cho các giá trị mà người gọi sẽ cung cấp. Các giá trị thực tế được truyền vào là đối số. Một hàm có thể nhận không hoặc nhiều tham số:
def square(x):
return x * x
def add(a, b):
return a + b
def is_even(n):
return n % 2 == 0
Một lời gọi với số lượng đối số sai sẽ ném ra TypeError ngay lập tức.
2.14.2. return¶
Câu lệnh return kết thúc hàm ngay lập tức và trả về một giá trị cho người gọi:
def absolute(x):
if x < 0:
return -x
return x
Một hàm không bao giờ đến câu lệnh return (hoặc có return trống không có giá trị) sẽ trả về None:
>>> def shout(text):
... print(text.upper())
...
>>> result = shout("hi")
HI
>>> print(result)
None
Một hàm có thể có nhiều câu lệnh return; câu lệnh đầu tiên được đến sẽ thắng, và phần còn lại của thân hàm bị bỏ qua.
2.14.2.1. Trả về nhiều giá trị¶
Python trả về một đối tượng cho mỗi lời gọi, nhưng đối tượng đó có thể là một tuple -- và người gọi có thể giải nén nó ngay trên chỗ:
def minmax(values):
return (min(values), max(values))
lo, hi = minmax([3, 1, 4, 1, 5, 9])
Dấu ngoặc đơn xung quanh giá trị trả về là tùy chọn; return a, b và return (a, b) là như nhau.
2.14.3. Docstring¶
Một chuỗi ký tự được đặt là câu lệnh đầu tiên của phần thân hàm là một docstring. Nó được lưu trữ trên đối tượng hàm và là những gì help() hiển thị:
def scale(value, factor):
"""Multiply ``value`` by ``factor`` and return the result."""
return value * factor
IDE hiển thị docstring trong tooltip khi con trỏ di chuột qua tên hàm, vì vậy ngay cả một dòng tóm tắt ngắn cũng đáng công viết. Chuỗi có dấu ba nháy cho phép docstring trải dài nhiều dòng khi cần thêm chi tiết.
2.14.4. Quy ước đặt tên¶
Tên hàm dùng snake_case -- các từ chữ thường được phân cách bằng dấu gạch dưới. Tên nên mô tả chức năng của hàm:
Tốt:
read_temperature,parse_header,is_valid.Tránh:
do_stuff,handle1,temp_func.
Dấu gạch dưới đứng đầu (_helper) đánh dấu một hàm là nội bộ của mô-đun. Quy ước này được tôn trọng rộng rãi nhưng không được Python thực thi.