Chuyển đến nội dung chính

Hàm trong Python: Cách Gọi & Viết Hàm

Khám phá cách viết các hàm Python có thể tái sử dụng và hiệu quả. Nắm vững tham số, câu lệnh return và các chủ đề nâng cao như hàm lambda. Tổ chức mã tốt hơn với main() và các thực hành tốt khác.
Đã cập nhật 18 thg 5, 2026  · 14 phút đọc
biểu ngữ kỹ năng python xây dựng sự nghiệp với datacamp

Hàm là một phần thiết yếu của ngôn ngữ lập trình Python: bạn có thể đã gặp và sử dụng nhiều hàm tuyệt vời được tích hợp sẵn trong ngôn ngữ Python hoặc đi kèm hệ sinh thái thư viện của nó. Tuy nhiên, với vai trò nhà khoa học dữ liệu, bạn sẽ thường xuyên cần tự viết hàm để giải quyết các vấn đề mà dữ liệu đặt ra cho bạn. 

Hướng dẫn này sử dụng cú pháp Python 3. Tất cả ví dụ hoạt động trên Python 3.10+ và đã được cập nhật theo các quy ước hiện đại (f-string, chú thích kiểu, tham số chỉ-vị-trí và chỉ-từ-khóa). Bản phát hành ổn định hiện tại là Python 3.14.

Để tự chạy dễ dàng toàn bộ mã ví dụ trong hướng dẫn này, bạn có thể tạo miễn phí một sổ tay DataLab có cài sẵn Python và chứa tất cả mẫu mã. Để luyện tập thêm viết hàm Python, hãy xem bài tập thực hành này trên DataCamp hoặc thử khóa học Python Data Science Toolbox của chúng tôi!

Hàm trong Python

Bạn dùng hàm trong lập trình để gom nhóm một tập lệnh muốn dùng lặp lại hoặc vì độ phức tạp nên tốt hơn là tự chứa trong một chương trình con và được gọi khi cần. Điều đó có nghĩa một hàm là một đoạn mã được viết để thực hiện một tác vụ xác định. Để thực hiện tác vụ đó, hàm có thể cần hoặc không cần nhiều đầu vào. Khi hoàn tất tác vụ, hàm có thể trả về hoặc không trả về một hay nhiều giá trị.

Có ba loại hàm trong Python:

  • Hàm tích hợp sẵn, như help() để xin trợ giúp, min() để lấy giá trị nhỏ nhất, print() để in một đối tượng ra terminal,… Bạn có thể xem tổng quan nhiều hàm hơn tại đây.

  • Hàm do người dùng định nghĩa (User-Defined Functions - UDF), là các hàm do người dùng tạo để hỗ trợ công việc; Và

  • Hàm ẩn danh, còn gọi là hàm lambda vì chúng không được khai báo với từ khóa chuẩn def.

Hàm so với phương thức

Phương thức là một hàm thuộc về một lớp. Bạn truy cập nó thông qua một thực thể hoặc đối tượng của lớp. Một hàm thì không có ràng buộc này: nó chỉ là một hàm độc lập. Điều này có nghĩa mọi phương thức đều là hàm, nhưng không phải mọi hàm là phương thức.

Xem ví dụ sau, nơi bạn đầu tiên định nghĩa một hàm plus() và sau đó là một lớp Summation với phương thức sum():

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGEgZnVuY3Rpb24gYHBsdXMoKWBcbmRlZiBwbHVzKGEsYik6XG4gIHJldHVybiBhICsgYlxuICBcbiMgQ3JlYXRlIGEgYFN1bW1hdGlvbmAgY2xhc3NcbmNsYXNzIFN1bW1hdGlvbihvYmplY3QpOlxuICBkZWYgc3VtKHNlbGYsIGEsIGIpOlxuICAgIHNlbGYuY29udGVudHMgPSBhICsgYlxuICAgIHJldHVybiBzZWxmLmNvbnRlbnRzICJ9

