วิธีใช้ฟังก์ชันแลมบ์ดาใน Python [พร้อมตัวอย่าง]

เผยแพร่แล้ว: 2022-11-10

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้ทั้งหมดเกี่ยวกับฟังก์ชันแลมบ์ดาใน Python ตั้งแต่ไวยากรณ์เพื่อกำหนดฟังก์ชันแลมบ์ดาไปจนถึงกรณีการใช้งานต่างๆ พร้อมตัวอย่างโค้ด

ใน Python แลมบ์ดาเป็นฟังก์ชันที่ ไม่ระบุชื่อ ซึ่งมีรูปแบบไวยากรณ์ที่กระชับและสามารถใช้กับฟังก์ชันในตัวที่เป็นประโยชน์อื่นๆ ในตอนท้ายของบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีกำหนดฟังก์ชันแลมบ์ดาและเมื่อใดที่คุณควรพิจารณาใช้แทนฟังก์ชัน Python ปกติ

เอาล่ะ!

ฟังก์ชัน Python Lambda: ไวยากรณ์และตัวอย่าง

นี่คือไวยากรณ์ทั่วไปในการกำหนดฟังก์ชันแลมบ์ดาใน Python:

 lambda parameter(s):return value

ในไวยากรณ์ทั่วไปข้างต้น:

  • แลมบ์ดา คือคีย์เวิร์ดที่คุณควรใช้เพื่อกำหนดฟังก์ชันแลมบ์ดา ตามด้วย พารามิเตอร์ อย่างน้อยหนึ่งตัวที่ฟังก์ชันควรใช้
  • มีโคลอนคั่นพารามิเตอร์และ ค่าที่ส่งกลับ

เมื่อกำหนดฟังก์ชันแลมบ์ดา คุณควรตรวจสอบให้แน่ใจว่าค่าส่งคืนถูกคำนวณโดยการประเมินนิพจน์ที่ครอบคลุมโค้ดบรรทัดเดียว คุณจะเข้าใจสิ่งนี้ดีขึ้นเมื่อเราโค้ดตัวอย่าง

ตัวอย่างฟังก์ชัน Python Lambda

วิธีที่ดีที่สุดในการทำความเข้าใจฟังก์ชันแลมบ์ดาคือการเริ่มต้นด้วยการเขียนฟังก์ชัน Python ปกติเป็นฟังก์ชันแลมบ์ดา

คุณสามารถเขียนโค้ดใน Python REPL หรือในตัวแก้ไข Python ออนไลน์ของ Geekflare

#1 . พิจารณาฟังก์ชันต่อไปนี้ square() ซึ่งรับค่าตัวเลข num เป็นอาร์กิวเมนต์และส่งกลับค่ากำลังสองของตัวเลข

 def square(num): return num*num

คุณสามารถเรียกใช้ฟังก์ชันด้วยอาร์กิวเมนต์และตรวจสอบว่าฟังก์ชันทำงานอย่างถูกต้อง

 >>> square(9) 81 >>> square(12) 144

คุณสามารถกำหนดนิพจน์แลมบ์ดานี้ให้กับชื่อตัวแปร เช่น square1 เพื่อให้คำจำกัดความของฟังก์ชันกระชับยิ่งขึ้น: square1 = lambda num: num*num จากนั้นเรียกใช้ฟังก์ชัน square1 ด้วยตัวเลขใดๆ เป็นอาร์กิวเมนต์ อย่างไรก็ตาม เราทราบดีว่า lambdas เป็นฟังก์ชันที่ไม่ระบุตัวตน ดังนั้น คุณจึงควรหลีกเลี่ยงการกำหนดให้กับตัวแปร

สำหรับฟังก์ชัน square() พารามิเตอร์คือ num และค่าที่ส่งคืนคือ num*num หลังจากที่เราระบุสิ่งเหล่านี้แล้ว เราสามารถรวมพวกมันในนิพจน์แลมบ์ดาและเรียกมันด้วยอาร์กิวเมนต์ ดังที่แสดง:

 >>> (lambda num: num*num)(2) 4

