Trong những năm gần đây, với sự phát triển của AI, xử lý dữ liệu big data,… thì Python luôn là một trong những cái tên mà các nhà tuyển dụng săn đón nhiều nhất ở các ứng viên với mức đãi ngộ cao. Để chuẩn bị cho một buổi phỏng vấn tốt nhất, hôm nay mình cùng các bạn đi qua top 10 câu hỏi phỏng vấn Python Developer thường gặp nhất nhé.
Câu hỏi lý thuyết
Câu 1: Bạn có thể nói gì về Python?
Python là một ngôn ngữ lập trình bậc cao được thiết kế với cấu trúc cho phép người sử dụng viết mã lệnh với số lần gõ phím tối thiểu, nó được đánh giá là dễ học, cấu trúc rõ ràng, phù hợp và thuận tiện cho người bắt đầu học lập trình. Python ra mắt lần đầu năm 1991, ban đầu chỉ chạy trên nền Unix , sau đó mở rộng sang mọi hệ điều hành từ DOS, Windows, MacOS, Linux,… Đến nay thì Python vẫn luôn được xếp hạng là ngôn ngữ lập trình phổ biến nhất.
Python dựa trên trình thông dịch, là một ngôn ngữ kịch bản hướng đối tượng và tương tác. Nhờ tính đa năng của nó nên Python được sử dụng trong rất nhiều lĩnh vực đa nền tảng như Web, Machine Learning, Big Data, các mô hình khoa học,…
Câu 2: Những ưu điểm của Python và vì sao nó được ưa chuộng trong lĩnh vực AI, BigData
Ngoài ưu điểm về cấu trúc rõ ràng, cú pháp gọn, đẹp, dễ đọc thì Python còn mang nhiều tính năng ấn tượng cho người dùng:
- Mã nguồn mở: Python hoàn toàn free, mã nguồn mở và thân thiện với người dùng. Cũng nhờ đó là Python có một cộng đồng support lớn mạnh, sẵn sàng hỗ trợ các lỗi nhỏ nhất.
- Đa nền tảng: Python chạy được hầu như trên các nền tảng phổ biến nhất, từ Windows, MacOS, Linux và trên cả các nền tảng OS từ Unix sinh ra. Nhờ đó Python tạo được ra các ứng dụng từ nhỏ đến lớn một cách đa dạng.
- Kho thư viện module khổng lồ: với hơn 300 thư viện module cùng nhiều tính năng khác nhau giúp các lập trình viên tiết kiệm thời gian làm việc một cách tối đa. Nhiều module trên Python như xử lý ảnh, xử lý số liệu, tính toán, … trở thành tiêu chuẩn vì sự đầy đủ của nó.
- Năng suất cao: Python tích hợp hết các quy trình, framework unit test đầy đủ để cải thiện hiệu năng và chất lượng của ứng dụng.
Với những ưu điểm trên, Python là ngôn ngữ lập trình phù hợp với các xử lý dữ liệu lớn, phức tạp; đồng thời có nhiều lợi thế với các module tích hợp có sẵn cho việc tính toán, xử lý số liệu; phù hợp với các yêu cầu của ngành AI, Big Data.
Câu 3: Các kiểu dữ liệu cơ bản trong Python
Python hỗ trợ các kiểu dữ liệu cơ bản bao gồm số (integer và float), boolean và string.
Với dữ liệu số, ngoài việc hỗ trợ integer và float; Python cũng hỗ trợ biểu diễn các số ở hệ nhị phân (cơ số 2), bát phân (cơ số 8) và thập lục phân (cơ số 16). Để biểu diễn được chúng, ta thêm các tiền tố xác định như 0b, 0x, 0o tương ứng.
Ngoài ra Python còn tích hợp sẵn module complex cho việc xử lý số phức, viết dưới dạng x +yj (x là phần thực, y là phần ảo; module decimal cho việc xử lý số thập phân với độ chính xác cao (float chỉ hỗ trợ độ chính xác tối đa 15 chữ số phần thập phân)
Với kểu boolean thì Python quy định True có giá trị là 1 và False có giá trị là 0. Vì thế trong Python thì 1 == True và 0 == False.
Python không có kiểu dữ liệu ký tự (character) như một số ngôn ngữ khác; lúc này để biểu diễn 1 ký tự thì chúng ta sử dụng một chuỗi (string) có độ dài là 1.
Câu 4: Kiểu dữ liệu mutable/immutable trong Python
Mutable là những kiểu dữ liệu mà giá trị của dữ liệu có thể thay đổi được, bao gồm: List, Set, Dictionary. Ngược lại với kiểu dữ liệu immutable thì giá trị của dữ liệu không thể thay đổi được gồm: Chuỗi, Tuple, Số.
Ví dụ như List và Tuple là 2 loại dữ liệu tương đồng nhau, có thể xem Tuple là một List không thể chỉnh sửa được). Thông thường Tuple sẽ được sử dụng để lưu trữ những thông tin mà bạn không muốn thay đổi trong quá trình thực thi, chẳng hạn như các thông tin thiết lập (giới tính, quốc gia, dân tộc, …). Sử dụng Tuple giúp tiết kiệm bộ nhớ sử dụng hơn so với List. List cần được lưu trong 2 khối bộ nhớ: 1 có kích thước cố định để lưu biến, và 1 có kích thước biến đổi để lưu trữ dữ liệu.
Để khai báo List chúng ta sử dụng ngoặc vuông: [1,2,3]; còn tuple sẽ sử dụng ngoặc đơn (1,2,3)
Việc làm Python lương cao hấp dẫn trên TopDev
Câu 5: Phân biệt shallow copy và Deep copy trong Python
Khi chúng ta sao chép 1 đối tượng bằng toán tử gán (=), Python sẽ chỉ xử lý việc trỏ biến mới đấy vào cùng 1 đối tượng đã có trên bộ nhớ; đây chính là shallow copy (sao chép tương đối). Điều này dẫn đến việc khi bạn thay đổi giá trị của một biến thì cũng sẽ ảnh hưởng đến biến kia do cùng trỏ vào một đối tượng. Lưu ý shallow copy không thực hiện trên các dữ liệu cơ bản (primitive type).
Deep copy hay sao chép tuyệt đối là một tính năng cho phép bạn tạo ra 1 đối tượng mới hoàn toàn, nghĩa là trong bộ nhớ sẽ tạo thêm 1 vùng nhớ lưu trữ đối tượng giống với bản ghi gốc. Deep copy hữu ích khi sử dụng sao chép danh sách (list) hay các kiểu dữ liệu dạng tập hợp các objects.
Câu 6: Làm thế nào để xử lý đa luồng trong Python
Python cung cấp thread modue và threading module để bạn tạo và thực thi một thread, handle xử lý các tác vụ đa luồng. Mỗi thread trong Python đều có vòng đời gồm 3 giai đoạn: bắt đầu, chạy và kết thúc. Thread có thể bị ngắt (interupt) trong quá trình chạy, hoặc có thể tạm thời bị dừng (sleeping) trong khi các thread khác đang chạy (trạng thái yielding).
Để start một thread chúng ta dùng phương thức thread.start_new_thread bằng việc import module thread. Chúng ta cũng có thể sử dụng module threading với nhiều hỗ trợ mạnh mẽ và cao cấp hơn được Python thêm vào từ version 2.4. Ngoài các phương thức có trong module thread, threading còn cung cấp một số method khác như activeCount, currentThread, hay các phuowg thức triển khai đa luồng như run, start, join, …
Câu 7: Phân biệt break, continue, pass khi xử lý vòng lặp trong Python
Giống như hầu hết các ngôn ngữ lập trình, Python cung cấp 2 từ khóa break và continue cho việc kết thúc vòng lặp hiện tại (loop) mà không cần kiểm tra biểu thức điều kiện. Trong đó, break sẽ kết thúc vòng lặp chứa nó ngay lập tức, không thực hiện tiếp các lệnh tiếp theo sau break. Trường hợp break đặt trong nhiều vòng lặp lồng nhau thì nó sẽ thực hiện việc kết thúc vòng gặp gần nhất.
Continue thì sẽ bỏ qua phần còn lại của đoạn mã bên trong vòng lặp trong lần lặp hiện tại, nghĩa là sau continue thì vòng lặp vẫn sẽ tiếp tục chạy lần lặp tiếp theo.
Pass là một câu lệnh khá đặc biệt và ít gặp trong các ngôn ngữ lập trình khác. Pass có nhiệm vụ giữ chỗ cho vòng lặp để đoạn code sẽ được thêm vào sau trong tương lai. Thực tế thì pass không có tác dụng gì khác ngoài việc “không làm gì cả” trong vòng gặp, chỉ để tránh lỗi cú pháp nếu bạn khai báo 1 vòng lặp rỗng (không thực hiện câu lệnh gì) trong Python.
Câu 8: Cách sử dụng hàm any và all trong Python
any() và all() là 2 function sử dụng để check điều kiện trong 1 mảng kết quả, any sẽ trả về true khi tồn tại 1 giá trị true trong mảng truyền vào; ngược lại thì all chỉ trả về true khi tất cả các giá trị trong mảng truyền vào trả về true.
any() và all() được ứng dụng nhiều trong việc xử lý check điều kiện của các dữ liệu dạng List, Tuple hay Array nhằm kiểm tra điều kiện thỏa mãn của 1 thuộc tính trong tập dữ liệu; any tương đương với điều kiện OR và all tương đương với điều kiện AND
Câu 9: Kể tên một số thư viện, framework phổ biến cho Python
- Flask: framework xây dựng ứng dụng Web, được thiết kế nhẹ và mang tính module, nó được phân loại là 1 microframework vì không yêu cầu các công cụ hoặc thư viện cụ thể nào.
- Django: framework hỗ trợ phát triển Web, được đánh giá là 1 trong những framework Python tốt nhất và được sử dụng để phát triển nhanh chóng các API.
- NumPy: thư viện cung cấp rất nhiều tính năng hữu ích cho các phần xử lý ma trận, mảng đa chiều; cung cấp khả năng vector hóa các vận hành về toán giúp cải thiện hiệu suất và tốc độ thực thi.
- Scipy: thư viện phần mềm dành cho đại số tuyến tính, thống kê.
- Matplotlib: 1 thư viện của Python với khả năng visualizations mạnh mẽ trong việc xây dựng biểu đồ, diagram, charts,…
Câu 10: Compiling và Linking có vai trò gì trong Python
Như đã nói, Python là 1 ngôn ngữ thông dịch; nhưng không chỉ thế, cơ chế của Python cho phép nó có thể compiling biên dịch các phần mở rộng mới trong source code của bạn mà không gây ra lỗi. Điều này giúp Python có khả năng mở rộng code cao, không bị ảnh hưởng đến các phần xử lý khác.
Sau quá trình biên dịch thư viện mở rộng, linking liên kết sẽ móc nối phần mở rộng đấy với những phần source code còn lại trong chương trình của bạn.
Câu hỏi thực hành
1. Câu hỏi về list
Khởi động bằng một câu tương đối nhẹ nhàng với hai dòng code. Hầu hết các developer mới làm quen với Python cũng đều thấy thở vào nhẹ nhõm với câu hỏi này.
Tuy nhiên, trả lời đúng hay không thì còn chưa chắc
listA = ['1', '2', '3', '4', '5', '6'] print list[10:]
- A – Index Error
- B – []
- C – 6
List chỉ có 5 phần tử, xong chưa?. Kết quả là:
Cần phải chú ý dấu hai chấm (:). Cái bẫy nằm ở đây, nếu gõ listA[10], kết quả chắc chắn là IndexError (do array chỉ có 6 phần tử). Tuy nhiên trường hợp này lại đang cố gắng slice List, nên kết quả không bao giờ là Index Error.
Các công việc python bạn nên tham khảo
2. Câu hỏi về append trong list
list = [ [ ] ] * 3 list[0].append(1) print(list) list[1].append(2) print(list)
- A – [[1], [], []] và [[1], [2], []]
- B – [[1], [1], [1]] và [[2], [2], [2]]
- C – [[1], [1], [1]] và [[1, 2], [ 1, 2 ], [ 1, 2 ]]
Đáp án: C
Tại sao lại C. Cái bẫy là bẫy từ đầu ở chỗ [ [ ] ] * 3, cú pháp này tạo ra 3 phần tử trong list. Nhưng 3 phần tử này không độc lập để edit dữ liệu theo từng index.
[[]] * 3 chính xác tạo ra 3 item trong một list nhưng là references to the same list. Tức là cả ba đều tham chiếu tới cùng một giá trị.
list[0].append(1) đầu tiên nạp ba thằng giá trị 1 cho kết quả [[1], [1], [1]] . Bồi thêm phát nữa list[1].append(2) cho ra kết quả [[1, 2], [ 1, 2 ], [ 1, 2 ]]
Cái này thì như cái trick (thủ thuật thôi). Bạn nào cứ siêng đọc một loạt câu hỏi phỏng vấn Python thì nhớ, tiếp tục thôi nào
3. Python có multi-threading không? Có cách nào viết code Python chạy parallel không?
- A – Chắc là có, cũng như Java – Parallel Stream các kiểu đồ (bạn nào chưa biết có thể đọc thêm về Parallel Stream tại Kieblog)
- B – Làm gì có – chưa đọc câu nào phỏng vấn Python mà bảo có multi-threadting hết
- C – Có multi-threading nhưng không triển khai parallel được
Đáp án là B. Không có.
Python có một cái gọi là Global Interpreter Lock (GIL). GIL đảm bảo rằng chỉ có duy nhất một thread được thực thi tại một thời điểm nhất định.
Ngoài ra, Python cũng có một cái gọi là Python’s threading package.
4. *args, **kwargs là gì? Sự khác biệt?
Không có ABC. Câu này thuộc dạng câu hỏi phỏng vấn Python dễ nhất rồi đấy!
*args được sử dụng khi ta KHÔNG BIẾT CHÍNH XÁC bao nhiêu đối số (arguments) được pass qua cho function. Hoặc khi ta muốn pass arguments là một list, một loại data đặc biệt.
**kwargs sử dụng khi BIẾT CHÍNH XÁC bao nhiêu arguments được truyền qua cho function.
Cũng có thể sử dụng *bob và**billy nhưng cũng khá ít người dùng.
5. Đoạn code sau cho kết quả là?
def extendList(val, list=[]):
list.append(val)
return list
list1 = extendList(5) #1
list2 = extendList(555,[])
list3 = extendList('Z') #3
Các giá trị được in ra lần lượt ở #1 và #3 là:
- A – [5, ‘Z’] và [5, ‘Z’]
- B – [5] và [‘Z’]
- C – [5] và [5, ‘Z’]
Đáp án là A.
Trường hợp list1 và list3, nó chỉ truyền duy nhất một arguments. Đối với các câu hỏi phỏng vấn Python, cần nhớ rằng arguments trong def được tính toán khi function được define (định nghĩa ra). Chứ không phải lúc được gọi extendList()
Chính vì define một lần, nên ở lần gọi list1 và list3, nó lấy giá trị list cũ append giá trị mới vào -> Đáp án A, không lăn tăn.
Kết bài
Như vậy chúng ta đã đi qua top 15 câu hỏi phỏng vấn Python Developer thường gặp nhất, hy vọng bài viết này giúp bạn trang bị kiến thức tốt và tự tin hoàn thành buổi phỏng vấn Python sắp tới. Hẹn gặp lại các bạn trong các bài viết tiếp theo của mình.
Tác giả: Phạm Minh Khoa
Xem thêm:
- Top 10 câu hỏi phỏng vấn Java Developer thường gặp
- Python và cách tiết kiệm dung lượng cho phần mềm nhúng
- Tạo kho lưu cho các gói thư viện Python
Tìm kiếm việc làm IT mới nhất tại TopDev!








































