Nếu bây giờ bạn muốn gọi phương thức sum() thuộc lớp Summation, trước hết bạn cần định nghĩa một thực thể hoặc đối tượng của lớp đó. Vậy hãy định nghĩa một đối tượng như vậy:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIHBsdXMoYSxiKTpcbiAgcmV0dXJuIGEgKyBiXG4gIFxuY2xhc3MgU3VtbWF0aW9uKG9iamVjdCk6XG4gIGRlZiBzdW0oc2VsZiwgYSwgYik6XG4gICAgc2VsZi5jb250ZW50cyA9IGEgKyBiXG4gICAgcmV0dXJuIHNlbGYuY29udGVudHMgIiwic2FtcGxlIjoiIyBJbnN0YW50aWF0ZSBgU3VtbWF0aW9uYCBjbGFzcyB0byBjYWxsIGBzdW0oKWBcbnN1bUluc3RhbmNlID0gU3VtbWF0aW9uKClcbnN1bUluc3RhbmNlLnN1bSgxLDIpIn0=

Hãy nhớ rằng việc khởi tạo này không cần thiết khi bạn muốn gọi hàm plus()! Bạn có thể thực thi plus(1,2) trong khối mã DataCamp Light mà không gặp vấn đề gì!

Tham số so với đối số

Tham số là các tên được dùng khi định nghĩa một hàm hoặc phương thức, và là nơi đối số sẽ được ánh xạ vào. Nói cách khác, đối số là những giá trị được truyền cho bất kỳ lần gọi hàm hoặc phương thức nào, trong khi mã của hàm hoặc phương thức tham chiếu các đối số đó bằng tên tham số của chúng.

Xem ví dụ sau và nhìn lại khối DataCamp Light ở trên: bạn truyền hai đối số cho phương thức sum() của lớp Summation, dù trước đó bạn đã định nghĩa ba tham số, cụ thể là self, ab.

Điều gì đã xảy ra với self?

Đối số đầu tiên của mọi phương thức lớp luôn là tham chiếu đến thực thể hiện tại của lớp, trong trường hợp này là Summation. Theo quy ước, đối số này được gọi là self.

Điều này có nghĩa bạn không truyền tham chiếu tới self trong trường hợp này vì self là tên tham số cho một đối số được truyền ngầm, tham chiếu tới thực thể thông qua đó phương thức được gọi. Nó được chèn ngầm vào danh sách đối số.

Cách định nghĩa hàm: Hàm do người dùng định nghĩa (UDF)

Bốn bước để định nghĩa một hàm trong Python như sau:

  1. Dùng từ khóa def để khai báo hàm và theo sau là tên hàm.

  2. Thêm tham số cho hàm: chúng nên nằm trong dấu ngoặc đơn của hàm. Kết thúc dòng bằng dấu hai chấm.

  3. Thêm các câu lệnh mà hàm cần thực thi.

  4. Kết thúc hàm bằng câu lệnh return nếu hàm cần xuất ra thứ gì đó. Nếu không có câu lệnh return, hàm của bạn sẽ trả về đối tượng None.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBoZWxsbygpOlxuICBwcmludChcIkhlbGxvIFdvcmxkXCIpIFxuICByZXR1cm4gIn0=

Tất nhiên, các hàm của bạn sẽ trở nên phức tạp hơn khi bạn tiến xa hơn: bạn có thể thêm vòng lặp for, điều khiển luồng,… và nhiều thứ khác để tinh chỉnh hơn:

def hello():
    name = input("Enter your name: ")
    if name:
        print(f"Hello {name}")
    else:
        print("Hello World")

hello()

Trong hàm trên, bạn yêu cầu người dùng nhập tên. Nếu không nhập tên, hàm sẽ in ra “Hello World”. Ngược lại, người dùng sẽ nhận được lời chào “Hello” được cá nhân hóa.

Hãy nhớ rằng bạn cũng có thể định nghĩa một hoặc nhiều tham số cho UDF của mình. Bạn sẽ học thêm về điều này khi tới phần Đối số của Hàm. Ngoài ra, bạn có thể trả về hoặc không trả về một hay nhiều giá trị từ hàm của mình.

Câu lệnh return