นี่คือแนวคิดของนิพจน์ฟังก์ชันที่เรียกใช้ทันที ซึ่งเราเรียกใช้ฟังก์ชันทันทีหลังจากกำหนด

#2 . ต่อไป เรามาเขียนฟังก์ชันง่ายๆ ใหม่ add() ที่รวมตัวเลข num1 และ num2 แล้วส่งกลับผลรวม num1 + num2

 def add(num1,num2): return num1 + num2

ให้เรียกฟังก์ชัน add() ที่มีตัวเลขสองตัวเป็นอาร์กิวเมนต์:

 >>> add(4,3) 7 >>> add(12,5) 17 >>> add(12,6) 18

ในกรณีนี้ num1 และ num2 เป็นพารามิเตอร์สองตัว และค่าที่ส่งคืนคือ num1 + num2

 >>> (lambda num1, num2: num1 + num2)(3,7) 10

ฟังก์ชัน Python สามารถใช้ค่าเริ่มต้นสำหรับพารามิเตอร์ได้ มาแก้ไขคำจำกัดความของฟังก์ชัน add() และตั้งค่าเริ่มต้นของพารามิเตอร์ num2 เป็น 10

 def add(num1, num2=10): return num1 + num2

ในการเรียกใช้ฟังก์ชันต่อไปนี้:

  • ในการเรียกใช้ฟังก์ชันครั้งแรก ค่าของ num1 คือ 1 และค่าของ num2 คือ 3 เมื่อคุณส่งผ่านค่าของ num2 ในการเรียกใช้ฟังก์ชัน ค่านั้นจะถูกใช้ ฟังก์ชั่นส่งคืน 4
  • อย่างไรก็ตาม หากคุณส่งผ่านอาร์กิวเมนต์เพียงอาร์กิวเมนต์เดียว ( num1 คือ 7) ค่าเริ่มต้น 10 จะใช้สำหรับ num2 ; ฟังก์ชั่นส่งคืน 17
 >>> add(1,3) 4 >>> add(7) 17

เมื่อเขียนฟังก์ชันที่ใช้ค่าเริ่มต้นสำหรับพารามิเตอร์บางตัวเป็นนิพจน์แลมบ์ดา คุณสามารถระบุค่าเริ่มต้นเมื่อกำหนดพารามิเตอร์

 >>> (lambda num1, num2 = 10: num1 + num2)(1) 11

คุณควรใช้ฟังก์ชันแลมบ์ดาใน Python เมื่อใด

ตอนนี้คุณได้เรียนรู้พื้นฐานของฟังก์ชันแลมบ์ดาใน Python แล้ว ต่อไปนี้คือกรณีการใช้งานบางส่วน:

  • เมื่อคุณมีฟังก์ชันที่มีนิพจน์ส่งคืนเป็นโค้ดบรรทัดเดียว และคุณไม่จำเป็นต้องอ้างอิงฟังก์ชันที่อื่นในโมดูลเดียวกัน คุณสามารถใช้ฟังก์ชันแลมบ์ดาได้ เรายังได้เขียนโค้ดตัวอย่างบางส่วนเพื่อทำความเข้าใจเรื่องนี้
  • คุณสามารถใช้ฟังก์ชันแลมบ์ดาเมื่อใช้ฟังก์ชันในตัว เช่น map(), filter() และ reduce()
  • ฟังก์ชันแลมบ์ดามีประโยชน์ในการจัดเรียงโครงสร้างข้อมูล Python เช่น รายการและพจนานุกรม

วิธีใช้ Python Lambda พร้อมฟังก์ชันในตัว

1. การใช้แลมบ์ดากับ map()

