6: Function

6-3: List Processing Function

** ถ้าใช้งานบนมือถือหรือ tablet แนะนำให้ใช้ Chrome หรือ Safari เท่านั้น **

แบบฝึกหัด 6-3 ข้อที่ 1

จงเขียนฟังชัน dot ที่รับลิสต์ของจำนวนจริง 2 ลิสต์ แต่ละลิสต์แทนเวกเตอร์มีขนาดเท่ากัน ฟังก์ชันนี้คำนวณและคืน dot product ของสองเวกเตอร์ที่ได้รับ

def dot(u, v): d = 0 for i in range(len(u)): d += u[i]*v[i] return d func = Ex().check_function_def('dot', missing_msg="ไม่พบฟังก์ชัน dot") func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') for v in ["[1,2,3], [2,3,4]", "[2.2, 3.3], [4.4, 5.5]"]: func.check_call("dot("+v+")").\ has_equal_value(incorrect_msg = "ผิด เช่น " + v)
แบบฝึกหัด 6-3 ข้อที่ 2

จงเขียนฟังชัน add ที่รับลิสต์ของจำนวนจริง 2 ลิสต์ แต่ละลิสต์แทนเวกเตอร์มีขนาดเท่ากัน ฟังก์ชันนี้คำนวณและคืนผลบวกของสองเวกเตอร์ที่ได้รับ

def add(u, v): w = [] for i in range(len(u)): w.append(u[i]+v[i]) return w func = Ex().check_function_def('add', missing_msg="ไม่พบฟังก์ชัน add") func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') for v in ["[1,2,3], [2,3,4]", "[2.2, 3.3], [4.4, 5.5]"]: func.check_call("add("+v+")").\ has_equal_value(incorrect_msg = "ผิด เช่น " + v) func.check_call("add("+v+")").\ has_equal_value(expr_code="type(add("+v+"))", incorrect_msg = "ฟังก์ชันนี้ต้องคืนลิสต์")
add คืนผลลัพธ์เป็นลิสต์
แบบฝึกหัด 6-3 ข้อที่ 3

จงเขียนฟังชัน to_list_of_strings ที่รับลิสต์หนึ่งตัว เพื่อสร้างและคืนลิสต์อีกตัวที่ภายในเก็บค่าที่นำข้อมูลจากลิสต์ที่รับมาแปลงเป็นสตริง เช่น รับ [1,2,3] จะคืน ['1', '2', '3']

def to_list_of_strings(x): results = [] for e in x: results.append(str(e)) return results func = Ex().check_function_def('to_list_of_strings', missing_msg="ไม่พบฟังก์ชัน to\_list\_of\_strings") func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') for v in ["[1, 2, 5]", "[1.2, 3.4]"]: func.check_call("f("+v+")").\ has_equal_value(incorrect_msg = "ผิด เช่น " + v) func.check_call("f("+v+")").\ has_equal_value(expr_code="type(to_list_of_strings("+v+"))", incorrect_msg = "ฟังก์ชันนี้ต้องคืนลิสต์")
แบบฝึกหัด 6-3 ข้อที่ 4

จงเขียนฟังก์ชัน get_positive(x) ฟังก์ชันนี้รับลิสต์ของจำนวน เพื่อคืนลิสต์ใหม่ที่เก็บจำนวนใน x เฉพาะตัวที่เป็นจำนวนบวก (เก็บเรียงลำดับก่อนหลังเหมือนใน x) เช่น x = [0,1,0,-2,9,3-4] จะคืน [1,9,3]

# อย่าเปลี่ยนหัวฟังก์ชันข้างล่างนี้ def get_positive(x): def get_positive(x): p = [] for e in x: if e > 0: p.append(e) return p func = Ex().check_function_def('get_positive', missing_msg="ไม่พบฟังก์ชัน get\_positive") func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') for v in [[0,-1,-2], [1,2,3], [0,-2,2,3,-1]]: func.check_call("f("+str(v)+")").\ has_equal_value(incorrect_msg = "ผิด เช่น " + str(v)) func.check_call("f("+str(v)+")").\ has_equal_value(expr_code="type(get_positive("+str(v)+"))", incorrect_msg = "ฟังก์ชันนี้ต้องคืนลิสต์") func.check_body().set_context(v).\ has_equal_value(name = "x", incorrect_msg = "ไม่จำเป็นต้องเปลี่ยน x ในฟังก์ชันนี้")
แบบฝึกหัด 6-3 ข้อที่ 5