Lưu ý rằng vì bạn đang in ra nội dung trong UDF hello(), bạn không thật sự cần trả về nó. Sẽ không có khác biệt nào giữa hàm ở trên và hàm sau:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBoZWxsb19ub3JldHVybigpOlxuICBwcmludChcIkhlbGxvIFdvcmxkXCIpICJ9

Tuy nhiên, nếu bạn muốn tiếp tục làm việc với kết quả của hàm và thử một số phép toán trên đó, bạn sẽ cần dùng câu lệnh return để thật sự trả về một giá trị, như String, số nguyên,… Hãy xem kịch bản sau, nơi hello() trả về một String "hello", trong khi hàm hello_noreturn() trả về None:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBoZWxsbygpOlxuICBwcmludChcIkhlbGxvIFdvcmxkXCIpIFxuICByZXR1cm4oXCJoZWxsb1wiKVxuXG5kZWYgaGVsbG9fbm9yZXR1cm4oKTpcbiAgcHJpbnQoXCJIZWxsbyBXb3JsZFwiKVxuICBcbiMgTXVsdGlwbHkgdGhlIG91dHB1dCBvZiBgaGVsbG8oKWAgd2l0aCAyIFxuaGVsbG8oKSAqIDJcblxuIyAoVHJ5IHRvKSBtdWx0aXBseSB0aGUgb3V0cHV0IG9mIGBoZWxsb19ub3JldHVybigpYCB3aXRoIDIgXG5oZWxsb19ub3JldHVybigpICogMiJ9

Hàm thứ hai sinh lỗi vì bạn không thể thực hiện phép toán với None. Bạn sẽ nhận TypeError nói rằng bạn không thể thực hiện phép nhân cho NoneType (giá trị None là kết quả của hello_noreturn()) và int (2).

Mẹo hàm sẽ thoát ngay khi gặp câu lệnh return, ngay cả khi điều đó có nghĩa là chúng sẽ không trả về giá trị nào:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRlZiBydW4oKTpcbiAgZm9yIHggaW4gcmFuZ2UoMTApOlxuICAgICBpZiB4ID09IDI6XG4gICAgICAgcmV0dXJuXG4gIHByaW50KFwiUnVuIVwiKVxuICBcbnJ1bigpIn0=

Một điều nữa đáng nhắc đến khi bạn làm việc với câu lệnh return là bạn có thể dùng nó để trả về nhiều giá trị. Để làm điều này, bạn dùng tuple.

Hãy nhớ cấu trúc dữ liệu này rất giống với list: nó có thể chứa nhiều giá trị. Tuy nhiên, tuple là bất biến, nghĩa là bạn không thể sửa đổi bất kỳ giá trị nào được lưu trong đó! Bạn tạo nó với cặp ngoặc đơn (). Bạn có thể giải nén tuple vào nhiều biến với dấu phẩy và toán tử gán.

Xem ví dụ sau để hiểu cách hàm của bạn có thể trả về nhiều giá trị:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgXG5kZWYgcGx1cyhhLGIpOlxuICBzdW0gPSBhICsgYlxuICByZXR1cm4gKHN1bSwgYSlcblxuIyBDYWxsIGBwbHVzKClgIGFuZCB1bnBhY2sgdmFyaWFibGVzIFxuc3VtLCBhID0gcGx1cygzLDQpXG5cbiMgUHJpbnQgYHN1bSgpYFxucHJpbnQoc3VtKSJ9

Lưu ý rằng câu lệnh return return sum, a sẽ cho cùng kết quả với return (sum, a): dạng đầu thực chất đóng gói suma vào một tuple phía sau hậu trường!

Cách gọi hàm

Ở các phần trước, bạn đã thấy nhiều ví dụ về cách gọi hàm. Gọi hàm nghĩa là bạn thực thi hàm đã định nghĩa - hoặc trực tiếp từ prompt Python hoặc thông qua một hàm khác (như bạn sẽ thấy trong phần “Hàm lồng nhau”).

