การปิดล้อมใน Python
การปิดล้อม (closure) หมายถึงฟังก์ชันร่วมกับตัวแปรภายนอกทั้งหมดที่สามารถเข้าถึงได้
ใน Python บ่อยครั้ง เมื่อพูดว่า "การปิดล้อมของฟังก์ชัน" มักไม่ได้หมายถึงตัวฟังก์ชันนั้นเอง แต่หมายถึงตัวแปรภายนอกของมัน
สมมติว่ามีฟังก์ชัน outer ต่อไปนี้ ซึ่งประกาศตัวแปร i และฟังก์ชันภายใน inner ในนั้น จะมีการเพิ่มค่าหนึ่งให้กับ i เพื่อให้ตัวแปร i ทำงานได้อย่างถูกต้อง เราจึงเพิ่มคำสั่ง nonlocal ให้กับมัน:
def outer():
i = 0
def inner():
nonlocal i
i += 1
print(i)
return inner
ตอนนี้เรามาใส่ฟังก์ชันภายนอกลงในตัวแปร res และเรียกมันด้วยเครื่องหมายวงเล็บ:
res = outer()
res() # แสดง 1
ลองเรียก res หลายๆ ครั้ง หลังจากรันโค้ดแล้ว เคาน์เตอร์ i จะเพิ่มขึ้นทีละหนึ่งทุกครั้ง:
res() # แสดง 2
res() # แสดง 3
res() # แสดง 4
อย่างไรก็ตาม มีรายละเอียดสำคัญตรงนี้ - การเรียกฟังก์ชัน outer ทุกครั้งจะเพิ่มเคาน์เตอร์ของตัวเอง ลองเขียนการเรียก outer ครั้งแรกลงในตัวแปร res1 และการเรียกครั้งที่สองลงในตัวแปร res2 จากนั้นแสดงผลในคอนโซลตามลำดับ:
res1 = outer()
res1() # แสดง 1
res1() # แสดง 2
res1() # แสดง 3
res2 = outer()
res2() # แสดง 1
res2() # แสดง 2
res2() # แสดง 3
โค้ดต่อไปนี้:
def outer():
i = 10
def inner():
nonlocal i
i -= 2
print(i)
return inner
res1 = outer()
res1()
res1()
res2 = outer()
res2()
res2()
res2()
บอกว่าอะไรจะแสดงในคอนโซล
สร้างฟังก์ชันที่ทุกครั้งที่ถูกเรียก จะให้เลขฟีโบนัชชีตัวถัดไป
สร้างฟังก์ชันที่จะให้จำนวนเต็มแบบสุ่มในช่วงหนึ่ง แต่โดยที่ไม่มีค่าซ้ำกันสองครั้งติดต่อกัน