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

Câu hỏi: PRP201c Lập trình Python – Bộ ôn tập thi lại số 1

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
ASELECT
BGET
CFETCH
DFIND
Lời giải
Đáp án đúng: "SELECT". SELECT là lệnh truy vấn của SQL để lấy (retrieve) các dòng: SELECT danh sách cột FROM tên bảng, có thể kèm WHERE để lọc, và kết quả là một tập dòng; trong Python với sqlite3, ta gọi cur.execute với câu SELECT rồi lặp trên cursor hoặc gọi fetchall() để nhận các dòng. "GET" là phương thức của HTTP dùng để yêu cầu tài nguyên từ máy chủ web, không phải lệnh SQL. "FETCH" trong SQL chuẩn chỉ xuất hiện trong ngữ cảnh con trỏ cơ sở dữ liệu hoặc mệnh đề FETCH FIRST để giới hạn số dòng, luôn đi kèm một câu SELECT chứ không tự lấy dòng; trong sqlite3 của Python, fetchone và fetchall là phương thức của cursor. "FIND" không phải từ khoá SQL; nó gợi nhớ phương thức find() của chuỗi Python hoặc lệnh find của MongoDB.
Mở trang câu hỏi này →
A!=
B<>
CNOT
DBoth != and <>
Lời giải
Đáp án đúng: "Both != and <>". Trong SQL, <> là toán tử khác (not equal) theo chuẩn ANSI SQL, còn != là cách viết tương đương được hầu hết hệ quản trị cơ sở dữ liệu hỗ trợ, gồm SQLite, MySQL, PostgreSQL và SQL Server; WHERE age <> 18 và WHERE age != 18 cho cùng một kết quả. Vì cả hai ký hiệu đều kiểm tra sự khác nhau nên phương án gộp này là đầy đủ nhất. Phương án "!=" đúng nhưng chỉ nêu một trong hai cách viết, chọn riêng nó là bỏ sót ký hiệu chuẩn. Phương án "<>" cũng đúng nhưng chưa đầy đủ vì bỏ sót cách viết quen thuộc với lập trình viên Python. Phương án "NOT" là toán tử logic phủ định cả một điều kiện, ví dụ WHERE NOT age = 18; nó đảo kết quả đúng sai của điều kiện đứng sau chứ bản thân không phải toán tử so sánh khác.
Mở trang câu hỏi này →
APython lists store multiple values and dictionaries store a single value
BPython dictionaries are a collection and lists are not a collection
CPython lists are indexed using integers and dictionaries can use strings as indexes
DPython lists can store strings and dictionaries can only store words
Lời giải
Đáp án đúng: "Python lists are indexed using integers and dictionaries can use strings as indexes". List là dãy có thứ tự, mỗi phần tử được truy cập bằng vị trí nguyên bắt đầu từ 0, như lst[0]; dictionary (từ điển) là tập các cặp key–value, truy cập bằng key do ta tự đặt, thường là chuỗi, như counts['bob']. Đó là khác biệt cốt lõi: list tra theo vị trí, dict tra theo nhãn. "Python lists store multiple values and dictionaries store a single value" sai vì cả hai đều chứa nhiều giá trị; một dict có thể có hàng nghìn cặp. "Python dictionaries are a collection and lists are not a collection" sai vì list và dict đều là collection (kiểu tập hợp, một biến chứa nhiều giá trị). "Python lists can store strings and dictionaries can only store words" sai vì giá trị trong dict có thể là bất kỳ đối tượng nào: số, chuỗi, list, thậm chí dict khác; key cũng có thể là số nguyên hay tuple, miễn là kiểu bất biến băm được.
Mở trang câu hỏi này →
4What would the following Python code print out?4 lựa chọncó code
Đề bài
stuff = dict()
print(stuff['candy'])
A-1
B0
CThe program would fail with a traceback
Dcandy
Lời giải
Đáp án đúng: "The program would fail with a traceback". dict() tạo một từ điển rỗng, và truy cập bằng ngoặc vuông stuff['candy'] với một khoá (key) chưa tồn tại sẽ phát sinh ngoại lệ KeyError: 'candy'; không có try/except nên chương trình dừng và in traceback (vết lỗi). Muốn lấy giá trị mặc định khi thiếu khoá thì dùng stuff.get('candy', 0) hoặc kiểm tra 'candy' in stuff trước. "-1" sai vì đó là quy ước của str.find khi không tìm thấy, từ điển không trả -1. "0" sai vì từ điển không tự trả 0 cho khoá thiếu; chỉ get với mặc định 0 hoặc collections.defaultdict(int) mới làm vậy. "candy" sai vì truy cập theo khoá trả về giá trị gắn với khoá, không trả lại chính tên khoá, và ở đây chưa có giá trị nào.
Mở trang câu hỏi này →
Đề bài
fhand = open('mbox.txt')
x = 0
for line in fhand:
    x = x + 1