Gọi hàm hello() bạn vừa định nghĩa đơn giản bằng cách thực thi hello(), giống như trong khối DataCamp Light dưới đây:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIGhlbGxvKCk6XG4gIHByaW50KFwiSGVsbG8gV29ybGRcIikgXG4gIHJldHVybiAiLCJzYW1wbGUiOiJoZWxsbygpIn0=

Cách thêm docstring cho hàm Python

Một khía cạnh thiết yếu khác khi viết hàm trong Python: docstring. Docstring mô tả hàm của bạn làm gì, như các phép tính mà nó thực hiện hoặc giá trị trả về. Những mô tả này đóng vai trò là tài liệu cho hàm để bất kỳ ai đọc docstring của hàm đều hiểu hàm làm gì, mà không phải lần theo toàn bộ mã trong phần định nghĩa hàm.

Docstring của hàm được đặt ngay dòng sau phần đầu hàm và nằm giữa ba dấu nháy kép. Một Docstring phù hợp cho hàm hello() của bạn là ‘In ra “Hello World”’.

def hello() -> None:
    """Prints "Hello World"."""
    print("Hello World")

Lưu ý rằng docstring có thể dài hơn ví dụ được đưa ra ở đây. Nếu bạn muốn tìm hiểu chi tiết hơn về docstring, tốt nhất hãy xem một số kho Github của các thư viện Python như scikit-learn hoặc pandas, nơi bạn sẽ tìm thấy rất nhiều ví dụ!

Chú thích kiểu (type hints)

Gần gũi với docstring — và gần như phổ biến trong mã Python hiện đại — là chú thích kiểu. Từ Python 3.5, bạn có thể chú thích kiểu cho tham số của hàm và giá trị trả về theo kiểu mong đợi. Đây là ví dụ đơn giản nhất:

def plus(a: int, b: int) -> int:
    return a + b

Phần : int sau mỗi tham số có nghĩa “giá trị này nên là số nguyên”, và phần -> int sau dấu ngoặc đơn có nghĩa “hàm này trả về một số nguyên”. Bản thân Python không cưỡng chế các chú thích này khi chạy — bạn vẫn có thể truyền một chuỗi vào plus() và Python sẽ không phàn nàn cho tới khi có lỗi. Nhưng các công cụ như mypy, pyright và trình kiểm tra kiểu tích hợp trong các trình soạn thảo như VS Code và PyCharm dùng các gợi ý này để phát hiện lỗi trước khi bạn chạy mã.

Với các kiểu phức tạp hơn, bạn có thể dùng generics dựng sẵn trực tiếp (Python 3.9+) hoặc import từ mô-đun typing:

def greet(names: list[str]) -> None:
    for name in names:
        print(f"Hello {name}")

def find_user(user_id: int) -> dict | None:
    # returns the user dict, or None if not found
    ...
Chú thích kiểu là tùy chọn, nhưng được xem là thực hành tốt cho bất kỳ hàm nào bạn dự định tái sử dụng, chia sẻ, hoặc quay lại sau vài tháng. Chúng hoạt động như tài liệu có thể máy kiểm tra — IDE của bạn sẽ tự hoàn thành dựa trên đó, bắt lỗi gõ và cảnh báo khi bạn truyền sai kiểu.

Đối số của hàm trong Python

Trước đó, bạn đã học về sự khác nhau giữa tham số và đối số. Tóm lại, đối số là những giá trị được truyền cho bất kỳ lần gọi hàm hoặc phương thức nào, trong khi mã của hàm hoặc phương thức tham chiếu các đối số đó bằng tên tham số. Có bốn loại đối số mà UDF trong Python có thể nhận:

  • Đối số mặc định
  • Đối số bắt buộc
  • Đối số từ khóa
  • Số lượng đối số biến thiên

Đối số mặc định

Đối số mặc định là những đối số nhận giá trị mặc định nếu không truyền giá trị trong lúc gọi hàm. Bạn có thể gán giá trị mặc định này với toán tử gán =, giống ví dụ sau:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uXG5kZWYgcGx1cyhhLGIgPSAyKTpcbiAgcmV0dXJuIGEgKyBiXG4gIFxuIyBDYWxsIGBwbHVzKClgIHdpdGggb25seSBgYWAgcGFyYW1ldGVyXG5wbHVzKGE9MSlcblxuIyBDYWxsIGBwbHVzKClgIHdpdGggYGFgIGFuZCBgYmAgcGFyYW1ldGVyc1xucGx1cyhhPTEsIGI9MykifQ==

