การปิดล้อมใน Python

การปิดล้อม (closure) หมายถึงฟังก์ชันร่วมกับตัวแปรภายนอกทั้งหมดที่สามารถเข้าถึงได้

ใน Python บ่อยครั้ง เมื่อพูดว่า "การปิดล้อมของฟังก์ชัน" มักไม่ได้หมายถึงตัวฟังก์ชันนั้นเอง แต่หมายถึงตัวแปรภายนอกของมัน

สมมติว่ามีฟังก์ชัน outer ต่อไปนี้ ซึ่งประกาศตัวแปร i และฟังก์ชันภายใน inner ในนั้น จะมีการเพิ่มค่าหนึ่งให้กับ i เพื่อให้ตัวแปร i ทำงานได้อย่างถูกต้อง เราจึงเพิ่มคำสั่ง nonlocal ให้กับมัน:

pythondef outer():
  i = 0
  def inner():
    nonlocal i
    i += 1
    print(i)
  
  return inner

ตอนนี้เรามาใส่ฟังก์ชันภายนอกลงในตัวแปร res และเรียกมันด้วยเครื่องหมายวงเล็บ:

pythonres = outer()
res() # แสดง 1

ลองเรียก res หลายๆ ครั้ง หลังจากรันโค้ดแล้ว เคาน์เตอร์ i จะเพิ่มขึ้นทีละหนึ่งทุกครั้ง:

pythonres() # แสดง 2
res() # แสดง 3
res() # แสดง 4

อย่างไรก็ตาม มีรายละเอียดสำคัญตรงนี้ - การเรียกฟังก์ชัน outer ทุกครั้งจะเพิ่มเคาน์เตอร์ของตัวเอง ลองเขียนการเรียก outer ครั้งแรกลงในตัวแปร res1 และการเรียกครั้งที่สองลงในตัวแปร res2 จากนั้นแสดงผลในคอนโซลตามลำดับ:

pythonres1 = outer()
res1() # แสดง 1
res1() # แสดง 2
res1() # แสดง 3

res2 = outer()
res2() # แสดง 1
res2() # แสดง 2
res2() # แสดง 3
Задание 1

โค้ดต่อไปนี้:

pythondef outer():
  i = 10

  def inner():
    nonlocal i
    i -= 2
    print(i)
  return inner
  
res1 = outer()
res1()
res1()

res2 = outer()
res2()
res2()
res2()

บอกว่าอะไรจะแสดงในคอนโซล

Задание 2

สร้างฟังก์ชันที่ทุกครั้งที่ถูกเรียก จะให้เลขฟีโบนัชชีตัวถัดไป

Задание 3

สร้างฟังก์ชันที่จะให้จำนวนเต็มแบบสุ่มในช่วงหนึ่ง แต่โดยที่ไม่มีค่าซ้ำกันสองครั้งติดต่อกัน