print x

ARemove the leading and trailing spaces from each line in mbox.txt
BCount the lines in the file 'mbox.txt'
CConvert the lines in mbox.txt to upper case
DReverse the order of the lines in mbox.txt
Lời giải
Đáp án đúng: "Count the lines in the file 'mbox.txt'". Lần theo mã: open mở tệp và trả về đối tượng tệp fhand; biến x khởi tạo bằng 0; vòng lặp for line in fhand chạy một lần cho mỗi dòng của tệp, mỗi lần cộng x thêm 1, thân vòng lặp không hề động tới nội dung của line; cuối cùng in x, tức tổng số dòng. Đây là mẫu biến đếm (counter) kinh điển khi xử lý tệp. Lưu ý print x không có ngoặc là cú pháp Python 2; ở Python 3 phải viết print(x), nếu không sẽ báo SyntaxError, nhưng mục đích của đoạn mã không đổi. "Remove the leading and trailing spaces from each line in mbox.txt" cần gọi line.strip() rồi ghi kết quả ra đâu đó, mã không có bước này. "Convert the lines in mbox.txt to upper case" cần gọi line.upper(), cũng không xuất hiện. "Reverse the order of the lines in mbox.txt" cần đọc mọi dòng vào một list rồi đảo bằng reverse() hoặc lát cắt [::-1]; hơn nữa tệp được mở ở chế độ đọc mặc định nên mã không thể sửa nội dung tệp.
Mở trang câu hỏi này →
Afind()
Bstartswith()
Crstrip()
Dsplit()
Lời giải
Đáp án đúng: "rstrip()". Mỗi dòng đọc từ tệp bằng vòng lặp for line in fhand đều còn giữ ký tự xuống dòng \n ở cuối; khi gọi print(line), print lại tự thêm một ký tự xuống dòng nữa, nên giữa các dòng From xuất hiện một dòng trống thừa. Gọi line.rstrip() xoá khoảng trắng ở bên phải chuỗi, trong đó có \n, nên các dòng được in liền nhau như trong tệp. Phương án "find()" chỉ tìm vị trí một chuỗi con và trả về chỉ số hoặc -1, không xoá ký tự nào. Phương án "startswith()" kiểm tra chuỗi có bắt đầu bằng một tiền tố hay không, hữu ích để lọc các dòng bắt đầu bằng From, nhưng không bỏ được ký tự xuống dòng. Phương án "split()" tách chuỗi thành list các từ; nó có bỏ \n nhưng biến dòng thành list chứ không còn là dòng văn bản để in như cũ. Một cách khác là print(line, end='').
Mở trang câu hỏi này →
AMatch any number of lowercase letters followed by any number of digits
BMatch a lowercase letter or a digit
CMatch an entire line as long as it is lowercase letters or digits
DMatch any text that is surrounded by square braces
Lời giải
Đáp án đúng: "Match a lowercase letter or a digit". Trong biểu thức chính quy (regular expression), cặp ngoặc vuông tạo một lớp ký tự (character class) khớp đúng MỘT ký tự thuộc tập liệt kê; a-z là dải chữ thường, 0-9 là dải chữ số, nên [a-z0-9] khớp một ký tự là chữ thường hoặc chữ số. Muốn khớp nhiều ký tự phải thêm lượng từ như + hay * phía sau. "Match any number of lowercase letters followed by any number of digits" sai vì lớp ký tự không có thứ tự trước sau và không lặp; mẫu đó phải viết [a-z]*[0-9]*. "Match an entire line as long as it is lowercase letters or digits" cần thêm neo đầu dòng, neo cuối dòng cùng lượng từ, tức ^[a-z0-9]+$. "Match any text that is surrounded by square braces" sai vì ngoặc vuông ở đây là cú pháp chứ không phải ký tự cần khớp; muốn khớp ngoặc vuông thật phải thoát nó bằng dấu gạch ngược.
Mở trang câu hỏi này →
AWelcome# 111#924.66
BWelcome#111#924.66
CWelcome#111#.66
DWelcome # 111#924.66
Lời giải
Đáp án đúng: "Welcome # 111#924.66". Đặc tả định dạng "10s" đệm chuỗi bên phải cho đủ độ rộng 10 ký tự, nên Welcome (7 ký tự) được in kèm 3 dấu cách, rồi end = '#' in dấu thăng thay cho xuống dòng; "4d" in số nguyên căn phải trong 4 ô nên 111 có một dấu cách đứng trước; ".2f" làm tròn 924.656 tới hai chữ số thập phân thành 924.66. Kết quả thật là Welcome kèm ba dấu cách, tiếp theo là dấu thăng, một dấu cách, 111, dấu thăng và 924.66; bản chép của phương án này đã gộp ba dấu cách sau Welcome còn một, nhưng nó là phương án duy nhất giữ khoảng đệm sau Welcome và dấu cách trước 111, nên là đáp án. "Welcome# 111#924.66" sai vì bỏ mất khoảng đệm của "10s" sau Welcome. "Welcome#111#924.66" sai vì bỏ cả khoảng đệm của "10s" lẫn dấu cách đệm của "4d". "Welcome#111#.66" sai thêm vì ".2f" giữ nguyên phần nguyên 924, chỉ giới hạn số chữ số sau dấu chấm.
Mở trang câu hỏi này →
AREST uses formatted text (JSON)
BREST sends binary only
CSocket always encrypts data
DREST uses formatted text (HTML)
Lời giải
Đáp án đúng: "REST uses formatted text (JSON)". Khi gọi một REST API (giao diện lập trình theo kiến trúc REST), dữ liệu được đóng gói trong yêu cầu và phản hồi HTTP, và nội dung thường là văn bản có cấu trúc dạng JSON (JavaScript Object Notation), khai báo qua header Content-Type là application/json, nên Python đọc bằng json.loads; còn socket thô chỉ truyền một dòng byte, ứng dụng hai đầu tự quy ước định dạng. "REST sends binary only" sai vì REST chạy trên HTTP và chủ yếu trao đổi văn bản; có thể gửi dữ liệu nhị phân như ảnh hay tệp nhưng không phải chỉ nhị phân. "Socket always encrypts data" sai vì socket TCP gửi dữ liệu thô, không mã hoá; muốn mã hoá phải bọc thêm TLS bằng module ssl. "REST uses formatted text (HTML)" lệch trọng tâm: HTML là định dạng trang web để hiển thị cho người đọc, còn API trả dữ liệu cho chương trình xử lý, nên chủ yếu dùng JSON, trước đây có cả XML.
Mở trang câu hỏi này →
AA user-defined function
BA built-in function
CThe central processing unit
DA conditional statement
Lời giải
Đáp án đúng: "A built-in function". input() là hàm dựng sẵn (built-in function) của Python: có sẵn ngay khi chạy trình thông dịch, không cần import hay tự định nghĩa; nó tạm dừng chương trình, chờ người dùng gõ một dòng rồi trả về dòng đó dưới dạng chuỗi, ví dụ name = input('Tên bạn: '). Cùng nhóm với nó là print(), len(), int(), type(). Phương án "A user-defined function" sai vì hàm tự định nghĩa là hàm do lập trình viên viết bằng def, còn input có sẵn trong ngôn ngữ. Phương án "The central processing unit" là bộ xử lý trung tâm (CPU), một thành phần phần cứng thực thi lệnh, không phải tính năng của ngôn ngữ. Phương án "A conditional statement" là câu lệnh điều kiện như if, elif, else dùng để rẽ nhánh; input không quyết định nhánh nào chạy mà chỉ nhận dữ liệu vào.
Mở trang câu hỏi này →
A==
B>=
C<=
D=
Lời giải
Đáp án đúng: "=". Dấu bằng đơn là toán tử gán (assignment): x = 5 lấy giá trị bên phải cất vào biến bên trái, không trả lời câu hỏi đúng hay sai nào, nên nó không phải toán tử so sánh hay logic. Trong Python, viết dấu gán đơn trong điều kiện if là lỗi cú pháp, chính để tránh nhầm với so sánh. "==" là toán tử so sánh bằng, cho True khi hai vế có giá trị bằng nhau, ví dụ 3 == 3.0 là True. ">=" so sánh lớn hơn hoặc bằng, như 5 >= 5 cho True. "<=" so sánh nhỏ hơn hoặc bằng, như 2 <= 1 cho False. Cả ba toán tử này đều trả về giá trị bool nên thuộc nhóm toán tử so sánh, vì vậy không được chọn ở câu hỏi phủ định này; chỉ dấu gán là ngoại lệ.
Mở trang câu hỏi này →
Đề bài
if x < 2:
    print('Below 2')
