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ó:

pythondef 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:

pythonres = 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:

pythonres() # 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:

pythonres1 = 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
Задание 1

Cho đoạn mã sau:

pythondef 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.

Задание 2

Hãy tạo một hàm, mỗi lần gọi hàm đó sẽ trả về số Fibonacci tiếp theo.

Задание 3

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.