คือ ทำให้เราสามารถ ย่น code ที่ไม่มีอะไรซับซ้อน ได้ ทำให้
การอ่าน code เป็นไปอย่างสบายตา แต่ไม่ใช่ว่าต้องใช้ทุกครั้งไปนะครับ
ดูที่ความเหมาะสม
จริง ๆ แล้วก็เป็นเหมือนการเขียน function ที่ไม่ซับซ้อนให้อยู่
ในบรรทัดเดียว
ตัวอย่าง ถ้าเราเขียน function ขึ้นมาอย่างหนึ่ง
ใช้หาเลขคู่ ก็จะได้ประมาณนี้
a = [1, 2, 3, 4]
ab = []
for b in a:
if (b % 2) == 0:
ab.append(b)
ยาวไป เอาใหม่a = [1, 2, 3, 4] ab = [b for b in a if (b % 2) == 0]
จริง ๆ แค่นี้ก็ดูดีมีชาติตระกูลแล้ว
แต่ลองเขียนใหม่ดู
a = [1, 2, 3, 4] ab = filter(lambda b: (b % 2) == 0, a)
lambda ในที่นี้จะรับเอาค่า ทีละค่าจาก array a มา check
คือนำเอามาแทน b ใน lambda แล้วเช็คว่า หาร 2 แล้ว
ลงตัวใหม ถ้าไม่ลงก็จะ return False ถ้าพอดี ก็ return True
ในที่นี้ใช้ filter มาช่วย จัดการกับค่า array a
ถ้าเป็น True จะ return ค่าออกมา ถ้าเป็น False ก็ไม่เอาค่านั้น
------------------------------
ลองมาดูง่ายกว่านั้น
เอาเป็นว่า มีข้อมูล อยู่
a = [1, 2, 3, -3, 4, 'a']
ต้องการดึงค่าออกมาเฉพาะ เลขจำนวนเต็ม มากกว่าศูนย์ และเป็นเลขคู่ แล้วเอาไป *2
อันนี้แบบย่อสุด ๆ
a = [1, 2, 3, -3, 4, 'a'] ab = [b*2 for b in a if int == type(b) and b > 0 and (b % 2) == 0]
เริ่มอ่านยากแระ ลองแยกในส่วน check ออกเป็น function ดู
a = [1, 2, 3, -3, 4, 'a']
def find_x(x):
return int == type(x) and x > 0 and (x % 2) == 0
ab = [b*2 for b in a if find_x(b)]
ลองเขียนแยกเพื่อให้ง่ายต่อการแก้ไข
และเขียนเป็น แต่ละ function
a = [1, 2, 3, -3, 4, 'a']
def is_type_int(x):
return int == type(x)
def is_over_zero(x):
return x > 0
def is_mod_two(x):
return (x % 2) == 0
def cal_double(x):
return x*2
def chk_x(find_x, cal_x, x):
ab = []
for i in x:
ff = True
for f in find_x:
if not f(i):
ff = False
break
if ff
ab.append(cal_x(i))
return ab
ab = chk_x([is_type_int, is_over_zero, is_mod_two], cal_double, a)
มองว่า function ย่อย ไม่ได้สำคัญอะไร ก็ยุบไปซะ
a = [1, 2, 3, -3, 4, 'a']
def chk_x(find_x, cal_x, x):
ab = []
for i in x:
ff = True
for f in find_x:
if not f(i):
ff = False
break
if ff:
ab.append(cal_x(i))
return ab
ab = chk_x([lambda i: int == type(i), lambda i: i > 0, lambda i: (i % 2) == 0], lambda i: i*2, a)
คือคิดเผื่อว่า เอาเป็น หาร 3 ลงตัว แล้ว เอาไป *3 ก็จะแก้แค่นี้อะครับ
ab = chk_x([lambda i: int == type(i), lambda i: i > 0, lambda i: (i % 3) == 0], lambda i: i*3, a)
ยิ่งเขียนยิ่งไปกันใหญ่ เป็นตัวอย่างเฉย ๆ ครับ สำหรับการประยุกต์ใช้
ไม่มีความคิดเห็น:
แสดงความคิดเห็น