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
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ó:
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:
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 keywordQuy tắc vàng: trong cuộc gọi, đối số vị trí xuất hiện TRƯỚC đối số từ khóa.
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.
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:
def aggiungi(elemento, lista=None):
if lista is None:
lista = []
lista.append(elemento)
return listaSự 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:
def add(x, my_list=None):
if my_list is None:
my_list = []
my_list.append(x)
return my_listHãy thử nó
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)`.
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
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'])`.
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
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.
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ử