=
ตัวแปรที่มารับจะกลายเป็นฟังก์ชันซึ่งใช้งานได้เหมือนกับฟังก์ชันที่นิยามตอนแรก
def fuji():
print('ฟังก์ชันถูกใช้งาน')
fun = fuji
fun()
พิมพ์ = print
พิมพ์('ข้อความ')
แทน print('ข้อความ')
ได้
พิมพ์('ทดสอบใช้พิมพ์') # ได้ ทดสอบใช้พิมพ์
print
ตัวแปรที่รับค่ามาดูก็จะยังพบว่ามันขึ้นชื่อว่าเป็นฟังก์ชันตัวเดิมอยู่
พิมพ์(พิมพ์) # ได้
พิมพ์(fun) # ได้
พิมพ์(พิมพ์.__name__) # ได้ print
def fujiA():
print('A')
def fujiB():
print('B')
fujiAB = (fujiA,fujiB)
()
fujiAB[0]() # ได้ A
fujiAB[1]() # ได้ B
for
ได้
[f() for f in fujiAB]
list(map(lambda f:f(),fujiAB))
fuji = 1
fuji() # ได้ TypeError: 'int' object is not callable
print = 'print'
print
ก็จะไม่สามารถใช้การได้อีกต่อไป กลายเป็นแค่ตัวแปรสายอักขระคำว่า 'print'
ไป
print(print) # ได้ TypeError: 'str' object is not callable
print
กลับมาใช้ได้เหมือนเดิมก็ต้องทำการปิดเชลโต้ตอบแล้วเปิดอันใหม่ ตัวแปรทั้งหมดที่ประกาศไว้จะถูกล้างทิ้งแล้วกลับสู่สภาพเริ่มต้นพิมพ์(print) # ได้ print
fun() # ได้ ฟังก์ชันถูกใช้งาน
print = พิมพ์
def nok():
def nai():
return 1
a = nai()
return a
print(nok()) # ได้ 1
nok
มีการนิยามฟังก์ชัน nai
ขึ้นและใช้ทันทีprint(nai()) # ได้ NameError: name 'nai' is not defined
return
def nok():
def nai():
return 1
return nai
print(nok()) # ได้ .nai at 0x1123bd620>
return nai
โดยไม่มีวงเล็บ ไม่ใช่ return nai()
เพราะสิ่งที่ต้องการส่งออกมานั้นคือตัวฟังก์ชันด้านใน ไม่ใช่ค่าที่ฟังก์ชันด้านในคืนออกมาอีกต่อnok
ทำงานโดยคืนค่าฟังก์ชัน nai
ซึ่งอยู่ภายในออกมา และฟังก์ชันนี้สามารถนำมาใช้ได้จริงด้วย
a = nok()
print(a()) # ได้ 1
print(nok()()) # ได้ 1
nok()
จะคืนค่า nai
มา ดังนั้น nok()()
ก็จะเท่ากับ nai()
ซึ่งจะคืนค่า 1
def nok():
def klang():
def nai():
return 1
return nai
return klang
print(nok()()()) # ได้ 1
def nok(x):
def nai():
return x
a = nai()
return a
print(nok(5)) # ได้ 5
def nok(x):
def klang(y):
def nai(z):
return '%d+%d+%d'%(x,y,z)
return nai
return klang
print(nok(2)(3)(4)) # ได้ 2+3+4
def nok():
def nai1():
return 1
def nai2():
return 2
def nai3():
return 3
return (nai1,nai2,nai3)
print(nok()) # ได้ (.nai1 at 0x1123bdbf8>, .nai2 at 0x11272ef28>, .nai3 at 0x11272ed08>)
()
ต่อไปอีก
print(nok()[0]) # ได้ .nai1 at 0x1123bdbf8>
print(nok()[0]()) # ได้ 1
print(nok()[1]()) # ได้ 2
for
หรือ map
ช่วยก็ได้
print([f() for f in nok()]) # ได้ [1, 2, 3]
print(list(map(lambda x:x(),nok()))) # ได้ [1, 2, 3]
def nok(t):
def nai1(x):
return t+x
def nai2(y):
return t+y
def nai3(z):
return t+z
return (nai1,nai2,nai3)
print(nok('A')[0]('1'))
print([f('3') for f in nok('B')])
print([f(str(i)) for i,f in enumerate(nok('C'),start=1)])
print(list(map(lambda f:f[1](str(f[0])),enumerate(nok('D'),start=4))))
print([nok(x)[y](z) for x,y,z in zip('123',(0,1,2),'ABC')])
print(list(map(lambda f:nok(f[0])[f[1]](f[2]),zip('456',(0,1,2),'DEF'))))
A1
['B3', 'B3', 'B3']
['C1', 'C2', 'C3']
['D4', 'D5', 'D6']
['1A', '2B', '3C']
['4D', '5E', '6F']
def nok(x):
def klang1(y):
def nai1(z):
return x+y+z+'๑'
def nai2(z):
return x+y+z+'๒'
return (nai1,nai2)
def klang2(y):
def nai1(z):
return x+y+z+'๓'
def nai2(z):
return x+y+z+'๔'
return (nai1,nai2)
return (klang1,klang2)
print([nok(x)[a](y)[0]('ก') for x,a,y in zip('12',(0,1),'AB')])
print([nok(x)[a](y)[b](z) for x,a,y,b,z in zip('1234',(0,1,0,1),'ABCD',(1,0,0,1),'กขคง')])
['1Aก๑', '2Bก๓']
['1Aก๒', '2Bข๓', '3Cค๑', '4Dง๔']
def nok():
x = '==ตัวแปรที่ประกาศในฟังก์ชัน nok แต่นอกฟังก์ชัน nai=='
def nai():
print(x)
return nai
ni = nok()
nok
ขึ้นมาโดยที่ข้างในมีตัวแปร x
จากนั้นก็นิยามฟังก์ชัน nai
ซึ่งมีการเรียกใช้ตัวแปร x
จากนั้นสุดท้ายฟังก์ชัน nok
จะ return
ฟังก์ชัน nai
ออกมาnok
ทำงาน โดยคืนค่ามาแล้วให้ตัวแปร ni
รับไว้ ดังนั้นในตอนนี้ตัวแปร ni
จะรับเอาฟังก์ชัน nai
และจะสามารถใช้งานได้ในฐานะฟังก์ชัน nai
nai
จะเห็นว่ามีการเรียกใช้ตัวแปร x
แต่ว่าดังที่เคยกล่าวไปแล้วว่าตัวแปรที่ประกาศภายในฟังก์ชันจะถูกเรียก ใช้ได้แค่ภายในฟังก์ชันเท่านั้น และพอฟังก์ชันสิ้นสุดการทำงานลงตัวแปรนั้นก็จะถูกลบไปni
น่าจะไม่สามารถทำงานได้หรือเปล่า? เพราะฟังก์ชัน nok
ได้สิ้นสุดการทำงานไปแล้ว เหลือไว้แค่ฟังก์ชัน nai
ที่คืนค่าออกมาni
สามารถทำงานได้ตามปกติไม่มีขาดตกบกพร่อง
ni() # ได้ ==ตัวแปรที่ประกาศในฟังก์ชัน nok แต่นอกฟังก์ชัน nai==
nok
นั้นเป็นแค่ฟังก์ชันที่ทำหน้าที่ผลิตฟังก์ชัน nai
เพื่อจะนำฟังก์ชัน nai
ที่ได้มาใช้งานอีกทีdef nok(a):
def nai():
print(a)
return nai
ni2 = nok(2)
ni7 = nok(7)
ni2() # ได้ 2
ni7() # ได้ 7
ni2
และ ni7
ก็ถูกสร้างขึ้นมาจากฟังก์ชัน nok
เหมือนกัน เพียงแต่ใส่ค่าต่างกันไปทำให้มันมีคุณสมบัติไม่เหมือนกันni2
และ ni7
จะเกิดจากฟังก์ชัน nai
เหมือนกัน แต่ว่าในเวลาที่ฟังก์ชัน ni2
ถูกสร้างขึ้นมามันได้จดจำว่า a
มีค่าเป็น 2
ส่วน ni7
จะจำว่า a
มีค่าเป็น 7
def
ขึ้นมา ๒ ครั้ง
def ni2():
print(2)
def ni7():
print(7)
def
แค่ครั้งเดียวdef
แล้วมีนิยามตายตัว แต่หากใช้วิธีนี้แล้วเราจะสามารถสร้างฟังก์ชันได้หลากหลายรูปแบบnai
เหมือนกันดังนั้นหากลอง print
ดูข้อมูลของตัวฟังก์ชันจะพบว่าชื่อก็ยังเป็น nai
เหมือนกัน แต่ถึงอย่างนั้นก็มีการเก็บค่าคนละที่แยกต่างหาก
print(ni2) # ได้ .nai at 0x112770d08>
print(ni7) # ได้ .nai at 0x112770048>
print(ni2.__name__) # ได้ nai
print(ni7.__name__) # ได้ nai
def nok(a):
def nai():
print(a, end='>')
return nai
nini = [nok(i) for i in range(10)]
for f in nini:
f()
# ได้ 0>1>2>3>4>5>6>7>8>9>
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