ฟังก์ชัน map() ใช้ฟังก์ชัน iterable และฟังก์ชัน และใช้ฟังก์ชันนี้กับแต่ละรายการใน iterable ดังที่แสดง:

หลามแลมบ์ดาพร้อมแผนที่

มาสร้างรายการ nums และใช้ฟังก์ชัน map() เพื่อสร้างรายการใหม่ที่มีช่องสี่เหลี่ยมของตัวเลขแต่ละตัวในรายการ nums สังเกตการใช้ฟังก์ชันแลมบ์ดาเพื่อกำหนดการดำเนินการกำลังสอง

 >>> nums = [4,5,6,9] >>> list(map(lambda num:num*num,nums)) [16, 25, 36, 81]

เนื่องจากฟังก์ชัน map() ส่งคืนอ็อบเจ็กต์แผนที่ เราจึงควรใส่ลงในรายการ

️ ดูบทช่วยสอนนี้เกี่ยวกับฟังก์ชัน map() ใน Python

2. การใช้แลมบ์ดากับตัวกรอง ()

มากำหนดกัน nums รายการของตัวเลข:

 >>> nums = [4,5,6,9]

สมมติว่าคุณต้องการกรองรายการนี้และเก็บเฉพาะเลขคี่

คุณสามารถใช้ฟังก์ชัน filter() ในตัวของ Python

ฟังก์ชัน filter() ใช้ เงื่อนไข และตัวกรอง iterable : filter(condition, iterable) ผลลัพธ์มีเฉพาะองค์ประกอบใน iterable ดั้งเดิมที่ตรงตามเงื่อนไข คุณสามารถส่งวัตถุที่ส่งคืนไปยัง Python iterable เช่นรายการ

หลามแลมบ์ดาพร้อมตัวกรอง

ในการกรองเลขคู่ทั้งหมดออก เราจะเก็บเฉพาะเลขคี่เท่านั้น ดังนั้นนิพจน์แลมบ์ดาควรเป็น lambda num: num%2!=0 ปริมาณ num%2 คือส่วนที่เหลือเมื่อ num หารด้วย 2

  • num%2!=0 จะเป็น True เมื่อใดก็ตามที่ num เป็นเลขคี่ และ
  • num%2!=0 เป็น False เมื่อ num เป็นคู่
 >>> nums = [4,5,6,9] >>> list(filter(lambda num:num%2!=0,nums)) [5, 9]

3. การใช้แลมบ์ดากับ reduce()

ฟังก์ชัน reduce() ใช้ฟังก์ชัน iterable และฟังก์ชัน มันลด iterable โดยใช้ฟังก์ชัน iteratively กับรายการของ iterable

หลามแลมบ์ดาพร้อมลด

หากต้องการใช้ฟังก์ชัน reduce() คุณจะต้องนำเข้าจากโมดูล functools ในตัวของ Python:

 >>> from functools import reduce

ลองใช้ฟังก์ชัน reduce() เพื่อคำนวณผลรวมของตัวเลขทั้งหมดในรายการ nums เรากำหนดนิพจน์แลมบ์ดา: lambda num1,num2:num1+num2 เป็นฟังก์ชันผลรวมการลด

การดำเนินการลดจะเกิดขึ้นดังนี้: f(f(f(4,5),6),9) = f(f(9,6),9) = f(15,9) = 24 ที่นี่ f คือ การดำเนินการสรุปในสองรายการของรายการ ซึ่งกำหนดโดยฟังก์ชันแลมบ์ดา

 >>> from functools import reduce >>> nums = [4,5,6,9] >>> reduce(lambda num1,num2:num1+num2,nums) 24

ฟังก์ชั่น Python Lambda เพื่อปรับแต่งการเรียงลำดับ

นอกจากการใช้ฟังก์ชันแลมบ์ดาที่มีฟังก์ชัน Python ในตัว เช่น map() , filter() และ reduce() แล้ว คุณยังสามารถใช้ฟังก์ชันเหล่านี้เพื่อปรับแต่งฟังก์ชันในตัวและวิธีการที่ใช้สำหรับการจัดเรียง