Ép Kiểu & Comment Source Code trong Java
Bài viết được sự cho phép của tác giả Nhựt Danh
Bài hôm nay chúng ta sẽ nói về 2 vấn đề “nhỏ”, đó là ép kiểu và comment source code. Bạn cũng nên biết nhỏ ở đây là nhỏ về tổng số chữ viết, chứ thực ra hai vấn đề hôm nay đều rất quan trọng cho các bài học kế tiếp đấy nhé. Với kiến thức về ép kiểu, chúng là kiến thức nền để bạn hiểu rõ cách sử dụng các kiểu dữ liệu khác nhau trong các ứng dụng của bạn. Còn comment source code sẽ trở thành phong cách viết code sao cho có đầy đủ chú thích dễ hiểu cho chính bạn và những người khác đọc source code của bạn sau này.
Nào để hiểu nó là gì, mời bạn đến với bài học.
Khái Niệm Ép Kiểu
Trước khi đi sâu vào tìm hiểu về ép kiểu, mình cũng xin nhắc lại một chút, là chúng ta đã từng làm quen với việc khai báo một biến (hoặc hằng), khi đó bạn cần chỉ định một kiểu dữ liệu cho biến hoặc hằng đó trước khi sử dụng. Việc khai báo một kiểu dữ liệu ban đầu như vậy mang tính tĩnh. Có nghĩa là nếu bạn định nghĩa biến đó là kiểu int, nó sẽ mãi là kiểu int, nếu bạn định nghĩa nó là kiểu float, nó sẽ mãi là kiểu float. Có bao giờ bạn thắc mắc nếu đem hai biến có kiểu dữ liệu khác nhau này vào tính toán với nhau, liệu nó sẽ tạo ra một biến kiểu gì? Và liệu chúng ta có thể thay đổi kiểu dữ liệu của một biến, hay một giá trị đã được khai báo hay không?
Câu hỏi trên cũng chính là nội dung của bài ép kiểu hôm nay. Cụ thể có thể mô tả ép kiểu như sau, ép kiểu là hình thức chuyển đổi kiểu dữ liệu của một biến sang một biến mới có kiểu dữ liệu khác. Vậy việc ép kiểu này không làm thay đổi kiểu dữ liệu của biến cũ, nó chỉ giúp bạn tạo ra một biến mới với kiểu dữ liệu mới, và mang dữ liệu từ biến cũ sang biến mới này. Khái niệm là vậy, còn mục đích là gì các bạn hãy đọc tiếp bài học hôm nay nhé.
Nên nhớ là vì các bạn chỉ mới làm quen với kiểu dữ liệu nguyên thủy, nên ép kiểu hôm nay cũng chỉ nói đến ép kiểu dữ liệu nguyên thủy mà thôi.
Phân Loại Ép Kiểu
Nếu phân loại ép kiểu dựa vào khả năng lưu trữ của biến, thì chúng ta có hai loại ép kiểu sau.
Tham khảo việc làm Java hấp dẫn trên TopDev
Kiểu phân loại thứ hai được chia làm hai dạng, đó là ngầm định và tường minh như mình có nhắc đến trên đây. Việc chia thành hai dạng này mang tính đặt tên để gọi đến, với lại để cho bạn nắm được cách gọi phòng khi bạn đọc tài liệu đâu đó có dùng đến các từ này, bản chất của nó vẫn tương ứng với phân biệt theo khả năng lưu trữ trên kia.
Bài Thực Hành Số 1
Bài thực hành này sẽ giúp bạn làm quen với dạng ép kiểu ngầm định. Với cách ép kiểu này bạn chú ý là chúng ta không cần làm gì cả, cứ code đi rồi hệ thống sẽ tự thực hiện việc ép kiểu thôi. Bạn hãy nhìn code sau.
Bạn thấy với b ban đầu được khai báo là kiểu byte với giá trị 50. Sau phép gán cho biến s (giá trị là short) thì giá trị 50 trong biểu thức này được chuyển tự động thành kiểu giữ liệu short cao hơn và gán vào biến s. Tương tự cho các phép gán vào i, l, f, d.
Dòng cuối cùng in ra “What type is it?” cho thấy một dạng ép kiểu ngầm định khác của hệ thống. Khi này bạn không khái báo trước một kiểu dữ liệu nào cả mà dùng hai biến có các kiểu int và float vào biểu thức. Bạn thấy hệ thống sẽ tự ép kiểu dữ liệu nhỏ hơn về kiểu lớn hơn, cụ thể lúc này là ép int về float và thực hiện phép cộng với hai số float. Kết quả chúng ta có một kiểu float in ra màn hình.
Bạn hãy so sánh kết quả in ra như hình sau.
Nhưng nếu bạn thử trắc nghiệm bằng cách kêu hệ thống ép một kiểu dữ liệu lớn hơn về kiểu nhỏ hơn xem. Hệ thống sẽ báo lỗi ngay. Và vì vậy bạn cần phải can thiệp mục kế tiếp dưới đây.
Bài Thực Hành Số 2
Quay lại ví dụ báo lỗi trên đây, hệ thống đã từ chối tự động ép kiểu ngầm định, vậy nếu vẫn có nhu cầu muốn ép kiểu thì bạn hãy ép kiểu tường minh cho nó, lúc này bạn cần dùng đến cấu trúc ép kiểu tường minh mà mình có đưa ra ở trên kia, như vầy.
Bạn hãy nhìn vào dòng
short s = (short) i;, dòng này sẽ ép kiểu giá trị của i về short và gán cho biến s. Việc bạn chỉ định ép kiểu với (short) nhìn vào là biết ý đồ ngay, vì vậy mới có cái tên là tường minh.
Bạn hãy xem một ví dụ nữa thực tế hơn, có một số trường hợp bạn muốn bỏ dấu thập phân của một kiểu số thực, cách nhanh nhất để làm điều này là ép kiểu số thực này về một kiểu số nguyên. Cách ép kiểu này thực chất là làm mất giá trị của biến một cách… cố tình.
Kết quả của việc ép kiểu này được in ra như sau, bạn chú ý dòng in ra kiểu int nhé, mất tiêu phần thập phân rồi.
Comment Source Code
Vì kiến thức về ép kiểu ngắn quá, nên mình nói luôn về comment source code ở bài này. Hai kiến thức này không ăn nhập gì với nhau hết, nhưng nó sẽ giúp bổ trợ tốt cho bạn trong quá trình code đấy.
Sở dĩ mình dùng từ comment chứ không dịch sang tiếng Việt là vì để tránh hiểu lầm thôi, vì đa số các bạn đều biết comment nghĩa là “bình luận”, nhưng thực ra mục đích của comment trong việc code lại chính là “ghi chú” hay “chú thích”. Nó giúp bạn giải nghĩa cho một số dòng code, bạn có thể comment thoải mái ở bất kỳ đâu trong source code, trình biên dịch sẽ bỏ qua các comment này khi build, do đó sẽ không có lỗi xảy ra với chúng.
Cách Thức Comment
Bạn có 3 cách comment như sau.
. Khi trình biên dịch gặp ký hiệu //, nó sẽ bỏ qua tất cả các ký tự từ // đến ký tự cuối cùng của dòng đó. Như vậy với mỗi // sẽ giúp bạn comment được 1 dòng.
. Khi trình biên dịch gặp ký hiệu /*, nó sẽ bỏ qua tất cả các ký tự từ /* đến hết */. Cách comment này có thể giúp bạn comment được nhiều dòng cùng lúc.
. Tương tự như trên nhưng bạn chú ý có hai dấu * khi bắt đầu. Cách comment này giúp trích xuất ra các tài liệu hướng dẫn. Người ta gọi là document. Cách comment này mình đã nói rõ hơn ở bài viết này.
Bài Thực Hành Số 3
Với bài thực hành này bạn hãy tiến hành gõ comment tổng hợp “3 trong 1” sau đây, mình đã gộp cả ba cách comment được nói ở trên vào một chương trình. Thực ra thì bạn không cần phải comment quá nhiều như ví dụ, bạn nên comment khi cần thiết phải giải nghĩa cho một dòng code lạ nào đó, hoặc ghi chú tác giả dòng code đó là bạn, hoặc ngày sửa chữa dòng code này,…
Kết Luận
Bạn vừa xem qua các cách thức ép kiểu trong Java, và các cách thức comment source code. Bài học này tuy nhẹ nhưng rất quan trọng nhé, bạn sẽ sử dụng việc ép kiểu và thực hiện việc comment thường xuyên trong các project của mình.
Bài viết gốc được đăng tải tại yellowcodebooks.com
Xem thêm:
Tìm việc làm IT mọi cấp độ tại TopDev