ยินดีต้อนรับกลับไปสู่อีกชิ้นอาหารอันโอชะของการเขียนโปรแกรมเชิงฟังก์ชัน ก่อนหน้านี้ ฉันเขียนเกี่ยวกับการใช้ฟังก์ชัน แผนที่ ฟังก์ชัน map รับฟังก์ชันและฟังก์ชันที่สามารถทำซ้ำได้เป็นอาร์กิวเมนต์ และใช้ฟังก์ชันนี้กับสมาชิกทุกคนของฟังก์ชันที่ทำซ้ำได้ วันนี้เราจะทำงานกับเครื่องมือใหม่ที่จะเพิ่มลงในชุดเครื่องมือของเรา — ตัวกรอง เอาล่ะ! คุณเคยต้องการกรองบางรายการภายในรายการโดยพิจารณาว่าเป็นไปตามเกณฑ์ที่กำหนดหรือไม่? ตามชื่อที่แนะนำ ฟังก์ชันตัวกรองจะทำอย่างนั้นทุกประการ

กรอง

ลองนึกภาพอีกครั้งว่าเจ้านายของคุณมอบหมายงานให้คุณสร้างเว็บแอปคัดแยกอาหารที่กรอง (เข้าใจแล้ว ตัวกรอง…ไม่…ฉันจะดำเนินการต่อ…) กำจัดผลิตภัณฑ์นมและผลิตภัณฑ์จากเนื้อสัตว์ออกจาก รายชื่อบริษัทผลิตภัณฑ์อาหารต่างๆ คุณดึงแขนเสื้อขึ้นและเริ่มดูโค้ดเบสที่เจ้านายของคุณจัดเตรียมไว้ให้

# We manage our inventory within the inventory attribute
class Company(object):
 def __init__(self, name,inventory):
 self.name = name
 self.inventory = inventory

# Each product contains a type, category and a name
class Product(object):
 def __init__(self,type,category,name):
 self.type = type
 self.category = category
 self.name = name
milk = Product(“food”,”dairy”,”milk”)
cheese = Product(“food”,”diary”,”cheese”)
yogurt = Product(“food”,”diary”,”yogurt”)
chicken = Product(“food”,”meat”,”chicken”)
steak = Product(“food”,”meat”,”steak”)
wings = Product(“food”,”meat”,”wings”)
# We set up a list of products here that our company ships out
list_of_products = [milk,cheese,yogurt,chicken,steak,wings]
# We define our company here
cool_foods = Company(“Cool Foods”, list_of_products)

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

# First we make a "filtering" function. I call this the "BIG LIVER". It sounds good.
def filter_out_diary_products(product):
 if product.category == “meat”:
   return True
 else:
   return False
# The "BIG LIVER" has the job of filtering out any product that is not a meat product.
filtered_products =  filter(filter_out_diary_products, xyzco.inventory)

ฉันดีใจที่คุณถาม ไม่มีเวทย์มนตร์ที่นี่ มันเป็นเพียงเครื่องมือที่น่าทึ่ง ตัวกรองรับฟังก์ชันเป็นอาร์กิวเมนต์และนำไปใช้ เช่นเดียวกับฟังก์ชัน แผนที่ ที่ทำงานกับทุกค่าของการวนซ้ำ ยกเว้นคราวนี้ มันจะค้นหาเกณฑ์และเกณฑ์นั้นคือค่าที่ส่งผ่านไปยังฟังก์ชันใดฟังก์ชันหนึ่งออกมาเป็น จริง คุณต้องการประเมินค่าโดยพิจารณาว่าค่าเหล่านั้นออกมาเป็นเท็จหรือไม่ ไม่มีปัญหา คุณมี "filterfalse" อยู่ข้างคุณ ฉันหวังว่าคุณจะพบว่าโพสต์บล็อกของวันนี้ค่อนข้างน่าขบขัน ฉันรู้ว่าคุณยังคงงุนงงกับความสุดยอดของ Functional Programming แต่เดี๋ยวก่อน ยังมีเรื่องเซอร์ไพรส์อีกมากมายที่จะเกิดขึ้น