前言 Gap Year 期間持續在面試,這次面試的是一家做 Data Engineering 的新創公司 T 社。
一面是 Python 基礎能力測驗,用 Google Colab 進行,大概 1 小時。
結論:通過
一面: Python 基礎測驗 面試工具是 Google Colab,面試官給了 10 題 Python 題目, 涵蓋基礎語法、物件導向、函數式程式設計等概念。
原本的題目都是很制式的語法練習題, 但我刻意把它們轉換成「購物車」這個業務情境來解答。
為什麼要這樣做?
因為我想展現的不只是「我會寫 Python 語法」, 而是「我知道什麼時候該用什麼方法」。
題目 1: Bubble Sort 原始題目:
1 2 3 4 5 6 def bubble_sort (sequence ): pass assert bubble_sort([5 , 1 , 3 , 2 , 4 ]) == [1 , 2 , 3 , 4 , 5 ]
經典排序演算法 測試: [5, 1, 3, 2, 4] → [1, 2, 3, 4, 5]
我的解答:
1 2 3 4 5 6 7 def bubble_sort (sequence ): n = len (sequence) for i in range (n): for j in range (0 , n-i-1 ): if sequence[j] > sequence[j+1 ]: sequence[j], sequence[j+1 ] = sequence[j+1 ], sequence[j] return sequence
題目 2: 找第二大值 (O(n) 複雜度) 原始題目:
1 2 3 4 5 6 7 8 def find_second_largest (sequence ): pass assert find_second_largest([3 , 3 , 2 , 1 ]) == 2 assert find_second_largest([3 , 3 , 3 , 3 , 3 , 2 , 2 , 1 ]) == 2 assert find_second_largest([-1 , 2 , 3 , 5 , 3 , 1 , 2 , 4 ]) == 4
要求線性時間 要處理重複值 測試: [3, 3, 2, 1] → 2
我的解答:
1 2 3 4 5 6 7 8 9 10 def find_second_largest (sequence ): largest = second_largest = float ('-inf' ) for num in sequence: if num > largest: second_largest = largest largest = num elif num != largest and num > second_largest: second_largest = num return second_largest
題目 3: 繼承 (Inheritance) 原始題目:
實作商品類別Product 和 DiscountProduct 我用購物車的商品折扣來展現繼承和多型
我的解答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class Product : def __init__ (self, name, price ): self.name = name self.price = price def get_price (self ): return self.price class DiscountProduct (Product ): def __init__ (self, name, price, discount ): super ().__init__(name, price) self.discount = discount def get_price (self ): return self.price * self.discount products = [ Product("一般商品A" , 1000 ), DiscountProduct("特價商品B" , 1000 , 0.8 ) ] for p in products: print (p.name, "價格:" , p.get_price())
題目 4: *args, **kwargs 原始題目:
可變參數 我用購物車總價計算來展現(商品用 *args,運費用 **kwargs)
我的解答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 def calculate_cart (*args, **kwargs ): total = 0 for item in args: total += item.get_price() shipping = kwargs.get("shipping" , 0 ) total += shipping return total p1 = Product("商品A" , 1000 ) p2 = DiscountProduct("特價商品B" , 1000 , 0.8 ) p3 = DiscountProduct("特價商品C" , 500 , 0.5 ) total_price = calculate_cart(p1, p2, p3, shipping=100 ) print ("購物車總價:" , total_price)
題目 5: Lambda 函式 原始題目:
函數式程式設計 我用 map() + lambda 計算折扣總價
我的解答:
1 2 3 4 5 6 7 8 9 products = [ {"name" : "商品A" , "price" : 1000 , "discount" : 1 }, {"name" : "特價商品B" , "price" : 1000 , "discount" : 0.8 }, {"name" : "特價商品C" , "price" : 500 , "discount" : 0.5 } ] total_price = sum (list (map (lambda p: p["price" ] * p["discount" ], products))) print ("總價:" , total_price)
題目 6: List Comprehension 原始題目:
Python 簡潔語法 我用篩選折扣後價格 > 500 的商品來展現
我的解答:
1 2 3 4 5 6 7 8 9 products = [ {"name" : "商品A_一千" , "price" : 1000 , "discount" : 1 }, {"name" : "商品B_八百" , "price" : 1000 , "discount" : 0.8 }, {"name" : "商品C_二百五" , "price" : 500 , "discount" : 0.5 } ] discounted_over_500 = [p["name" ] for p in products if p["price" ] * p["discount" ] > 500 ] print (discounted_over_500)
題目 7: Decorator 原始題目:
裝飾器模式 我實作了「限制購物車總折扣不超過 200」的驗證邏輯
我的解答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 def max_discount_decorator (func ): def wrapper (cart, *args ): total_discount = sum (round ((1 - p["discount" ]) * p["price" ]) for p in cart.items) new_discount = sum (round ((1 - p["discount" ]) * p["price" ]) for p in args) if total_discount + new_discount > 200 : print (f"不能加入商品,總折扣 {total_discount + new_discount} 超過 200" ) return False return func(cart, *args) return wrapper class Cart : def __init__ (self ): self.items = [] @max_discount_decorator def add (self, *args ): self.items.extend(args) print (f"加入 {len (args)} 個商品到購物車" ) cart = Cart() p1 = {"name" : "商品A_一千" , "price" : 1000 , "discount" : 0.9 } p2 = {"name" : "商品B_五百" , "price" : 500 , "discount" : 0.8 } p3 = {"name" : "商品C_三百" , "price" : 300 , "discount" : 0.5 } cart.add(p1, p2) cart.add(p3)
題目 8: Generator 原始題目:
生成器 我用折扣價格計算來展現 好處是節省記憶體,適合大量資料
我的解答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 products = [ {"name" : "商品A" , "price" : 1000 , "discount" : 1 }, {"name" : "商品B" , "price" : 800 , "discount" : 0.8 }, {"name" : "商品C" , "price" : 500 , "discount" : 0.5 } ] def discounted_price_gen (products ): for p in products: yield {"name" : p["name" ], "discounted_price" : p["price" ] * p["discount" ]} for item in discounted_price_gen(products): print (item)
題目 9: Context Manager 原始題目:
with 語句 用檔案處理展現資源管理
我的解答:
1 2 with open ("test.txt" , "w" ) as f: f.write("Hello world" )
題目 10: Magic Methods 原始題目:
特殊方法 (__str__, __len__, __add__) 我實作購物車類別來展現
我的解答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 class Cart : def __init__ (self ): self.items = [] def add (self, item ): self.items.append(item) def __str__ (self ): return f"購物車({len (self.items)} 件商品)" def __len__ (self ): return len (self.items) def __add__ (self, other ): new_cart = Cart() new_cart.items = self.items + other.items return new_cart cart1 = Cart() cart1.add("商品A" ) cart1.add("商品B" ) cart2 = Cart() cart2.add("商品C" ) print (cart1) print (len (cart2)) cart3 = cart1 + cart2 print (cart3)
我的策略 原本題目都是純語法練習, 但我刻意想展現的是:
知道什麼時候該用什麼方法
將演算法概念應用到實際業務
不是只會背語法,而是理解背後的適用場景
(fin)