Chuyển đến nội dung chính
Mô-đun 5 · Bài học 2 trong tổng số 418/36 trong khóa học~12 min
Bài học theo mô-đun (2/4)

Thông số mặc định và từ khóa

Tham số hàm có thể có giá trị mặc định: nếu người gọi không vượt qua chúng, các giá trị mặc định sẽ được sử dụng. Bạn cũng có thể gọi một hàm truyền tham số theo tên (đối số từ khóa).

Thông số mặc định

Python
def saluta(nome, saluto="Ciao"):
    return f"{saluto}, {nome}!"

saluta("Ada")              # 'Ciao, Ada!'
saluta("Ada", "Hello")     # 'Hello, Ada!'

Các tham số có giá trị mặc định phải xuất hiện sau những tham số không có:

Python
def f(a, b=1):     # OK
def f(a=1, b):     # SyntaxError

Đối số từ khóa

Bạn có thể truyền đối số theo tên, theo bất kỳ thứ tự nào, giúp cuộc gọi hiệu quả hơn có thể đọc được:

Python
def crea_utente(nome, eta, attivo=True):
    return {"nome": nome, "eta": eta, "attivo": attivo}

crea_utente("Ada", 36)
crea_utente(nome="Ada", eta=36, attivo=False)
crea_utente(eta=36, nome="Ada")     # any order when all are keyword

Quy tắc vàng: trong cuộc gọi, đối số vị trí xuất hiện TRƯỚC đối số từ khóa.

Python
crea_utente("Ada", eta=36)            # OK
crea_utente(nome="Ada", 36)           # SyntaxError

⚠️ Cạm bẫy mặc định có thể thay đổi

KHÔNG BAO GIỜ sử dụng một đối tượng có thể thay đổi (danh sách, lệnh, bộ) làm giá trị mặc định: mặc định được đánh giá MỘT LẦN, khi hàm được xác định và chia sẻ trên tất cả các cuộc gọi.

Python
def aggiungi(elemento, lista=[]):   # BUG!
    lista.append(elemento)
    return lista

aggiungi(1)    # [1]
aggiungi(2)    # [1, 2]    !!! not [2] as you'd expect
aggiungi(3)    # [1, 2, 3]

Mẫu đúng: sử dụng None làm trọng điểm và tạo nó bên trong:

Python
def aggiungi(elemento, lista=None):
    if lista is None:
        lista = []
    lista.append(elemento)
    return lista

Sự nguy hiểm của các đối số mặc định có thể thay đổi

Không bao giờ sử dụng các đối tượng có thể thay đổi (như danh sách hoặc từ điển) làm giá trị mặc định cho tham số: ví dụ: def add(x, my_list=[]). Giá trị mặc định chỉ được đánh giá một lần khi hàm được xác định, nghĩa là các lệnh gọi tiếp theo sẽ chia sẻ cùng một đối tượng có thể thay đổi! Cách tốt nhất là sử dụng None:

Python
def add(x, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(x)
    return my_list

Hãy thử nó

tập thể dục#python.m5.l2.e1
Nỗ lực: 0Đang tải…

Xác định `power(cơ số, số mũ=2)` trả về số mũ cơ số **. Tính `bình phương = lũy thừa(5)` và `khối lập phương = lũy thừa(5, số mũ=3)`. Đánh giá `(hình vuông, hình khối)`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

trả về cơ số ** số mũ

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#python.m5.l2.e2
Nỗ lực: 0Đang tải…

Xác định `create_record(name, value=None)` mà khi giá trị là Không, sẽ sử dụng một danh sách trống mới. Nối 1 vào các giá trị và trả về bản ghi dict {'name': name, 'values': value}. Gọi nó hai lần mà không truyền giá trị và gán cho `a` và `b`. Đánh giá `(a['values'], b['values'])`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng Không có làm mặc định và tạo danh sách bên trong hàm.

Giải pháp khả dụng sau 3 lần thử

Thử thách bổ sung

tập thể dục#python.m5.l2.e3
Nỗ lực: 0Đang tải…

Xác định hàm \`greet(name, message="Hello")\` trả về chuỗi được định dạng \`"{message}, {name}!"\`. Kiểm tra hàm bằng cách gọi \`greet("Bob")\` làm biểu thức cuối cùng.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Sử dụng tham số mặc định message="Hello" và chuỗi f cho lời chào được trả về.

Giải pháp khả dụng sau 3 lần thử