Closure trong Python
Closure (closure) được hiểu là một hàm cùng với tất cả các biến ngoài mà nó có thể truy cập.
Trong Python, thông thường khi nói "closure của một hàm", người ta không ám chỉ chính hàm đó, mà chính là các biến ngoài của nó.
Giả sử chúng ta có hàm outer sau,
trong đó khai báo biến i và
một hàm bên trong inner. Trong hàm này,
i sẽ được cộng thêm một. Để
biến i hoạt động chính xác,
chúng ta thêm lệnh nonlocal vào nó:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
Bây giờ hãy đặt hàm ngoài vào
biến res và gọi nó với
dấu ngoặc tròn:
res = outer()
res() # sẽ in ra 1
Hãy gọi res vài lần.
Sau khi thực thi mã, bộ đếm
i sẽ tăng lên một đơn vị mỗi lần:
res() # sẽ in ra 2
res() # sẽ in ra 3
res() # sẽ in ra 4
Tuy nhiên, có một điểm quan trọng ở đây - mỗi
lần gọi hàm outer sẽ tăng
bộ đếm của riêng nó. Hãy đặt lần gọi thứ nhất của outer
vào biến res1, còn lần gọi thứ hai - vào biến res2. Sau đó
lần lượt in chúng ra console:
res1 = outer()
res1() # sẽ in ra 1
res1() # sẽ in ra 2
res1() # sẽ in ra 3
res2 = outer()
res2() # sẽ in ra 1
res2() # sẽ in ra 2
res2() # sẽ in ra 3
Cho đoạn mã sau:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
Hãy cho biết, cái gì sẽ được in ra console.
Hãy tạo một hàm, mỗi lần gọi hàm đó sẽ trả về số Fibonacci tiếp theo.
Hãy tạo một hàm, nó sẽ trả về một số nguyên ngẫu nhiên trong một khoảng, nhưng sao cho hai lần liên tiếp không giống nhau.