Danh sách câu hỏi của đề

Câu hỏi: PRP201c Lập trình Python – Bộ ôn tập cuối kỳ số 2

46 câu trắc nghiệm kèm lời giải của môn PRP201c - Lập trình Python, xếp đúng thứ tự trong đề.

Danh sách câu hỏi

20/46 câuCòn 26
Aurllib
Bos
Clibrary
Dlib
Lời giải
Đáp án đúng: "urllib". Gói chuẩn urllib của Python có mô-đun urllib.request với hàm urlopen() mở một URL và trả về một đối tượng giống tệp, đọc được bằng read() hoặc lặp qua từng dòng như tệp thường, ví dụ fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt'). Gói này đi kèm Python, không cần cài thêm. Phương án "os" là mô-đun làm việc với hệ điều hành như đường dẫn, thư mục, biến môi trường, không mở trang web. Phương án "library" chỉ là từ chung nghĩa là thư viện, không phải tên mô-đun nào của Python. Phương án "lib" cũng không phải mô-đun chuẩn để đọc web; đó chỉ là tên viết tắt thường gặp của thư mục chứa thư viện. Ngoài urllib, người ta còn hay dùng gói requests cài thêm qua pip.
Mở trang câu hỏi này →
A(1,1,2,2,3,3)
B[1,1,2,2,3,3]
CIllegal
D(1,2,3,1,2,3)
Lời giải
Đáp án đúng: "Illegal". Toán tử * với một số nguyên chỉ được định nghĩa cho các kiểu dãy (sequence) như list, tuple, str: [1, 2] * 2 cho [1, 2, 1, 2]. Set là tập hợp không có thứ tự và không chứa phần tử trùng, nên việc nhân bản phần tử là vô nghĩa và Python không định nghĩa phép này; 2 * s1 ném TypeError: unsupported operand type(s) for *: 'int' and 'set'. "(1,1,2,2,3,3)" sai về cả hai mặt: phép nhân dãy nối nguyên bản sao chứ không lặp từng phần tử, và kết quả không thể là tuple khi đầu vào là set. "[1,1,2,2,3,3]" cũng không xảy ra, kể cả với list thì 2 * [1,2,3] cho [1,2,3,1,2,3]. "(1,2,3,1,2,3)" đúng là kết quả của 2 * (1,2,3) khi dùng tuple, nhưng s1 là set nên không áp dụng được.
Mở trang câu hỏi này →
3What will the following Python code print out?4 lựa chọncó code
Đề bài
friends = [ 'Joseph', 'Glenn', 'Sally' ]
friends.sort()
print (friends[1])
AGlenn
BJoseph
CSally
DFriends
Lời giải
Đáp án đúng: "Joseph". Phương thức sort() sắp xếp danh sách tại chỗ (in-place) theo thứ tự từ điển của chuỗi, nên friends trở thành ['Glenn', 'Joseph', 'Sally'] vì G đứng trước J, J đứng trước S. Chỉ số trong Python bắt đầu từ 0, nên friends[1] là phần tử thứ hai, tức Joseph. "Glenn" sai vì đó là friends[0], phần tử đầu tiên sau khi sắp; chọn nó là nhầm chỉ số bắt đầu từ 1. "Sally" sai vì đó là friends[2]. Nếu không gọi sort() thì friends[1] lại là Glenn, nên điểm mấu chốt là sort() đã đổi thứ tự danh sách gốc. "Friends" sai vì print in giá trị phần tử chứ không in tên biến, và tên biến cũng viết thường là friends.
Mở trang câu hỏi này →
Aprint(length(data))
Bprint(data.length())
Cprint(len(data))
Dprint(data.length)
Lời giải
Đáp án đúng: "print(len(data))". len() là hàm dựng sẵn trả về số phần tử của một đối tượng có độ dài như chuỗi, list, tuple hay dictionary; Python viết len(obj) chứ không gọi qua phương thức, bên trong nó gọi phương thức đặc biệt __len__ của đối tượng, rồi print in con số đó ra màn hình. "print(length(data))" sai vì Python không có hàm dựng sẵn tên length, chạy sẽ báo NameError. "print(data.length())" sai vì list không có phương thức length; cách viết này giống phương thức của một số ngôn ngữ khác, trong Python sẽ báo AttributeError. "print(data.length)" là kiểu thuộc tính độ dài của mảng JavaScript; list Python không có thuộc tính này nên cũng báo AttributeError. Ghi nhớ: trong Python, độ dài luôn lấy bằng hàm len().
Mở trang câu hỏi này →
AIt indicates the end of one line of text and the beginning of another line of text
BIt adds a new network connection to retrieve files from the network
CIt allows us to open more than one files and read them in a synchronized manner
DIt enables random movement throughout the file
Lời giải
Đáp án đúng: "It indicates the end of one line of text and the beginning of another line of text". Tệp văn bản thực chất là một chuỗi ký tự dài; ký tự xuống dòng (newline), trong Python viết là \n, là ký tự đặc biệt đánh dấu chỗ một dòng kết thúc và dòng kế tiếp bắt đầu, nhờ đó trình soạn thảo hiển thị được nhiều dòng và vòng lặp for line in fhand tách được từng dòng. len('X\nY') bằng 3 vì \n chỉ tính là một ký tự. Phương án "It adds a new network connection to retrieve files from the network" sai vì kết nối mạng do socket hoặc urllib đảm nhận, một ký tự trong tệp không làm được việc đó. Phương án "It allows us to open more than one files and read them in a synchronized manner" sai vì mở nhiều tệp là việc gọi open() nhiều lần, không liên quan tới ký tự xuống dòng. Phương án "It enables random movement throughout the file" sai vì di chuyển tuỳ ý trong tệp là việc của phương thức seek(), còn newline chỉ phân tách các dòng.
Mở trang câu hỏi này →
Aprint(x[14/17])
Bprint(x[14:17])
Cprint(x[14:3])
Dprint(x[14+3])
Lời giải
Đáp án đúng: "print(x[14:17])". Cú pháp cắt chuỗi (slicing) x[start:stop] lấy các ký tự từ chỉ số start đến trước chỉ số stop, chỉ số đếm từ 0. Trong 'From marquard@uct.ac.za', chữ F ở vị trí 0, dấu cách ở 4, ký tự @ ở 13, nên u ở 14, c ở 15, t ở 16 và dấu chấm ở 17; x[14:17] lấy đúng ba vị trí 14, 15, 16 thành 'uct', vị trí 17 bị loại vì stop không được tính. "print(x[14/17])" sai vì 14/17 là phép chia ra số thực khoảng 0,82, mà chỉ số chuỗi phải là số nguyên nên Python báo TypeError. "print(x[14:3])" hiểu nhầm số thứ hai là độ dài; thực ra 3 là vị trí dừng, nhỏ hơn 14 nên lát cắt rỗng và lệnh in ra chuỗi rỗng. "print(x[14+3])" tính 14+3 = 17 rồi lấy một ký tự duy nhất ở vị trí 17, tức dấu chấm, không phải ba ký tự cần tìm.
Mở trang câu hỏi này →
AThe "+" matches upper case characters and the "*" matches lowercase characters
BThe "+" matches the beginning of a line and the "*" matches the end of a line
CThe "+" matches the actual plus character and the "*" matches any character
DThe "+" matches at least one character and the "*" matches zero or more characters
Lời giải
Đáp án đúng: "The "+" matches at least one character and the "*" matches zero or more characters". Trong regular expression, + và * là lượng từ (quantifier) áp lên ký tự hoặc nhóm đứng ngay trước: + đòi ký tự đó xuất hiện từ một lần trở lên, * cho phép từ không lần trở lên, tức có thể vắng mặt. Ví dụ \S+@\S+ cần ít nhất một ký tự không phải khoảng trắng ở hai bên @, còn ab*c khớp cả ac lẫn abbbc. "The "+" matches upper case characters and the "*" matches lowercase characters" sai vì chữ hoa và chữ thường được khớp bằng lớp ký tự trong ngoặc vuông như [a-z]. "The "+" matches the beginning of a line and the "*" matches the end of a line" nhầm với hai ký tự neo ^ cho đầu dòng và $ cho cuối dòng. "The "+" matches the actual plus character and the "*" matches any character" sai cả hai vế: muốn khớp dấu cộng thật phải thoát thành \+, còn ký tự đại diện cho một ký tự bất kỳ là dấu chấm.
Mở trang câu hỏi này →
Đề bài
y = re.findall('^F.+:', x)
print(y)
A^F.+:
B['From: Using the :']
C['From:']
DFrom:
Lời giải
Đáp án đúng: "['From: Using the :']". Mẫu ^F.+: nghĩa là bắt đầu đầu chuỗi bằng chữ F, tiếp theo một hoặc nhiều ký tự bất kỳ, kết thúc bằng dấu hai chấm; vì .+ là tham lam (greedy) nên nó khớp dài nhất có thể, kéo tới dấu hai chấm cuối cùng trong chuỗi, cho đoạn From: Using the :. re.findall trả về một danh sách các đoạn khớp, nên print in ra danh sách một phần tử. "['From:']" là kết quả nếu dùng mẫu không tham lam ^F.+?:, dừng ở dấu hai chấm đầu tiên. "^F.+:" sai vì findall trả về đoạn văn bản khớp chứ không trả lại chính mẫu. "From:" sai vì vừa là đoạn khớp ngắn của kiểu không tham lam, vừa thiếu ngoặc vuông; findall luôn trả về list chứ không trả về chuỗi trần.
Mở trang câu hỏi này →
A["apple", "banana", "cherry"]
B{"name": "apple", "color": "green"}
C{"apple", "banana", "cherry"}
D("apple", "banana", "cherry")
Lời giải
Đáp án đúng: "("apple", "banana", "cherry")". Tuple (bộ giá trị) trong Python được viết bằng cặp ngoặc tròn, các phần tử cách nhau bởi dấu phẩy; tuple có thứ tự, truy cập được theo chỉ số nhưng bất biến (immutable): sau khi tạo không thêm, xoá hay gán lại phần tử được, nhờ vậy tuple dùng được làm khoá của dictionary và nhẹ hơn list. "["apple", "banana", "cherry"]" dùng ngoặc vuông nên là list, cũng có thứ tự nhưng thay đổi được. "{"name": "apple", "color": "green"}" dùng ngoặc nhọn với các cặp khoá và giá trị nên là dictionary (từ điển), tra cứu theo khoá. "{"apple", "banana", "cherry"}" dùng ngoặc nhọn chỉ chứa giá trị nên là set (tập hợp), không có thứ tự và không giữ phần tử trùng. Lưu ý chính dấu phẩy mới tạo nên tuple: một phần tử phải viết kèm dấu phẩy như ("apple",).
Mở trang câu hỏi này →
A{"apple", "banana", "cherry"}
B{"name": "apple", "color": "green"}
C["apple", "banana", "cherry"]
D("apple", "banana", "cherry")
Lời giải
Đáp án đúng: "["apple", "banana", "cherry"]". List (danh sách) trong Python được viết bằng cặp ngoặc vuông, các phần tử cách nhau bởi dấu phẩy; list có thứ tự, cho phép phần tử trùng lặp và thay đổi được (mutable), ví dụ có thể gọi append hay gán lại một phần tử theo chỉ số. "{"apple", "banana", "cherry"}" dùng ngoặc nhọn chỉ chứa giá trị nên là set (tập hợp): không có thứ tự, không giữ phần tử trùng và không truy cập được theo chỉ số. "{"name": "apple", "color": "green"}" dùng ngoặc nhọn với các cặp khoá và giá trị ngăn bởi dấu hai chấm nên là dictionary (từ điển), tra cứu theo khoá chứ không theo vị trí. "("apple", "banana", "cherry")" dùng ngoặc tròn nên là tuple (bộ giá trị): cũng có thứ tự như list nhưng bất biến (immutable), không sửa được sau khi tạo.
Mở trang câu hỏi này →
AWhat Python script would you like me to run?
BWhat is the next machine language instruction to run?
CWhat is your favourite color?
DWhat Python statement would you like me to run?
Lời giải
Đáp án đúng: "What Python statement would you like me to run?". Dấu nhắc ba dấu lớn hơn (chevron prompt) của chế độ tương tác, còn gọi là REPL, chờ người dùng gõ một câu lệnh Python; mỗi lần nhấn Enter, trình thông dịch thực thi ngay câu lệnh đó, in kết quả nếu có, rồi hiện lại dấu nhắc để hỏi câu lệnh tiếp theo. "What Python script would you like me to run?" sai vì script là cả một tệp .py, được chạy từ dòng lệnh của hệ điều hành bằng cách gọi python kèm tên tệp, chứ không phải gõ tên tệp vào dấu nhắc tương tác. "What is the next machine language instruction to run?" sai vì Python là ngôn ngữ cấp cao; người dùng không gõ mã máy, trình thông dịch tự dịch câu lệnh xuống bytecode rồi thực thi. "What is your favourite color?" chỉ là câu đùa; Python không hỏi sở thích, gõ câu trả lời kiểu đó vào dấu nhắc sẽ nhận NameError hoặc SyntaxError.
Mở trang câu hỏi này →
A2
B1
C6
D3
Lời giải