Đối số bắt buộc

Đúng như tên gọi, đối số bắt buộc của UDF là những đối số phải có. Những đối số này cần được truyền trong lúc gọi hàm và theo đúng thứ tự, như trong ví dụ sau:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIHdpdGggcmVxdWlyZWQgYXJndW1lbnRzXG5kZWYgcGx1cyhhLGIpOlxuICByZXR1cm4gYSArIGIifQ==

Bạn cần các đối số ánh xạ tới tham số a cũng như b để gọi hàm mà không gặp lỗi. Nếu bạn hoán đổi ab, kết quả có thể không khác, nhưng sẽ khác nếu bạn đổi plus() thành như sau:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIHdpdGggcmVxdWlyZWQgYXJndW1lbnRzXG5kZWYgcGx1cyhhLGIpOlxuICByZXR1cm4gYS9iIn0=

Đối số từ khóa

Nếu bạn muốn đảm bảo gọi đúng thứ tự các tham số, bạn có thể dùng đối số từ khóa trong lời gọi hàm. Bạn dùng chúng để xác định đối số theo tên tham số. Hãy lấy ví dụ ở trên để rõ hơn:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uXG5kZWYgcGx1cyhhLGIpOlxuICByZXR1cm4gYSArIGJcbiAgXG4jIENhbGwgYHBsdXMoKWAgZnVuY3Rpb24gd2l0aCBwYXJhbWV0ZXJzIFxucGx1cygyLDMpXG5cbiMgQ2FsbCBgcGx1cygpYCBmdW5jdGlvbiB3aXRoIGtleXdvcmQgYXJndW1lbnRzXG5wbHVzKGE9MSwgYj0yKSJ9

Lưu ý rằng bằng cách dùng đối số từ khóa, bạn cũng có thể hoán đổi thứ tự tham số và vẫn nhận cùng kết quả khi thực thi hàm:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uXG5kZWYgcGx1cyhhLGIpOlxuICByZXR1cm4gYSArIGJcbiAgXG4jIENhbGwgYHBsdXMoKWAgZnVuY3Rpb24gd2l0aCBrZXl3b3JkIGFyZ3VtZW50c1xucGx1cyhiPTIsIGE9MSkifQ==

Số lượng đối số biến thiên

Trong trường hợp bạn không biết chính xác số lượng đối số muốn truyền cho một hàm, bạn có thể dùng cú pháp sau với *args:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgRGVmaW5lIGBwbHVzKClgIGZ1bmN0aW9uIHRvIGFjY2VwdCBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHNcbmRlZiBwbHVzKCphcmdzKTpcbiAgcmV0dXJuIHN1bShhcmdzKVxuXG4jIENhbGN1bGF0ZSB0aGUgc3VtXG5wbHVzKDEsNCw1KSJ9

Dấu hoa thị (*) được đặt trước tên biến giữ các giá trị của tất cả đối số biến không phải từ khóa. Lưu ý ở đây rằng bạn cũng có thể truyền *varint, *var_int_args hoặc bất kỳ tên nào khác vào hàm plus().

Mẹo: thử thay *args bằng một tên khác có kèm dấu hoa thị. Bạn sẽ thấy đoạn mã trên vẫn hoạt động!

Bạn thấy hàm trên dùng hàm tích hợp sẵn sum() của Python để cộng tất cả đối số được truyền vào plus(). 

Biến toàn cục so với biến cục bộ