elif x >= 2:
    print('Two or more')
else:
    print('Something else')
Ax = -2.0
BThis code will never print 'Something else' regardless of the value for 'x'
Cx = 2.0
Dx = -22
Lời giải
Đáp án đúng: "This code will never print 'Something else' regardless of the value for 'x'". Câu dẫn hỏi giá trị của x sau khi chạy, nhưng đoạn mã không hề gán x và các phương án là của câu hỏi gốc "giá trị nào của x làm in ra Something else", nên phải đọc câu hỏi theo nghĩa nhánh else. Hai điều kiện x < 2 và x >= 2 bù nhau, phủ kín mọi số thực, nên với bất kỳ giá trị số nào một trong hai nhánh đầu luôn chạy và nhánh else không bao giờ tới được (mã chết, dead code). "x = -2.0" sai vì -2.0 < 2 nên in Below 2. "x = 2.0" sai vì 2.0 >= 2 nên in Two or more. "x = -22" sai vì -22 < 2 nên cũng in Below 2. Lưu ý riêng: giá trị float('nan') làm mọi phép so sánh đều sai nên sẽ lọt xuống else, đây là ngoại lệ hiếm ngoài phạm vi câu hỏi.
Mở trang câu hỏi này →
Apython hello.py
Brun hello.py
Cexecute hello.py
Dopen hello.py
Lời giải
Đáp án đúng: "python hello.py". Để chạy một script, ta gọi trình thông dịch Python ở dòng lệnh (terminal hoặc Command Prompt) và truyền tên tệp làm đối số; trình thông dịch đọc tệp rồi thực thi lần lượt từng câu lệnh từ trên xuống. Tuỳ hệ thống, lệnh có thể là python3 hello.py trên Linux, macOS hoặc py hello.py trên Windows, nhưng bản chất đều là gọi trình thông dịch kèm tên tệp. "run hello.py" không phải lệnh chuẩn của hệ điều hành; một số IDE có nút Run, IPython có lệnh đặc biệt %run, nhưng ở dòng lệnh thông thường thì không có. "execute hello.py" cũng không phải lệnh có sẵn trên hệ điều hành phổ biến nào. "open hello.py" trên macOS chỉ mở tệp bằng ứng dụng mặc định, thường là trình soạn thảo, còn trong Python thì open() là hàm mở tệp để đọc hoặc ghi, không thực thi mã trong tệp.
Mở trang câu hỏi này →
Awhile
Bpayroll
Cnames
Dpizza
Lời giải
Đáp án đúng: "while". Từ khoá (reserved word) là những từ Python dành riêng cho cú pháp, không được dùng làm tên biến hay tên hàm; while mở một vòng lặp chạy lặp lại khi điều kiện còn đúng, cùng nhóm với if, for, def, return, import, True, None. Viết while = 5 sẽ báo SyntaxError. Phương án "payroll" chỉ là một định danh (identifier) bình thường, hợp lệ để đặt tên biến như payroll = 1000, Python không gán nghĩa đặc biệt nào cho nó. Phương án "names" cũng là tên tự do, hay dùng cho một list chứa các tên, không phải từ khoá. Phương án "pizza" là tên biến hợp lệ hoàn toàn; Python không hiểu nghĩa của tên biến, chỉ cần tên bắt đầu bằng chữ cái hoặc dấu gạch dưới và không trùng từ khoá. Có thể xem danh sách từ khoá đầy đủ bằng import keyword rồi in keyword.kwlist.
Mở trang câu hỏi này →
15For the following code: astr = 'Hello Bob'4 lựa chọncó code
Đề bài
istr = 0
try:
    istr = int(astr)