img

1. การเรียงลำดับรายการหลาม

เมื่อทำงานกับรายการ Python คุณมักจะต้องเรียงลำดับตามเกณฑ์การเรียงลำดับบางอย่าง ในการจัดเรียงรายการ Python คุณสามารถใช้เมธอด sort() ในตัวได้ หากคุณต้องการสำเนาของรายการ คุณสามารถใช้ฟังก์ชัน sorted()

ไวยากรณ์การใช้ฟังก์ชัน sorted sorted() ของ Python ถูก sorted(iterable, key=...,reverse= True | False)

– พารามิเตอร์ key ใช้เพื่อปรับแต่งการเรียงลำดับ
– พารามิเตอร์ reverse สามารถตั้งค่าเป็น True หรือ False ได้ ค่าเริ่มต้นคือ False

เมื่อเรียงลำดับรายการตัวเลขและสตริง การเรียงลำดับเริ่มต้นจะเรียงลำดับจากน้อยไปหามากและตามลำดับตัวอักษรตามลำดับ อย่างไรก็ตาม บางครั้งคุณอาจต้องการกำหนดเกณฑ์ที่กำหนดเองสำหรับการเรียงลำดับ

พิจารณารายการต่อไปนี้ fruits . สมมติว่าคุณต้องการรับสำเนาที่เรียงลำดับของรายการ คุณควรจัดเรียงสตริงตามจำนวนการเกิดขึ้นของ 'p' ในสตริงนั้น ตามลำดับที่ลดลง

 >>> fruits = ['apple','pineapple','grapes','mango']

ได้เวลาใช้พารามิเตอร์ key เสริมแล้ว สตริงสามารถทำซ้ำได้ใน Python และเพื่อให้ได้จำนวนอักขระที่เกิดขึ้น คุณสามารถใช้เมธอด . .count() ในตัว ดังนั้นเราจึงตั้งค่า key เป็น lambda x:x.count('p') เพื่อให้การเรียงลำดับขึ้นอยู่กับจำนวนครั้งที่ 'p' เกิดขึ้นในสตริง

 >>> fruits = ['apple','pineapple','grapes','mango'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['pineapple', 'apple', 'grapes', 'mango']

ในตัวอย่างนี้:

  • key ในการจัดเรียงคือจำนวนครั้งของอักขระ 'p' และถูกกำหนดให้เป็นนิพจน์แลมบ์ดา
  • เนื่องจากเราได้ตั้งค่าพารามิเตอร์ reverse เป็น True การเรียงลำดับจะเกิดขึ้นตามลำดับจำนวนครั้งของ 'p' ที่ลดลง

ในรายการ fruits 'สับปะรด' มี 'p' 3 ครั้ง และสตริง 'apple', 'grapes' และ 'mango' มี 'p' 2, 1 และ 0 ครั้งตามลำดับ

ทำความเข้าใจการเรียงลำดับที่เสถียร

ขอพิจารณาอีกตัวอย่างหนึ่ง สำหรับเกณฑ์การจัดเรียงเดียวกัน เราได้กำหนดรายการ fruits ใหม่ ที่นี่ 'p' เกิดขึ้นในสตริง 'apple' และ 'grapes' สองครั้งและหนึ่งครั้งตามลำดับ และไม่เคยเกิดขึ้นในสตริง 'มะม่วง' และ 'แตง'

 >>> fruits = ['mango','apple','melon','grapes'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['apple', 'grapes', 'mango', 'melon']

ในรายการผลลัพธ์ 'มะม่วง' มาก่อน 'แตง' แม้ว่าทั้งคู่จะไม่มีอักขระ 'p' ก็ตาม แต่ทำไมถึงเป็นเช่นนี้? ฟังก์ชัน sorted sorted() ทำการเรียงลำดับที่เสถียร ดังนั้นเมื่อจำนวน 'p' เท่ากับสองสตริง ลำดับขององค์ประกอบในรายการ fruits ดั้งเดิมจะยังคงอยู่

ในการออกกำลังกายอย่างรวดเร็ว ให้สลับตำแหน่งของ 'มะม่วง' และ 'แตง' ในรายการ fruits จัดเรียงรายการตามเกณฑ์เดียวกัน และสังเกตผลลัพธ์

️ เรียนรู้เพิ่มเติมเกี่ยวกับการเรียงลำดับรายการ Python

2. การเรียงลำดับพจนานุกรมหลาม

คุณยังสามารถใช้ lambdas เมื่อเรียงลำดับพจนานุกรม Python พิจารณาพจนานุกรม price_dict ต่อไปนี้ที่มีรายการและราคา

 >>> price_dict = { ... 'Milk':10, ... 'Honey':15, ... 'Bread':7, ... 'Candy':3 ... }

ในการรับคู่คีย์-ค่าของพจนานุกรมเป็นรายการทูเพิล คุณสามารถใช้เมธอดพจนานุกรมในตัว . .items() :

 >>> price_dict_items = price_dict.items() dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])