Nhìn chung, các biến được định nghĩa bên trong thân hàm có phạm vi cục bộ, và những biến được định nghĩa bên ngoài có phạm vi toàn cục. Điều đó nghĩa là biến cục bộ được định nghĩa trong khối hàm và chỉ truy cập được bên trong hàm đó, trong khi biến toàn cục có thể được truy cập bởi mọi hàm trong script của bạn:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgR2xvYmFsIHZhcmlhYmxlIGBpbml0YFxuaW5pdCA9IDFcblxuIyBEZWZpbmUgYHBsdXMoKWAgZnVuY3Rpb24gdG8gYWNjZXB0IGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50c1xuZGVmIHBsdXMoKmFyZ3MpOlxuICAjIExvY2FsIHZhcmlhYmxlIGBzdW0oKWBcbiAgdG90YWwgPSAwXG4gIGZvciBpIG4gYXJnczoXG4gICAgdG90YWwgKz0gaVxuICByZXR1cm4gdG90YWxcbiAgXG4jIEFjY2VzcyB0aGUgZ2xvYmFsIHZhcmlhYmxlXG5wcmludChcInRoaXMgaXMgdGhlIGluaXRpYWxpemVkIHZhbHVlIFwiICsgc3RyKGluaXQpKVxuXG4jIChUcnkgdG8pIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVcbnByaW50KFwidGhpcyBpcyB0aGUgc3VtIFwiICsgc3RyKHRvdGFsKSkifQ==

Bạn sẽ thấy mình nhận NameError nói rằng name 'total' is not defined khi bạn cố in ra biến cục bộ total được định nghĩa bên trong thân hàm. Biến init, ngược lại, có thể in ra mà không có vấn đề gì.

Tham số chỉ-vị-trí và chỉ-từ-khóa

Kể từ Python 3.8, bạn có thể kiểm soát nhiều hơn cách đối số phải được truyền bằng cách dùng hai ký hiệu đặc biệt trong chữ ký hàm: / và *. Bất cứ thứ gì trước / chỉ có thể được truyền theo vị trí; bất cứ thứ gì sau * chỉ có thể được truyền bằng từ khóa.

def greet(name, /, greeting="Hello", *, punctuation="!"):
    print(f"{greeting} {name}{punctuation}")

 Đây là cách điều đó thể hiện ở nơi gọi:

greet("Alice")                          # hoạt động
greet("Alice", greeting="Hi")           # hoạt động
greet("Alice", "Hi", punctuation="?")   # hoạt động

greet(name="Alice")                     # TypeError: name là tham số chỉ-vị-trí
greet("Alice", "Hi", "?")               # TypeError: punctuation là tham số chỉ-từ-khóa

Tại sao bạn muốn điều này? Hai lý do chính.

Tham số chỉ-vị-trí cho phép bạn đổi tên chúng về sau mà không làm hỏng mã của ai — vì không ai được phép dùng tên tham số như một từ khóa, bạn có thể tự do thay đổi nó.

Tham số chỉ-từ-khóa buộc người gọi phải rõ ràng về những gì họ truyền vào, giúp lời gọi dễ đọc hơn khi bạn có nhiều cờ hoặc thiết lập tùy chọn.

Tóm lại, đây là cách gọn gàng để thể hiện và cưỡng chế ý định.

Hàm ẩn danh trong Python

Hàm ẩn danh còn được gọi là hàm lambda trong Python vì thay vì khai báo chúng với từ khóa chuẩn def, bạn dùng từ khóa lambda.

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImRvdWJsZSA9IGxhbWJkYSB4OiB4KjJcblxuZG91YmxlKDUpIn0=

Trong khối DataCamp Light ở trên, lambda x: x*2 là hàm ẩn danh hay hàm lambda. x là đối số, và x*2 là biểu thức hay chỉ dẫn được đánh giá và trả về. Điểm đặc biệt của hàm này là nó không có tên, khác với các ví dụ bạn thấy ở phần đầu của hướng dẫn về hàm này. Nếu bạn phải viết hàm trên dưới dạng UDF, kết quả sẽ như sau:

def double(x):
  return x*2

Hãy xét một ví dụ khác về hàm lambda nơi bạn làm việc với hai đối số:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6IiMgYHN1bSgpYCBsYW1iZGEgZnVuY3Rpb25cbnN1bSA9IGxhbWJkYSB4LCB5OiB4ICsgeTtcblxuIyBDYWxsIHRoZSBgc3VtKClgIGFub255bW91cyBmdW5jdGlvblxuc3VtKDQsNSlcblxuIyBcIlRyYW5zbGF0ZVwiIHRvIGEgVURGXG5kZWYgc3VtKHgsIHkpOlxuICByZXR1cm4geCt5In0=