Đáp án đúng: "1". Python thực thi lần lượt từng dòng từ trên xuống. Dòng 1 gán chuỗi 'Hello Bob' cho astr và chạy thành công. Dòng 2 gọi int('Hello Bob'), nhưng chuỗi này không biểu diễn số nguyên nên int() ném ngoại lệ ValueError (invalid literal for int() with base 10); vì không có try/except bao quanh, chương trình dừng ngay tại đó, nên dòng cuối cùng chạy thành công là dòng 1. "2" sai vì chính dòng 2 là dòng gây lỗi: nó bắt đầu chạy nhưng không hoàn tất. "3" sai vì lệnh print ở dòng 3 không bao giờ được tới, lỗi ở dòng 2 đã chấm dứt chương trình trước đó. "6" chỉ đúng nếu mọi dòng đều chạy được; các dòng 4 tới 6 với chuỗi '123' vốn hợp lệ (int('123') cho 123) nhưng không được thực thi vì chương trình đã dừng. Muốn chạy tiếp tới cuối phải bọc dòng 2 trong try/except.

Mở trang câu hỏi này →
Aif x > y:
Bif (x > y)
Cif x > y then:
Dx > y?:
Lời giải
Đáp án đúng: "if x > y:". Câu lệnh if trong Python gồm từ khoá if, một biểu thức điều kiện và dấu hai chấm ở cuối dòng; dấu hai chấm mở khối lệnh, các dòng thuộc khối được thụt lề vào bên dưới. Phương án "if (x > y)" thiếu dấu hai chấm nên báo SyntaxError; riêng cặp ngoặc tròn thì Python cho phép, viết if (x > y): vẫn chạy được, chỉ là thừa. Phương án "if x > y then:" mượn từ khoá then của Pascal hay Visual Basic; Python không có then nên viết vậy là lỗi cú pháp. Phương án "x > y?:" giống toán tử ba ngôi ?: của JavaScript hay Java; Python không có cú pháp này, biểu thức điều kiện tương ứng viết là a if x > y else b, và dạng đó cũng chỉ tạo ra một giá trị chứ không mở được khối lệnh.
Mở trang câu hỏi này →
14What is 'abc'[1]?4 lựa chọn
Aa
Bb
Cc
DError
Lời giải
Đáp án đúng: "b". Chuỗi trong Python là dãy ký tự, truy cập bằng chỉ số đặt trong ngoặc vuông và chỉ số bắt đầu từ 0. Với 'abc', vị trí 0 là a, vị trí 1 là b, vị trí 2 là c, nên 'abc'[1] trả về 'b', ký tự thứ hai chứ không phải thứ nhất. "a" là kết quả của 'abc'[0], đáp án của người quen đếm từ 1 như đời thường. "c" là kết quả của 'abc'[2] hoặc 'abc'[-1], tức ký tự cuối. "Error" chỉ xảy ra khi chỉ số vượt khỏi khoảng hợp lệ, như 'abc'[3] gây IndexError; chỉ số 1 nằm trong khoảng từ 0 đến 2 nên hợp lệ. Đặt chỉ số ngay sau một hằng chuỗi là hoàn toàn được phép, giống như đặt sau tên biến.
Mở trang câu hỏi này →
APause the program and read data from the user
BConnect to the network and retrieve a web page.
CRead the memory of the running program
DTake a screen shot from an area of the screen
Lời giải
Đáp án đúng: "Pause the program and read data from the user". Hàm dựng sẵn input() in lời nhắc (nếu có) rồi tạm dừng chương trình chờ người dùng gõ một dòng và nhấn Enter, sau đó trả về dòng đó dưới dạng chuỗi str; muốn dùng như số phải ép kiểu, ví dụ int(input('Nhap tuoi: ')). "Connect to the network and retrieve a web page." sai vì việc lấy trang web do các thư viện như urllib.request hoặc socket đảm nhiệm. "Read the memory of the running program" sai vì input chỉ đọc từ đầu vào chuẩn (bàn phím), không đọc bộ nhớ của chương trình. "Take a screen shot from an area of the screen" sai vì chụp màn hình cần thư viện ngoài như Pillow (ImageGrab) hoặc pyautogui, không liên quan tới input.
Mở trang câu hỏi này →
Areplace()
BreplaceString()
Crepl()
Drep()
Lời giải

