ฟังก์ชันแลมบ์ดาของ Python พร้อมตัวอย่างเชิงปฏิบัติ
เผยแพร่แล้ว: 2021-06-21ฟังก์ชันแลมบ์ดาของ Python เป็นฟังก์ชันที่มีขนาดเล็กและถูกกำหนดโดยไม่มีชื่อ ในหลาม คำหลัก 'def' ใช้เพื่อกำหนดฟังก์ชัน อย่างไรก็ตาม ในกรณีของฟังก์ชันที่ไม่ระบุชื่อ คำหลัก 'แลมบ์ดา' ใช้เพื่อกำหนดฟังก์ชันเหล่านั้น ดังนั้นชื่อ “แลมบ์ดาทำหน้าที่ อาจมีชื่อหรือไม่ได้กำหนดให้กับฟังก์ชัน
เมื่อเทียบกับฟังก์ชันปกติในไพ ธ อน ฟังก์ชันแลมบ์ดาจะสั้น
ฟังก์ชันแลมบ์ดาถูกเพิ่มลงในไวยากรณ์ของภาษาโปรแกรม เช่น Python, Java, C++, C# เป็นต้น มีไวยากรณ์ ในขณะที่มันถูกใช้เป็นแนวคิดหลักในภาษาของ ML หรือ LISP
บทความนี้จะเน้นที่แนวคิดของ ฟังก์ชัน แลมบ์ดาหลาม และการใช้งาน
ขึ้นอยู่กับประเภทของภาษาการเขียนโปรแกรม ฟังก์ชันแลมบ์ดาอาจใช้แทนกันได้กับเงื่อนไขต่อไปนี้:
- ฟังก์ชันนิรนาม
- ฟังก์ชั่นแลมบ์ดา
- นิพจน์แลมบ์ดา
- นามธรรมของแลมบ์ดา
- ฟอร์มแลมบ์ดา
- ฟังก์ชันอักษร
สารบัญ
แคลคูลัสแลมบ์ดา
การคำนวณแลมบ์ดาเป็นแบบจำลองการคำนวณตามนิพจน์แลมบ์ดาที่สร้างขึ้น แคลคูลัสแลมบ์ดามีพื้นฐานมาจากสิ่งที่เป็นนามธรรมอย่างแท้จริงและถูกทำให้เป็นทางการโดยโบสถ์อลอนโซ ยังเป็นที่รู้จักในชื่อ lambda abstractions หมายถึงแบบจำลองดั้งเดิมที่สร้างโดย Alonzo Church
การคำนวณใดๆ สามารถเข้ารหัสได้ด้วยแนวคิดนี้
ไวยากรณ์ของฟังก์ชันแลมบ์ดา:
ไวยากรณ์ต่อไปนี้ถูกใช้ในขณะที่ใช้ฟังก์ชันแลมบ์ดาในไพ ธ อน
อาร์กิวเมนต์แลมบ์ดา: expression
สามารถมีอาร์กิวเมนต์จำนวนเท่าใดก็ได้ใน ฟังก์ชันแลมบ์ ดา ใน python แต่ฟังก์ชันสามารถมีได้เพียงนิพจน์เดียวเท่านั้น นิพจน์นี้ได้รับการประเมินก่อนแล้วจึงส่งคืน การใช้ฟังก์ชันแลมบ์ดาอยู่ที่ใดก็ตามที่มีความต้องการของออบเจกต์ฟังก์ชัน
พิจารณากรณีที่ฟังก์ชันที่ไม่ระบุชื่อที่มีสองอาร์กิวเมนต์ถูกกำหนดด้วยแลมบ์ดาแต่ไม่ถูกผูกไว้กับตัวแปรใดๆ:
แลมบ์ดา x, y: x + y
ในที่นี้ ฟังก์ชันทั้งสองใช้อาร์กิวเมนต์และคืนค่าผลรวม
มีคุณสมบัติบางประการที่แสดงโดยฟังก์ชันแลมบ์ดา:
- ไม่มีข้อความสั่งใดๆ ในส่วนเนื้อหาของฟังก์ชันแลมบ์ดา แต่มีได้เฉพาะนิพจน์
- รหัสการดำเนินการเป็นเพียงบรรทัดเดียว
- ฟังก์ชันแลมบ์ดาใน python ไม่ รองรับคำอธิบายประกอบประเภท
- อนุญาตให้เรียกใช้ทันที
ไม่สามารถใช้งบได้
ดังที่กล่าวไว้ จะไม่มีคำสั่งใด ๆ ในขณะที่กำหนดฟังก์ชันแลมบ์ดา หากผู้ใช้ใช้คำสั่งเช่น pass, return, ยกหรือยืนยัน จะมีข้อยกเว้น SyntaxError ผลลัพธ์ของข้อยกเว้นสามารถแสดงผ่านรหัสด้านล่าง
แหล่งที่มา
ในโค้ดด้านบน เกิดข้อผิดพลาดทางไวยากรณ์เมื่อแยกวิเคราะห์โค้ดซึ่งมี คำสั่ง ยืนยัน ในเนื้อหาของฟังก์ชัน lambda
ฟังก์ชันแลมบ์ดามีเพียงนิพจน์เดียว
ตรงกันข้ามกับฟังก์ชันปกติมาตรฐานทั้งหมดใน python ฟังก์ชัน lambda ใน python สามารถมีได้เพียงนิพจน์เดียวเท่านั้น เนื้อความของฟังก์ชันแลมบ์ดาสามารถมีนิพจน์กระจายไปทั่วโดยใช้หลายบรรทัดที่มีวงเล็บ อย่างไรก็ตาม มันยังคงเป็นนิพจน์เดียว
แหล่งที่มา
สตริง "คี่" จะถูกส่งกลับเมื่อมีอาร์กิวเมนต์ "คี่" ในขณะที่สตริง "คู่" จะถูกส่งกลับเมื่อมีอาร์กิวเมนต์ "คู่" โค้ดด้านบนใช้สองบรรทัดเนื่องจากอยู่ในวงเล็บ แต่ยังคงเป็นนิพจน์เดียว
พิมพ์คำอธิบายประกอบ
ด้วยความพร้อมใช้งานของ "การบอกใบ้ประเภท" ในไพ ธ อน ฟังก์ชันปกติจึงเป็นที่ต้องการมากกว่าฟังก์ชันแลมบ์ดาในไพ ธ อน ด้วยความพร้อมใช้งานของเครื่องมือเช่น mypy, pyre เป็นต้น ข้อผิดพลาดประเภทสามารถตรวจจับได้ด้วย full_name() ข้อผิดพลาดทางไวยากรณ์ที่เกี่ยวข้องกับฟังก์ชันแลมบ์ดาจะเพิ่มขึ้นระหว่างรันไทม์
เรียกใช้ฟังก์ชันการดำเนินการทันที (IIFE)
ไม่สามารถใช้คุณสมบัตินี้นอกล่ามหลาม คำจำกัดความของนิพจน์แลมบ์ดาใน python สามารถส่งต่อไปยังฟังก์ชันที่มีลำดับสูงกว่า เช่น map() เป็นต้น
อาร์กิวเมนต์ในฟังก์ชันแลมบ์ดา
รองรับวิธีต่างๆ ใน นิพจน์ python lambda สำหรับการส่งผ่านอาร์กิวเมนต์เช่น:
- อาร์กิวเมนต์ตำแหน่ง
- อาร์กิวเมนต์ที่มีชื่อเรียกอีกอย่างว่าอาร์กิวเมนต์ของคีย์เวิร์ด
- รายการตัวแปรของอาร์กิวเมนต์ซึ่งเรียกอีกอย่างว่า varargs
- รายการตัวแปรของอาร์กิวเมนต์คำหลัก
- อาร์กิวเมนต์ที่มีคีย์เวิร์ดเท่านั้น
มัณฑนากรใน Python Lambda Expression
มัณฑนากรสามารถกำหนดเป็นการนำรูปแบบไปใช้เพื่อเพิ่มพฤติกรรมให้กับคลาสหรือฟังก์ชัน ไวยากรณ์ของ @decorator ใช้เป็นคำนำหน้าของฟังก์ชันสำหรับแสดงมัณฑนากรใน python
มีการพิมพ์อาร์กิวเมนต์ 'Python ' เท่านั้น ลักษณะการทำงานเพิ่มเติมที่พิมพ์ออกมาคือ 'Calling function 'decorated_function'
Python อนุญาตให้เพิ่มมัณฑนากรในฟังก์ชันแลมบ์ดา แม้ว่า จะไม่จำเป็นต้อง ใช้ไวยากรณ์ @decorator มัณฑนากรทำหน้าที่เป็นฟังก์ชันที่เรียกฟังก์ชันแลมบ์ดา
<lambda> ปรากฏขึ้นในตำแหน่งที่ระบุฟังก์ชันแลมบ์ดา ในขณะที่ในกรณีของฟังก์ชันปกติเช่น add_two จะมีการระบุอย่างชัดเจน
เพื่อจุดประสงค์ในการดีบัก ฟังก์ชันแลมบ์ดาสามารถตกแต่งได้ด้วยวิธีนี้
ปิด
Closure() ใน python ถูกกำหนดให้เป็นฟังก์ชันที่ตัวแปรอิสระยกเว้นพารามิเตอร์ที่ใช้ในฟังก์ชันถูกผูกไว้กับค่าเฉพาะที่กำหนดไว้ภายในขอบเขตของฟังก์ชัน เราสามารถเรียกการปิดได้จากทุกที่ ฟังก์ชันแลมบ์ดาในไพ ธ อนสามารถทำหน้าที่เป็นตัวปิดในลักษณะที่ฟังก์ชันปกติทำหน้าที่เป็นตัวปิด
การใช้ฟังก์ชันแลมบ์ดา
- เมื่อใดก็ตามที่เราต้องการใช้ฟังก์ชันในช่วงเวลาที่สั้นลง ฟังก์ชันแลมบ์ดาจะถูกใช้ในกรณีนั้น
- สำหรับการส่งต่อฟังก์ชันไปยังฟังก์ชันของฟังก์ชันที่มีลำดับสูงกว่า ฟังก์ชันแลมบ์ดาจะถูกใช้ ฟังก์ชันจะถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังฟังก์ชันที่มีลำดับสูงกว่าเหล่านั้น
- ฟังก์ชันแลมบ์ดาใน python สามารถใช้กับฟังก์ชันในตัวอื่นๆ เช่น map() เป็นต้น
การทดสอบฟังก์ชันแลมบ์ดา
ด้วยการใช้โมดูล doctest และ unittest ฟังก์ชันแลมบ์ดาใน python สามารถทดสอบได้:
- โมดูล Unittest ทดสอบฟังก์ชันแลมบ์ดาเหมือนกับฟังก์ชันปกติ
- ในกรณีของโมดูล doctest โค้ด python จะถูกแยกจาก docstring เพื่อดำเนินการทดสอบ ไวยากรณ์ของฟังก์ชันแลมบ์ดาไม่อนุญาตให้ ใช้ docstring แต่สามารถกำหนดสตริงให้กับองค์ประกอบ _doc_ ของแลมบ์ดาที่กำลังตั้งชื่อได้
ตัวอย่างของฟังก์ชัน Python Lambda
ในโค้ดด้านล่าง ฟังก์ชันที่มีชื่อ "identity" ถูกกำหนดโดยอาร์กิวเมนต์ถูกส่งกลับ มันถูกกำหนดให้เป็นฟังก์ชันมาตรฐานของ python โดยใช้คำหลัก "def"
>>> def เอกลักษณ์ (x);
…..คืน x
ในที่นี้ x ถูกใช้เป็นอาร์กิวเมนต์โดยฟังก์ชัน "identity" และเมื่อเรียกใช้ฟังก์ชันจะส่งกลับอาร์กิวเมนต์
การเขียนรหัสเดียวกันโดยใช้แลมบ์ดาจะเป็น:
แลมบ์ดา x: x
นิพจน์ประกอบด้วยสามส่วน: แลมบ์ดาเป็นคีย์เวิร์ด x ซึ่งเป็นตัวแปรที่ถูกผูกไว้ และ X ซึ่งเป็นส่วนเนื้อหาของโค้ด
- ตัวแปรที่ถูกผูกไว้หมายถึงอาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชันแลมบ์ดา อย่างไรก็ตาม ตัวแปรอิสระคือสิ่งที่ไม่ถูกผูกไว้และสามารถอ้างอิงได้ในเนื้อหานิพจน์ ค่าคงที่อาจเป็นตัวแปรอิสระหรือตัวแปรที่กำหนดไว้ในขอบเขตของฟังก์ชัน
นิพจน์ข้างต้นสามารถอธิบายเพิ่มเติมเป็น
>>> แลมบ์ดา x: x + 1
ในที่นี้ ฟังก์ชันกำลังเพิ่ม 1 ให้กับอาร์กิวเมนต์ ฟังก์ชันนี้สามารถเพิ่มลงในอาร์กิวเมนต์ได้ในขณะที่ล้อมรอบฟังก์ชันทั้งสองพร้อมกับอาร์กิวเมนต์โดยใช้วงเล็บ
>>>(แลมบ์ดา x: x + 1)(2)
3
สำหรับการคำนวณค่าในนิพจน์ จะใช้กลยุทธ์การลด เช่นเดียวกับในตัวอย่างข้างต้น ตัวแปรที่ถูกผูกไว้ “x” สามารถแทนที่ด้วยอาร์กิวเมนต์ 2
(แลมบ์ดา x: x + 1 )(2) = แลมบ์ดา 2: 2 + 1
= 2 + 1
= 3
ฟังก์ชันแลมบ์ดาเป็นนิพจน์ การตั้งชื่อสามารถทำได้และโค้ดด้านบนสามารถเขียนใหม่เป็น
>>> add_one = แลมบ์ดา x : x + 1
>>> add_one(2)
3
นี่เทียบเท่ากับการเขียน:
def add_one(x):
ผลตอบแทน x + 1
อาร์กิวเมนต์เดียวถูกใช้โดยฟังก์ชันแลมบ์ดา นอกจากนี้ ในขณะที่กำหนด ฟังก์ชันแลมบ์ดาในไพ ธ อน ไม่มีวงเล็บรอบฟังก์ชัน
สำหรับการส่งอาร์กิวเมนต์มากกว่าหนึ่งรายการไปยัง ฟังก์ชัน แลมบ์ดาหลาม อาร์กิวเมนต์จะแสดงรายการและแยกจากกันโดยใช้เครื่องหมายจุลภาค (,) ไม่ควรมีวงเล็บขณะแสดงรายการอาร์กิวเมนต์ ตัวอย่างของฟังก์ชันหลายอาร์กิวเมนต์แสดงอยู่ด้านล่าง:
ในที่นี้ ฟังก์ชันแลมบ์ดาใช้สองอาร์กิวเมนต์ภายใต้ full_name สตริงถูกส่งกลับโดยฟังก์ชันที่สอดแทรก พารามิเตอร์ ตัว แรก และตัว สุดท้าย รหัสแสดงให้เห็นว่าในขณะที่กำหนดฟังก์ชันแลมบ์ดา ไม่มีการใช้วงเล็บใดๆ การเรียกใช้ฟังก์ชันแลมบ์ดาเป็นไปตามวิธีเดียวกับการเรียกใช้ฟังก์ชันมาตรฐานในไพ ธ อน นั่นคือการใช้วงเล็บที่ล้อมรอบอาร์กิวเมนต์
ฟังก์ชั่นแลมบ์ดา Python พร้อมตัวกรอง ()
ใน python ฟังก์ชัน filter() ยอมรับอาร์กิวเมนต์เป็นรายการและฟังก์ชัน ผ่านรายการของรายการ สามารถเรียกใช้ฟังก์ชันซึ่งจะส่งคืนรายการของรายการใหม่ ฟังก์ชันสำหรับรายการที่สร้างขึ้นใหม่นี้จะถูกประเมิน เป็น True
ตัวอย่างของ ฟังก์ชัน filter() แสดงอยู่ด้านล่างซึ่งใช้สำหรับกรองเลขคู่ที่อยู่ในรายการ
แหล่งที่มา
ผลลัพธ์ที่สร้างโดยโปรแกรมคือรายการใหม่: [4, 6, 8, 12]
ฟังก์ชัน Python lambda พร้อม map()
รายการและฟังก์ชันถือเป็นอาร์กิวเมนต์ในฟังก์ชัน python map() รายการทั้งหมดที่อยู่ในรายการเรียกฟังก์ชันที่ส่งคืนรายการที่สร้างขึ้นใหม่พร้อมรายการที่ส่งคืนโดยฟังก์ชัน
บทสรุป
ฟังก์ชันแลมบ์ดาของไพธอนคือฟังก์ชันเหล่านั้นที่มีบรรทัดเดียวและถูกประกาศโดยไม่มีชื่อ กล่าวคือ ฟังก์ชันที่ไม่ระบุชื่อ อาร์กิวเมนต์หลายจำนวนสามารถส่งผ่านไปยังฟังก์ชันแลมบ์ดาซึ่งมีได้เพียงนิพจน์เดียว บางครั้ง ฟังก์ชันแลมบ์ดาสามารถส่งผ่านไปยังฟังก์ชันอื่นเป็นอาร์กิวเมนต์ได้ ฟังก์ชั่นเมื่อกำหนดด้วยคำหลัก 'def' ใน python สามารถทำหน้าที่เป็นฟังก์ชันปกติได้
บทความนี้จึงได้อธิบายแนวคิดของฟังก์ชันแลมบ์ดาในไพ ธ อน การประยุกต์ใช้กับฟังก์ชันอื่นๆ และตัวอย่างบางส่วน หากคุณสนใจที่จะเพิ่มพูนความเชี่ยวชาญด้านภาษาโปรแกรมและฝึกฝนทักษะการเขียนโค้ดของคุณ คุณสามารถตรวจสอบหลักสูตร “ Executive PG Program in Data Science ” ที่เปิดสอนโดย upGrad ได้รับการออกแบบมาเป็นพิเศษสำหรับมืออาชีพระดับเริ่มต้นทุกคนที่มีอายุระหว่าง 21 ถึง 45 ปีที่ต้องการบรรลุทักษะในการเขียนโค้ดในสาขาวิทยาศาสตร์ข้อมูล หากคุณยินดีที่จะก้าวไปสู่ความฝัน ให้มองไปข้างหน้าและดูประโยชน์ของหลักสูตรนี้ ด้วยโครงการภาคปฏิบัติในภาคอุตสาหกรรม หลักสูตรที่ IIIT-B จัดทำขึ้นนั้น ได้รับการออกแบบมาเพื่อตอบสนองความต้องการของคุณและเตรียมคุณให้พร้อมสำหรับอุตสาหกรรมชั้นนำที่กำลังจะเกิดขึ้น
อะไรคือความแตกต่างระหว่างฟังก์ชันปกติและฟังก์ชันแลมบ์ดา?
เรารู้ว่าฟังก์ชันใน Python ถูกกำหนดโดยใช้คีย์เวิร์ด def ในทำนองเดียวกัน ฟังก์ชันแลมบ์ดาถูกกำหนดโดยใช้คีย์เวิร์ดแลมบ์ดา พิจารณาตัวอย่างด้านล่างเพื่อทำความเข้าใจความแตกต่างระหว่างทั้งสองอย่างลึกซึ้ง:
# ฟังก์ชันปกติ def sq(x): return x*x # ฟังก์ชัน Lambda lambda_sq = lambda x: x*x # การเรียกใช้ฟังก์ชันปกติ # Defined function print (sq(10)) # ใช้ฟังก์ชัน lambda print(lambda_sq(10)) }
ตัวอย่างข้างต้นแสดงให้เห็น 2 ฟังก์ชันในการคำนวณกำลังสองของตัวเลข หากไม่มีแลมบ์ดา เราต้องสร้างฟังก์ชัน sq(x) แล้วคืนค่าสแควร์ ในทางกลับกัน ด้วยแลมบ์ดา ฟังก์ชันทั้งหมดได้เดือดเป็นบรรทัดเดียว แลมบ์ดาไม่ต้องการคำสั่งส่งคืน