Bài F13. Hàm trong Python

Nội dung lý thuyết

1. Giới thiệu về hàm trong Python

  • Một bài toán có thể được giải bằng cách chia thành các bài toán con đơn giản hơn.

  • Hàm giúp chia chương trình thành các đoạn mã có thể tái sử dụng nhiều lần → giúp chương trình ngắn gọn, dễ hiểu, dễ bảo trì.

Ví dụ 1: Chương trình giải phương trình bậc nhất ax + b = 0 có 2 cách viết:

Cách 1: Viết toàn bộ lệnh trong chương trình chính.

# Nhập a và b
a = float(input("Nhập a: "))
b = float(input("Nhập b: "))

# Giải phương trình ax + b = 0
if a == 0:
    if b == 0:
        print("Phương trình có vô số nghiệm.")
    else:
        print("Phương trình vô nghiệm.")
else:
    x = -b/a
    print(f"Nghiệm x = {x}")

Cách 2: Tách phần giải phương trình thành một hàm tên là giaiPT(a, b)

# Định nghĩa hàm giaiPT(a,b) để giải phương trình ax + b = 0
def giaiPT(a, b):
    if a == 0:
        if b == 0:
            print("Phương trình có vô số nghiệm.")
        else:
            print("Phương trình vô nghiệm.")
    else:
        x = -b/a
        print(f"Nghiệm x = {x}")

# Nhập a và b
a = float(input("Nhập a: "))
b = float(input("Nhập b: "))

# Lời gọi hàm giaiPT()
giaiPT(a, b)

Lợi ích của cách 2:

  • Giúp chương trình rõ ràng, dễ hiểu.

  • Tránh trùng lặp mã lệnh nếu cần giải phương trình nhiều lần.

  • Có thể tái sử dụng hàm trong các bài toán khác.

Ví dụ 2: Tính diện tích hình chữ nhật

  • Hình chữ nhật 1 có độ dài a, b

  • Hình chữ nhật 2 có độ dài c, d

Cách 1: Viết công thức tính diện tích lặp lại nhiều lần.

dienTich1 = a * b  # Tính diện tích hình chữ nhật 1
dienTich2 = c * d  # Tính diện tích hình chữ nhật 2

Cách 2: Viết hàm dienTichChuNhat(x, y) để tính diện tích

# Hàm tính diện tích hình chữ nhật có các độ dài x, y
def dienTichChuNhat(x, y):
    dienTich = x * y
    return dienTich

# Tính diện tích hai hình chữ nhật
dienTich1 = dienTichChuNhat(a, b)
dienTich2 = dienTichChuNhat(c, d)

Ưu điểm:

  • Không phải viết lại công thức nhiều lần.

  • Chương trình ngắn gọn, dễ kiểm soát, dễ chỉnh sửa.

2. Hàm có sẵn và một số hàm trong thư viện chuẩn của Python

Trong lập trình, hàm có sẵn là những hàm được tích hợp sẵn trong ngôn ngữ lập trình, người lập trình có thể sử dụng thông qua lời gọi hàm.

Ví dụ 3: Đoạn lệnh nhập một số nguyên từ bàn phím bằng cách dùng hàm input() kết hợp với hàm int():

z = input("Nhập số nguyên: ")
z = int(z)
  • Các hàm có sẵn được tích hợp trong tệp .py hoặc các thư viện chuẩn như math, random,...

  • Ví dụ: sqrt(x) (căn bậc hai), pow(x, y) (lũy thừa), gcd(m, n) (ước chung lớn nhất) là các hàm trong thư viện math.

Muốn sử dụng các hàm trong thư viện như math, ta dùng lệnh:

  • import math (nạp toàn bộ thư viện)

  • hoặc from math import * (nạp toàn bộ nhưng không cần viết tiền tố math. khi gọi hàm)

Ví dụ 4: Tính ước chung lớn nhất (ƯCLN) của hai số nguyên mn bằng hai cách:

Cách 1: Dùng import math

import math

m = int(input("Nhập số nguyên m: "))
n = int(input("Nhập số nguyên n: "))

ucln = math.gcd(m, n)
print(f"Ước chung lớn nhất của {m} và {n} là {ucln}.")

Cách 2: Dùng from math import *

from math import *

m = int(input("Nhập số nguyên m: "))
n = int(input("Nhập số nguyên n: "))

ucln = gcd(m, n)
print(f"Ước chung lớn nhất của {m} và {n} là {ucln}.")

3. Hàm tự định nghĩa

Trong lập trình, hàm tự định nghĩa là hàm do lập trình viên tự viết để thực hiện một công việc cụ thể.

Cú pháp định nghĩa hàm trong Python:

def <tên_hàm>([<danh_sách_tham_số>]):
    <khối_lệnh>
  • <tên_hàm>: tên của hàm.

  • [<danh_sách_tham_số>]: là danh sách các biến (nếu có) dùng để truyền giá trị vào hàm.

  • <khối_lệnh>: phần thân hàm, chứa các lệnh cần thực hiện.

Nếu không có tham số, ta viết hàm với cặp ngoặc () rỗng.

Cách gọi hàm<tên_hàm>([<danh_sách_đối_số>])

  • Gọi hàm bằng cách sử dụng tên hàm và truyền đối số (giá trị) tương ứng với tham số.

Lưu ý:

  • Số lượng và thứ tự đối số phải khớp với tham số.

  • Hàm có thể có hoặc không có giá trị trả về.

Lệnh trả về (return)return <danh_sách_giá_trị>

  • Trả về một hoặc nhiều giá trị từ hàm về nơi gọi hàm.

Ví dụ 5: Hàm không có return, chỉ in ra kết quả

# Hàm in câu thông báo là xâu s
def inThongBao(s):
    print(f"Câu thông báo: {s}")

loiNgoaiLe = "Ngoại lệ SyntaxError"
inThongBao(loiNgoaiLe)     # Lời gọi hàm

cauTB = "Nhập số nguyên"
inThongBao(cauTB)          # Lời gọi hàm
  • Hàm inThongBao(s) chỉ có nhiệm vụ in ra câu thông báo.

  • Hàm không có return, nên sau khi thực hiện xong lệnh print, hàm kết thúc.

Ví dụ 6: Hàm có return trả về một giá trị

# Hàm tính diện tích hình chữ nhật
def dienTichChuNhat(x, y):
    dienTich = x * y
    return dienTich

dtcn = dienTichChuNhat(2, 3)
  • dienTichChuNhat(x, y) tính và trả về diện tích.

  • Lệnh return dienTich trả kết quả về nơi gọi hàm.

Ví dụ 7: Hàm trả về nhiều giá trị

# Hàm nhập hai hệ số của phương trình bậc nhất
def nhapDuLieu():
    x = float(input("Nhập hệ số thứ nhất: "))
    y = float(input("Nhập hệ số thứ hai: "))
    return x, y

a, b = nhapDuLieu()
print(f"Phương trình {a}x + {b} = 0")
  • Hàm nhapDuLieu() nhập 2 số từ bàn phím và trả về cả hai.

  • Lệnh return x, y trả về hai giá trị, gán cho ab ở nơi gọi hàm.