except:
    istr = -1

What will the value be for istr after this code executes?

A-1
BIt will be the 'Not a number' value (i.e. NaN)
CIt will be a random number depending on the operating system the program runs on
Dfalse
Lời giải
Đáp án đúng: "-1". Lần theo mã: istr được gán 0, rồi vào khối try gọi int(astr) với astr = 'Hello Bob'. Chuỗi này không biểu diễn số nguyên nên int() phát sinh ValueError; ngoại lệ làm phép gán istr = int(astr) không bao giờ hoàn tất, luồng chạy nhảy sang khối except, nơi istr được gán -1. Vì vậy sau đoạn mã istr bằng -1. Đây là mẫu try/except quen thuộc để chương trình không dừng khi người dùng nhập sai. "It will be the 'Not a number' value (i.e. NaN)" sai vì int() không trả về NaN khi gặp chuỗi lạ mà ném ngoại lệ; NaN là giá trị float đặc biệt, chỉ có qua float('nan') hay phép tính số thực. "It will be a random number depending on the operating system the program runs on" sai vì Python xử lý giống nhau trên mọi hệ điều hành và không sinh số ngẫu nhiên ở đây. "false" sai vì không có dòng nào gán giá trị bool; vả lại Python viết hằng này là False với chữ hoa đầu.
Mở trang câu hỏi này →
A<class int>
B<class str>
C<class float>
D<class bool>
Lời giải