Bạn dùng hàm ẩn danh khi cần một hàm không tên trong thời gian ngắn và được tạo tại thời điểm chạy. Bối cảnh cụ thể mà điều này phù hợp là khi bạn làm việc với filter(), map()reduce():

eyJsYW5ndWFnZSI6InB5dGhvbiIsInNhbXBsZSI6ImZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2VcblxubXlfbGlzdCA9IFsxLDIsMyw0LDUsNiw3LDgsOSwxMF1cblxuIyBVc2UgbGFtYmRhIGZ1bmN0aW9uIHdpdGggYGZpbHRlcigpYFxuZmlsdGVyZWRfbGlzdCA9IGxpc3QoZmlsdGVyKGxhbWJkYSB4OiAoeCoyID4gMTApLCBteV9saXN0KSlcblxuIyBVc2UgbGFtYmRhIGZ1bmN0aW9uIHdpdGggYG1hcCgpYFxubWFwcGVkX2xpc3QgPSBsaXN0KG1hcChsYW1iZGEgeDogeCoyLCBteV9saXN0KSlcblxuIyBVc2UgbGFtYmRhIGZ1bmN0aW9uIHdpdGggYHJlZHVjZSgpYFxucmVkdWNlZF9saXN0ID0gcmVkdWNlKGxhbWJkYSB4LCB5OiB4K3ksIG15X2xpc3QpXG5cbnByaW50KGZpbHRlcmVkX2xpc3QpXG5wcmludChtYXBwZWRfbGlzdClcbnByaW50KHJlZHVjZWRfbGlzdCkifQ==

Hàm filter() lọc, như tên gọi, danh sách đầu vào gốc my_list dựa trên tiêu chí >10. Còn với map(), bạn áp dụng một hàm cho tất cả phần tử của danh sách my_list. Ở đây, bạn nhân tất cả phần tử với 2.

Lưu ý rằng hàm reduce() là một phần của thư viện functools. Bạn dùng hàm này một cách tích lũy trên các phần tử của danh sách my_list, từ trái sang phải và rút gọn dãy về một giá trị duy nhất, 55 trong trường hợp này.

Dùng main() như một hàm trong Python

Nếu bạn có kinh nghiệm với các ngôn ngữ lập trình khác như Java, bạn sẽ biết rằng hàm main là bắt buộc để thực thi các hàm. Như bạn đã thấy trong các ví dụ trên, điều này không nhất thiết cần trong Python. Tuy vậy, việc đưa một hàm main() vào chương trình Python của bạn có thể hữu ích để cấu trúc mã một cách hợp lý - tất cả thành phần quan trọng nhất được chứa trong hàm main() này.

Bạn có thể dễ dàng định nghĩa một hàm main() và gọi nó giống như bạn đã làm với các hàm khác ở trên:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIGhlbGxvKCk6XG4gIHByaW50KFwiSGVsbG8gV29ybGRcIikgXG4gIHJldHVybiAiLCJzYW1wbGUiOiIjIERlZmluZSBgbWFpbigpYCBmdW5jdGlvblxuZGVmIG1haW4oKTpcbiAgaGVsbG8oKVxuICBwcmludChcIlRoaXMgaXMgYSBtYWluIGZ1bmN0aW9uXCIpXG5cbm1haW4oKSJ9

Tuy nhiên, như hiện tại, mã trong hàm main() của bạn sẽ được gọi khi bạn import tệp như một mô-đun. Để đảm bảo điều này không xảy ra, bạn chỉ gọi hàm main() khi __name__ == '__main__'.

Điều đó có nghĩa mã trong khối mã trên trở thành:

eyJsYW5ndWFnZSI6InB5dGhvbiIsInByZV9leGVyY2lzZV9jb2RlIjoiZGVmIGhlbGxvKCk6XG4gIHByaW50KFwiSGVsbG8gV29ybGRcIikgXG4gIHJldHVybiAiLCJzYW1wbGUiOiIjIERlZmluZSBgbWFpbigpYCBmdW5jdGlvblxuZGVmIG1haW4oKTpcbiAgaGVsbG8oKVxuICBwcmludChcIlRoaXMgaXMgYSBtYWluIGZ1bmN0aW9uXCIpXG4gIFxuIyBFeGVjdXRlIGBtYWluKClgIGZ1bmN0aW9uIFxuaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzpcbiAgICBtYWluKCkifQ==

Lưu ý rằng ngoài hàm __main__, bạn cũng có hàm __init__ để khởi tạo một thực thể của lớp hoặc một đối tượng. Nói ngắn gọn, nó hoạt động như một constructor hay initializer và tự động được gọi khi bạn tạo thực thể mới của một lớp. Với hàm đó, đối tượng mới tạo được gán cho tham số self, như bạn đã thấy trước đó trong hướng dẫn này. Xem ví dụ sau:

class Dog:
    """A simple Dog class.

    Args:
        legs: Number of legs so that the dog can walk.
        color: The color of the fur.
    """

    def __init__(self, legs: int, color: str) -> None:
        self.legs = legs
        self.color = color

    def bark(self) -> str:
        return "bark" * 2

if __name__ == "__main__":
    dog = Dog(4, "brown")
    print(dog.bark())

Tiếp tục luyện tập về hàm Python

Chúc mừng! Bạn đã hoàn thành hướng dẫn ngắn về hàm trong Python. Nếu bạn muốn ôn lại các nội dung Python cơ bản khác, đừng bỏ lỡ Data Types for Data Science, một khóa học nơi bạn sẽ củng cố và luyện tập kiến thức về list, dictionary, tuple, setngày giờ.

Câu hỏi thường gặp về hàm Python

Hàm trong Python là gì?

Một hàm là khối mã có thể tái sử dụng thực hiện một tác vụ cụ thể. Nó có thể nhận đầu vào, xử lý chúng và trả về đầu ra.

Bạn định nghĩa một hàm trong Python như thế nào?

Để định nghĩa hàm trong Python, dùng từ khóa def, đặt tên hàm, thêm tham số tùy chọn trong dấu ngoặc, viết mã và tùy chọn return một giá trị.

Sự khác nhau giữa hàm và phương thức trong Python là gì?

Hàm là độc lập, còn phương thức thuộc về lớp. Mọi phương thức đều là hàm, nhưng không phải mọi hàm là phương thức.

Có những loại hàm nào trong Python?

Python có hàm tích hợp sẵn (như print()), hàm do người dùng định nghĩa (bạn tự tạo), và hàm ẩn danh (hàm lambda ngắn gọn, dùng nhanh).

Sự khác nhau giữa tham số và đối số là gì?

Tham số là chỗ giữ chỗ trong định nghĩa hàm, còn đối số là các giá trị thực tế bạn truyền khi gọi hàm.

Hàm lambda là gì?

Hàm lambda là hàm một dòng, không tên dùng cho các tác vụ nhanh.

Tại sao nên dùng hàm __main__?

Hàm __main__ giúp mã của bạn có tổ chức và đảm bảo các phần cụ thể chỉ chạy khi script được thực thi trực tiếp, không phải khi được import.

Khác biệt giữa biến toàn cục và biến cục bộ là gì?

Biến toàn cục dùng được ở mọi nơi, trong khi biến cục bộ chỉ tồn tại bên trong hàm của nó.

Chủ đề

Tìm hiểu thêm về Python

Courses

Nhập môn Python

4 giờ
6.8M
Nắm vững phân tích dữ liệu với Python chỉ trong 4 giờ. Khóa học online này giúp bạn làm quen với giao diện Python và các thư viện phổ biến.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow
Có liên quan

blogs

Claude Opus 4.6: Tính năng, điểm chuẩn, các bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu bảng xếp hạng về mã hóa theo hướng tác nhân và suy luận phức tạp. Thêm nữa, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem thêmXem thêm