จงเขียนฟังก์ชัน get_peak_indexes(x) ฟังก์ชันนี้รับลิสต์ของจำนวน เพื่อหาและคืนอินเด็กซ์ต่าง ๆ ของ x ที่มีข้อมูลที่มากกว่าตัวที่ติดกันทางซ้ายและขวา เช่น x = [0,1,9,3,4,99,3,4,6,0,9] จะคืน [2,5,8]

def get_peak_indexes(x): def get_peak_indexes(x): p = [] for i in range(1, len(x)-1): if x[i-1] < x[i] > x[i+1]: p.append(i) return p func = Ex().check_function_def('get_peak_indexes', missing_msg="ไม่พบฟังก์ชัน get\_peak\_indexes") func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') for v in ["[1,2,3,4,5]", "[9,0,9]", "[0,9,0]", "[0,9,0,9,0,9,0,9,9,9,8]"]: func.check_call("f("+v+")").\ has_equal_value(incorrect_msg = "ผิด เช่น " + v) func.check_call("f("+v+")").\ has_equal_value(expr_code="type(get_peak_indexes("+v+"))", incorrect_msg = "ฟังก์ชันนี้ต้องคืนลิสต์")
ดูสามตัวติดกันด้วยเงื่อนไข x[i-1] < x[i] > x[i+1] ถ้าใช่ก็ append(i)
แบบฝึกหัด 6-3 ข้อที่ 6

จงเขียนฟังก์ชัน all_even ที่รับ x เป็นลิสต์ของจำนวนเต็ม ฟังก์ชันนี้คืนจริงถ้าทุกค่าใน x เป็นจำนวนคู่ ไม่เช่นนั้นก็คืนเท็จ และเขียนอีกฟังก์ชัน all_even_positions_even ที่รับ x เป็นลิสต์ของจำนวนเต็ม ฟังก์ชันนี้คืนจริง ถ้าทุกค่าที่ index คู่ใน x เป็นจำนวนคู่ ไม่เช่นนั้นก็คืนเท็จ

def all_even(x): for e in x: if e%2==1: return False return True def all_even_positions_even(x): y = x[::2] return all_even(y) func = Ex().check_function_def('all_even', missing_msg="ไม่พบฟังก์ชัน all\_even") func.has_equal_part_len('args', 'all\_even รับพารามิเตอร์แค่ตัวเดียว') func.multi( check_call("all_even([2,4,6,2])").has_equal_value(incorrect_msg="all\_even คืนผลไม่ถูกต้อง เมื่อ x เก็บคู่ทั้งหมด"), check_call("all_even([2,4,6,2,1])").has_equal_value(incorrect_msg="all\_even คืนผลไม่ถูกต้อง เมื่อมีบางตัวใน x เป็นคี่") ) msg1 = "all\_even\_positions\_even คืนผลไม่ถูกต้อง เมื่อ" func = Ex().check_function_def('all_even_positions_even', missing_msg="ไม่พบฟังก์ชัน all\_even\_positions\_even") func.has_equal_part_len('args', 'all\_even\_positions\_even รับพารามิเตอร์แค่ตัวเดียว') func.multi( check_call("f([2,4,6,2,8,1,2])").has_equal_value(incorrect_msg=msg1 + " index คู่ใน x เก็บคู่หมด"), check_call("f([2,4,6,2,1,10,2])").has_equal_value(incorrect_msg=msg1 + "มีบางตัวใน index คู่ของ x เป็นคี่"), check_body().check_function("all_even", missing_msg="all\_even\_positions\_even ควรใช้ all\_even ให้เป็นประโยชน์") )
แบบฝึกหัด 6-3 ข้อที่ 7

จงเขียนฟังชัน prime_factor ที่รับจำนวนเต็มบวกหนึ่งค่า เพื่อนำไปแยกตัวประกอบเป็นจำนวนเฉพาะต่าง ๆ เก็บผลลัพธ์ในลิสต์ซึ่งเรียงค่าจากน้อยไปมาก และคืนลิสต์นี้เป็นผลลัพธ์ของฟังก์ชัน เช่น คำสั่ง prime_factor(8568) จะได้ [2, 2, 2, 3, 3, 7, 17] เพราะ 2x2x2x3x3x7x17 = 8568

def prime_factor(n): k = 2 factors = [] while k <= n: if n%k == 0: factors.append(k) n //= k else: k += 1 return factors func = Ex().check_function_def('prime_factor', missing_msg="ไม่พบฟังก์ชัน prime\_factor") func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์ตัวเดียว') for n in ["617", "1024", "49321", "126225"]: func.check_call("prime_factor("+str(n)+")").\ has_equal_value(incorrect_msg = "ผิด เช่น " + str(n))