Đáp án đúng: "<class float> ". Hàm type() trả về kiểu (class) của đối tượng; số 3.2 có dấu chấm thập phân nên là số thực dấu phẩy động (floating-point), kiểu float, và Python 3 hiển thị kiểu dưới dạng <class 'float'>, phương án chỉ lược bỏ dấu nháy quanh tên kiểu. "<class int> " sai vì int là kiểu số nguyên, chỉ dành cho literal không có phần thập phân như 3; muốn ra int phải ép int(3.2), khi đó còn 3. "<class str> " sai vì 3.2 không đặt trong dấu nháy; chỉ '3.2' mới là chuỗi. "<class bool> " sai vì bool chỉ có hai giá trị True và False, dù 3.2 được coi là "truthy" khi đặt trong điều kiện if thì kiểu của nó vẫn là float.

Mở trang câu hỏi này →
AAddition +
BMultiplication *
CSubtraction -
DParentheses ()
Lời giải
Đáp án đúng: "Parentheses ()". Python tính biểu thức theo thứ tự ưu tiên toán tử (operator precedence): ngoặc tròn cao nhất, tiếp theo là luỹ thừa, rồi nhóm nhân, chia, chia lấy phần nguyên và chia lấy dư, cuối cùng là cộng và trừ; các toán tử cùng mức được tính từ trái sang phải. Vì vậy (1 + 2) * 3 cho 9, còn 1 + 2 * 3 cho 7. Ngoặc là công cụ để người viết ép thứ tự tính và làm biểu thức dễ đọc. "Multiplication *" được ưu tiên hơn cộng trừ nhưng vẫn đứng sau ngoặc: trong 2 * (3 + 4) phép cộng trong ngoặc được tính trước. "Addition +" thuộc mức ưu tiên thấp nhất trong nhóm số học nên được tính sau cùng. "Subtraction -" cùng mức với phép cộng, được tính từ trái sang phải cùng với cộng, cũng sau nhân chia và sau ngoặc.
Mở trang câu hỏi này →
A2
B6
C3
D5
Lời giải
Đáp án đúng: "2". Lần theo mã: dòng 1 gán aStr = 'Hello Bob' chạy bình thường; dòng 2 gọi int(aStr) nhưng chuỗi 'Hello Bob' không phải số nên Python ném ValueError, và vì không có try/except, chương trình dừng ngay tại đó. Cần nói thẳng: theo nghĩa chặt, dòng cuối cùng chạy thành công là dòng 1, vì dòng 2 bắt đầu thực thi nhưng thất bại; dòng 1 không có trong các lựa chọn, nên đáp án chốt là 2, tức dòng cuối cùng được thực thi, nơi chương trình dừng lại. Phương án "3" không bao giờ chạy vì chương trình đã dừng ở dòng 2; ngoài ra printf không tồn tại trong Python (hàm in là print), nên dù có tới được đây cũng ném NameError. Phương án "5" không được chạy tới, dù int('123') bản thân là hợp lệ và cho 123. Phương án "6" cũng không được chạy tới, và vì lại dùng printf nên nếu chạy cũng lỗi NameError.
Mở trang câu hỏi này →
AA variable
BA constant
CA parameter
DA pointer
Lời giải
Đáp án đúng: "A constant". 98.6 là một hằng (constant), hay literal: giá trị viết thẳng trong mã, cố định, không đổi khi chương trình chạy; ở đây là hằng số thực kiểu float. Python chỉ việc đưa giá trị đó cho print để in ra màn hình. "A variable" sai vì biến là một cái tên như x hay temp gắn với giá trị và có thể gán lại; 98.6 không phải tên, không thể viết 98.6 = 5. "A parameter" chưa đúng trọng tâm: tham số là tên biến trong phần định nghĩa hàm, dùng để nhận giá trị truyền vào; 98.6 là đối số (argument) được truyền cho print, nhưng bản thân nó vẫn là một hằng. "A pointer" sai vì Python không cho lập trình viên thao tác con trỏ như ngôn ngữ C; mọi tên chỉ là tham chiếu tới đối tượng, và 98.6 càng không phải một con trỏ.
Mở trang câu hỏi này →
A3.2e-3
B3.2e3
C0.32
D32e-3
Lời giải
Đáp án đúng: "3.2e3". Python viết số thực theo ký hiệu khoa học (scientific notation) bằng chữ e: phần trước e là phần định trị, phần sau e là số mũ cơ số 10, nên 3.2×10³ viết là 3.2e3 và có giá trị 3200.0, luôn mang kiểu float. "3.2e-3" sai vì số mũ âm nghĩa là 3.2×10⁻³ = 0.0032, nhầm dấu của số mũ. "0.32" sai vì đó là 3.2×10⁻¹, chỉ dời dấu chấm một chỗ sang trái. "32e-3" sai vì bằng 32×10⁻³ = 0.032, vừa đổi định trị vừa đổi dấu số mũ. Mẹo kiểm tra: gõ 3.2e3 == 3200 vào trình thông dịch sẽ được True.
Mở trang câu hỏi này →