ใน Python ทำซ้ำได้ทั้งหมด: รายการ ทูเพิล สตริง และอื่นๆ ทำตามการสร้างดัชนีศูนย์ รายการแรกอยู่ที่ดัชนี 0 รายการที่สองอยู่ที่ดัชนี 1 เป็นต้น

เราต้องการจัดเรียงตามมูลค่า ซึ่งเป็นราคาของแต่ละรายการในพจนานุกรม ในแต่ละทูเพิลในรายการ price_dict_items รายการที่ดัชนี 1 คือราคา ดังนั้นเราจึงตั้งค่า key เป็น lambda x:x[1] เนื่องจากจะใช้รายการที่ดัชนี 1 ซึ่งเป็นราคาเพื่อจัดเรียงพจนานุกรม

 >>> dict(sorted(price_dict_items,key=lambda x:x[1])) {'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}

ในผลลัพธ์ รายการพจนานุกรมได้รับการเรียงลำดับจากน้อยไปมากของราคา: เริ่มต้นด้วย 'Candy' ราคา 3 หน่วยเป็น 'น้ำผึ้ง' ราคา 15 หน่วย

️ หากต้องการเรียนรู้เพิ่มเติม โปรดดูคำแนะนำโดยละเอียดเกี่ยวกับการจัดเรียงพจนานุกรม Python ตามคีย์และค่า

สรุป

และที่นั่นคุณมีมัน! คุณได้เรียนรู้วิธีการกำหนดฟังก์ชันแลมบ์ดาและใช้งานอย่างมีประสิทธิภาพกับฟังก์ชันอื่นๆ ในตัวของ Python นี่คือบทสรุปของประเด็นสำคัญ:

  • ใน Python แลมบ์ดาเป็น ฟังก์ชันที่ไม่ระบุชื่อ ซึ่งสามารถรับหลายอาร์กิวเมนต์และส่งกลับค่า นิพจน์ที่จะประเมินเพื่อสร้างมูลค่าที่ส่งกลับนี้ควรเป็นโค้ดหนึ่งบรรทัด สามารถใช้เพื่อทำให้คำจำกัดความของฟังก์ชันขนาดเล็กกระชับขึ้นได้
  • ในการกำหนดฟังก์ชัน Lambda คุณสามารถใช้ไวยากรณ์: lambda Parameter(s): return value
  • กรณีการใช้งานที่สำคัญบางกรณีรวมถึงการใช้กับฟังก์ชัน map() , filter() และ reduce() และเป็นพารามิเตอร์หลักในการปรับแต่งการเรียงลำดับของ Python iterables

ต่อไป เรียนรู้วิธีการแบ่งชั้นใน Python