Đáp án đúng: "replace()". Kiểu str của Python có phương thức replace(old, new) trả về chuỗi mới, trong đó mọi lần xuất hiện của chuỗi con old được thay bằng new; ví dụ 'banana'.replace('a', 'o') cho 'bonono'. Chuỗi là bất biến (immutable) nên phương thức không sửa chuỗi gốc, phải gán kết quả cho biến nếu muốn dùng tiếp. "replaceString()" không tồn tại trong str; đó là kiểu đặt tên của một số ngôn ngữ khác, gọi trong Python sẽ báo AttributeError. "repl()" cũng không phải phương thức chuỗi; REPL là tên gọi vòng đọc, thực thi, in của chế độ tương tác, còn thay thế theo mẫu biểu thức chính quy thì dùng re.sub. "rep()" không tồn tại; dễ nhầm với repr(), hàm dựng sẵn trả về chuỗi biểu diễn của một đối tượng, không liên quan đến việc thay thế.

Mở trang câu hỏi này →
A3.0
B15
C4
D5.0
Lời giải
Đáp án đúng: "5.0". Python tính theo thứ tự ưu tiên toán tử: nhân và chia làm trước cộng trừ, các phép cùng mức thì từ trái sang phải. Vì vậy 2 * 3 cho 6, còn 8 / 4 cho 2.0, vì trong Python 3 phép / luôn trả về số thực (float) kể cả khi chia hết; sau đó 1 + 6 - 2.0 bằng 5.0, và có một toán hạng float nên kết quả cũng là float. Phương án "3.0" đúng kiểu float nhưng sai giá trị, vì 1 + 6 bằng 7, trừ 2.0 phải còn 5.0. Phương án "15" không khớp với cách tính theo đúng quy tắc ưu tiên, lại là số nguyên trong khi phép / đã biến kết quả thành float. Phương án "4" cũng là số nguyên, và giá trị đúng là 5 chứ không phải 4; ngay cả khi muốn kết quả nguyên thì phải dùng phép chia lấy phần nguyên //, lúc đó biểu thức cho 5.
Mở trang câu hỏi này →
AThe variable is stored in a file
BThe interpreter ignores it
CThe interpreter stores the value and lets you retrieve it later
DThe value is sent to the CPU directly
Lời giải
Đáp án đúng: "The interpreter stores the value and lets you retrieve it later". Trong Python shell, chế độ tương tác với dấu nhắc >>>, mỗi dòng gõ vào được trình thông dịch (interpreter) đọc và thực thi ngay. Câu lệnh gán x = 6 tạo tên x trong bộ nhớ của phiên làm việc, gắn với giá trị 6; lệnh gán không in gì, nhưng gõ tiếp x hay print(x) sẽ thấy 6. "The variable is stored in a file" sai vì biến chỉ sống trong bộ nhớ của phiên; thoát shell là mất, muốn lưu bền phải tự ghi ra tệp hoặc cơ sở dữ liệu. "The interpreter ignores it" sai vì lệnh gán là câu lệnh hợp lệ và có tác dụng; trình thông dịch chỉ bỏ qua chú thích và dòng trống. "The value is sent to the CPU directly" sai vì Python không đẩy mã nguồn thẳng xuống CPU; trình thông dịch dịch câu lệnh thành bytecode rồi máy ảo Python thực thi, và kết quả là một đối tượng nằm trong bộ nhớ chính.
Mở trang câu hỏi này →
A.exe
B.py
C.png
D.doc
Lời giải
Đáp án đúng: ".py". Tệp mã nguồn Python (script) theo quy ước có phần mở rộng .py, ví dụ hello.py, và chạy bằng lệnh python hello.py; trình thông dịch đọc trực tiếp văn bản trong tệp, còn bản biên dịch sang bytecode được lưu thành tệp .pyc trong thư mục __pycache__. ".exe" sai vì đó là tệp thực thi nhị phân của Windows; có thể đóng gói chương trình Python thành .exe bằng công cụ như PyInstaller, nhưng bản thân script không mang đuôi đó. ".png" sai vì đó là định dạng ảnh. ".doc" sai vì đó là tài liệu Microsoft Word; mã Python phải lưu dạng văn bản thuần, viết trong trình soạn thảo mã chứ không trong trình soạn thảo văn bản định dạng.
Mở trang câu hỏi này →
A1
B2
C4
D5
Lời giải
Đáp án đúng: "5". Nói thẳng chỗ tranh cãi: tính đúng nguyên văn biểu thức đang in thì nhân, chia và chia lấy dư cùng mức ưu tiên, tính từ trái sang phải: 2 * 3 = 6, 8 / 4 = 2.0 (ở Python 3 phép chia thường luôn cho số thực), 2.0 % 2 = 0.0, rồi 6 - 0.0 = 6.0, tức không có phương án nào đúng. Bộ phương án này thuộc câu gốc trong Python for Everybody với biểu thức x = 1 + 2 * 3 - 8 / 4: nhân chia trước cho 6 và 2.0, rồi cộng trừ trái sang phải 1 + 6 - 2.0 = 5.0, nên đáp án được giữ là 5 theo biểu thức gốc. "4" là kết quả nếu bỏ qua phần chia lấy dư của biểu thức đang in, tức 6 - 2.0 = 4.0, quên mất rằng 8 / 4 còn phải lấy dư cho 2. "2" chỉ là giá trị của riêng phép chia 8 / 4, chưa phải giá trị cả biểu thức. "1" không ứng với cách tính đúng thứ tự ưu tiên nào, dù theo biểu thức đang in hay biểu thức gốc.
Mở trang câu hỏi này →