= ตัวแปรที่มารับจะกลายเป็นฟังก์ชันซึ่งใช้งานได้เหมือนกับฟังก์ชันที่นิยามตอนแรก
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() ซึ่งจะคืนค่า 1def 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 และจะสามารถใช้งานได้ในฐานะฟังก์ชัน nainai จะเห็นว่ามีการเรียกใช้ตัวแปร 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 มีค่าเป็น 7def ขึ้นมา ๒ ครั้ง
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>
ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