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ố 2

48 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/48 câuCòn 28
A**
B//
Cis
Dnot in
Lời giải
Đáp án đúng: "not in". not in là toán tử thành viên (membership operator): biểu thức x not in s cho True khi x không có mặt trong dãy s và False khi có, tức phủ định của toán tử in; ví dụ 'z' not in 'abc' cho True, còn 2 not in [1, 2, 3] cho False. "**" là toán tử luỹ thừa: 2 ** 3 cho 8, không liên quan việc tìm phần tử. "//" là phép chia lấy phần nguyên (floor division): 7 // 2 cho 3. "is" là toán tử định danh (identity operator), cho True khi hai biến cùng trỏ tới một đối tượng trong bộ nhớ, ví dụ x is None; nó không kiểm tra phần tử có nằm trong dãy hay không, và dạng phủ định của nó là is not chứ không liên quan tới dãy.
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 →
AUse constraints
BAvoid using JOIN
CUse SELECT instead of DELETE
DRun rollback
Lời giải
Đáp án đúng: "Use constraints". Trong cơ sở dữ liệu quan hệ, ràng buộc (constraint) như khoá ngoại FOREIGN KEY kèm quy tắc ON DELETE RESTRICT hoặc NO ACTION buộc hệ quản trị từ chối lệnh xoá một dòng ở bảng cha khi vẫn còn dòng ở bảng con tham chiếu tới nó; đó là cơ chế toàn vẹn tham chiếu (referential integrity) do chính cơ sở dữ liệu thực thi, không phụ thuộc vào việc lập trình viên nhớ kiểm tra (SQLite cần bật PRAGMA foreign_keys = ON). "Avoid using JOIN" sai vì JOIN chỉ là cách ghép dòng khi đọc dữ liệu, không liên quan tới việc xoá. "Use SELECT instead of DELETE" sai vì SELECT chỉ đọc, đổi lệnh như vậy là bỏ luôn thao tác xoá chứ không bảo vệ dữ liệu liên kết. "Run rollback" sai vì rollback chỉ huỷ một giao dịch chưa commit sau khi đã lỡ xoá, không ngăn được việc xoá ngay từ đầu.
Mở trang câu hỏi này →
AName of user 2
BID of user 2
CFull recordset of user 2
DAn error occurred
Lời giải
Đáp án đúng: "Name of user 2". Câu truy vấn chỉ liệt kê đúng một cột sau SELECT là name, nên kết quả chỉ chứa giá trị của cột name; mệnh đề WHERE id=2 lọc ra dòng có id bằng 2, và vì đã bảo đảm có người dùng này, kết quả là một dòng chứa tên của người dùng số 2. Trong Python với sqlite3, gọi fetchone() sẽ nhận một tuple một phần tử như ('Chuck',). Phương án "ID of user 2" sai vì id chỉ dùng để lọc trong WHERE chứ không nằm trong danh sách cột được chọn. Phương án "Full recordset of user 2" chỉ đúng nếu viết SELECT * FROM Users WHERE id=2, khi đó mọi cột mới được trả về. Phương án "An error occurred" sai vì câu lệnh đúng cú pháp và dòng cần tìm chắc chắn tồn tại; kể cả khi không có dòng nào khớp, SQL cũng chỉ trả về tập rỗng chứ không báo lỗi.
Mở trang câu hỏi này →
AThe values of x and y are unchanged
BBoth x and y are -5
CBoth x and y are 5
DThe values of x and y are swapped
Lời giải
Đáp án đúng: "The values of x and y are unchanged". Lần theo vế phải: tuple (y, x) được tạo trước với giá trị (-5, 5), sau đó lát cắt [::-1] đảo ngược tuple thành (5, -5); cuối cùng phép gán nhiều biến (tuple unpacking) gán phần tử đầu cho x và phần tử sau cho y, nên x = 5 và y = -5, đúng như ban đầu. Việc đảo hai lần (đổi chỗ khi tạo tuple rồi đảo lại bằng [::-1]) triệt tiêu nhau. "The values of x and y are swapped" chỉ đúng nếu viết x, y = (y, x) mà không có [::-1]. "Both x and y are -5" sai vì x nhận 5, không có bước nào chép -5 vào cả hai biến. "Both x and y are 5" sai vì y nhận phần tử thứ hai của (5, -5) là -5.
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 →
Đề bài
print(
    '$100 $200 $300'.count('$'),
    '$100 $200 $300'.count('$', 5, 10),
    '$100 $200 $300'.count('$', 5)
)
A3 1 2
B3 1 1
C3 2 1
D3 1 0
Lời giải
Đáp án đúng: "3 1 2". Phương thức str.count(sub, start, end) đếm số lần sub xuất hiện trong lát cắt từ start đến trước end. Chuỗi '$100 $200 $300' có ba dấu đô la ở vị trí 0, 5 và 10. Lời gọi thứ nhất không có giới hạn nên đếm cả ba, cho 3. Lời gọi thứ hai xét vị trí 5 đến 9: chỉ có dấu ở vị trí 5, còn vị trí 10 nằm ngoài vì end không được tính, cho 1. Lời gọi thứ ba chỉ có start = 5 nên xét từ 5 đến hết chuỗi, gặp dấu ở 5 và 10, cho 2. print nhận ba đối số và in chúng cách nhau bởi dấu cách. "3 1 1" sai ở giá trị cuối, quên rằng thiếu end thì đếm tới cuối chuỗi nên vị trí 10 được tính. "3 2 1" đổi chỗ hai kết quả sau, như thể lời gọi thứ hai lấy cả vị trí 10 còn lời gọi thứ ba bỏ sót. "3 1 0" coi như lời gọi thứ ba không thấy dấu nào, có lẽ do nhầm start là vị trí kết thúc.
Mở trang câu hỏi này →
A21
B[4, 5, 6]
C15
D6
Lời giải
Đáp án đúng: "6". Dấu cộng giữa hai danh sách là phép nối (concatenation): a + b tạo danh sách mới [1, 2, 3, 4, 5, 6], nên len(c) đếm số phần tử và cho 6. Dòng print len(c) là cú pháp Python 2, nơi print là câu lệnh; trên Python 3 phải viết print(len(c)), còn kết quả vẫn là 6. "21" sai vì đó là tổng các phần tử 1 + 2 + ... + 6, tức sum(c), không phải độ dài. "15" sai vì đó là tổng 4 + 5 + 6 của riêng b, hoặc nhầm phép cộng thành cộng từng giá trị. "[4, 5, 6]" sai vì đó là chính danh sách b; dấu cộng không ghi đè a bằng b, và len trả về một số chứ không trả về danh sách.
Mở trang câu hỏi này →
AIt's syntax is simpler and aligns with JavaScript
BIt is more verbose
CIt is human-unreadable
DIt requires no formatting
Lời giải
Đáp án đúng: "It's syntax is simpler and aligns with JavaScript". JSON (JavaScript Object Notation) biểu diễn dữ liệu bằng đối tượng, mảng, chuỗi và số theo đúng cú pháp literal của JavaScript, không cần thẻ mở thẻ đóng như XML, nên gọn hơn, dễ phân tích và ánh xạ thẳng sang dict, list trong Python (qua json.loads); vì vậy JSON được ưa dùng cho REST API. "It is more verbose" sai vì dài dòng (verbose) là nhược điểm của XML với các thẻ lặp tên, và nếu đúng thì đó cũng không phải ưu điểm. "It is human-unreadable" sai vì JSON là văn bản thuần, người đọc được dễ dàng. "It requires no formatting" sai vì JSON có quy tắc định dạng chặt: khoá phải đặt trong nháy kép, không có dấu phẩy thừa, chuỗi dùng nháy kép; sai định dạng thì bộ phân tích báo lỗi.
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 →
Aisinstance()
Brepr()
Cdiff()
Dmap()
Lời giải
Đáp án đúng: "diff()". Câu hỏi phủ định nên cần tìm tên KHÔNG phải hàm dựng sẵn (built-in function) của Python, tức hàm dùng được ngay mà không cần import. Python không có hàm dựng sẵn tên diff; muốn so sánh khác biệt giữa hai dãy văn bản phải import module difflib, còn hiệu giữa các phần tử liên tiếp của mảng là numpy.diff thuộc thư viện ngoài. "isinstance()" là hàm dựng sẵn thật, isinstance(obj, cls) kiểm tra đối tượng có thuộc một lớp hay không, nên không được chọn. "repr()" cũng là hàm dựng sẵn, trả về chuỗi biểu diễn chính thức của đối tượng, thường dùng khi gỡ lỗi. "map()" là hàm dựng sẵn áp một hàm lên từng phần tử của iterable và trả về một iterator, ví dụ list(map(int, ['1', '2'])) cho [1, 2].
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 →
Đề 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 →
Astrip()
Blen()
Cptrim()
Dtrim()
Lời giải
Đáp án đúng: "strip()". Phương thức str.strip() trả về bản sao của chuỗi đã bỏ khoảng trắng (whitespace) ở cả đầu lẫn cuối, gồm dấu cách, tab và ký tự xuống dòng; ví dụ ' Hello Bob '.strip() cho 'Hello Bob', còn khoảng trắng ở giữa vẫn giữ nguyên. Hai biến thể của nó là lstrip() chỉ bỏ bên trái và rstrip() chỉ bỏ bên phải. Phương án "len()" là hàm dựng sẵn trả về độ dài chuỗi, không thay đổi nội dung chuỗi. Phương án "ptrim()" không tồn tại trong Python, chỉ là tên bịa gần giống trim. Phương án "trim()" là tên hàm tương ứng trong JavaScript, Java hay PHP; Python không có phương thức trim cho chuỗi, gọi nó sẽ ném AttributeError.
Mở trang câu hỏi này →
AYou omit the semicolon ; on the last line of the if block
BYou de-indent the next line past the if block to the same level of indent as the original if statement
CYou put the colon : character on a line by itself to indicate we are done with the if block
DYou use a curly brace { after the last line of the if block
Lời giải

Đáp án đúng: "You de-indent the next line past the if block to the same level of indent as the original if statement". Python dùng thụt lề (indentation) để đánh dấu khối lệnh: mọi dòng thuộc khối if phải thụt vào cùng một mức sau dấu hai chấm, và khối kết thúc khi gặp dòng đầu tiên lùi lề (de-indent) về đúng mức của chính câu lệnh if; dòng đó là lệnh kế tiếp nằm ngoài khối. Phương án "You omit the semicolon ; on the last line of the if block" sai vì Python không dùng dấu chấm phẩy để kết thúc lệnh hay khối; dấu chấm phẩy chỉ tuỳ chọn khi ghép hai lệnh trên một dòng. Phương án "You put the colon : character on a line by itself to indicate we are done with the if block" sai vì dấu hai chấm đặt ở cuối dòng if để mở khối chứ không đóng khối, và đứng riêng một dòng sẽ gây SyntaxError. Phương án "You use a curly brace { after the last line of the if block" là lối viết của Java hay JavaScript, vốn bao khối bằng cặp ngoặc nhọn; Python không dùng ngoặc nhọn cho khối lệnh, trong Python ngoặc nhọn dùng để tạo dict hoặc set.

Mở trang câu hỏi này →
A123abc
B123+abc
CThis is a syntax error because you cannot add strings
Dhello world
Lời giải
Đáp án đúng: "123abc". Hai toán hạng đều là chuỗi vì nằm trong dấu nháy kép, nên chuỗi 123 ở đây không phải số 123. Với chuỗi, toán tử + là phép nối (concatenation): ghép chuỗi bên phải vào cuối chuỗi bên trái mà không chèn dấu cách, nên kết quả là 123abc. Muốn cộng số phải đổi bằng int() trước, còn trộn chuỗi với số nguyên sẽ gây TypeError. "123+abc" sai vì dấu + là toán tử được thực hiện, không bị in ra như một ký tự trong kết quả. "This is a syntax error because you cannot add strings" sai vì cộng hai chuỗi là hợp lệ; lỗi chỉ xảy ra khi trộn chuỗi với số, và đó là lỗi kiểu TypeError lúc chạy chứ không phải lỗi cú pháp. "hello world" không liên quan gì tới đoạn mã, trong lệnh không có chữ hello hay world nào.
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 →
ATRUE
BFALSE
Lời giải
Đáp án đúng: "FALSE". Phát biểu cho rằng biết từ vựng (vocabulary) của Python, tức các từ khoá như if, for, def, while và hàm dựng sẵn, là đủ giải mọi bài toán lập trình; điều này sai. Từ vựng chỉ như biết các từ của một ngôn ngữ, còn muốn giải bài toán phải biết ghép chúng thành câu đúng cú pháp (syntax), tổ chức thành cấu trúc như tuần tự, rẽ nhánh, lặp, và quan trọng nhất là tư duy giải thuật: phân tích yêu cầu, chia nhỏ vấn đề, chọn cấu trúc dữ liệu, rồi kể "câu chuyện" bằng mã. Ví như biết hết từ trong từ điển chưa giúp ai viết được tiểu thuyết. Vì vậy "TRUE" không được chọn: nó đánh đồng việc biết từ khoá với kỹ năng lập trình, bỏ qua cú pháp, logic và khả năng gỡ lỗi.
Mở trang câu hỏi này →
A"foo'bar"
B'foo"bar'
C"""foo'bar"""
D'foo'bar'
Lời giải
Đáp án đúng: ""foo'bar"". Chuỗi foo'bar chứa một dấu nháy đơn, nên cách tự nhiên là bao nó bằng nháy kép: bên trong cặp nháy kép, dấu nháy đơn chỉ là một ký tự bình thường, không kết thúc chuỗi. Cần nói thẳng: chuỗi nháy ba """foo'bar""" cũng hợp lệ và tạo ra đúng giá trị foo'bar, vì trong chuỗi nháy ba cả nháy đơn lẫn nháy kép đều được phép; câu này vốn có thể chọn nhiều cách, nhưng ở đây chỉ cho chọn một nên đáp án lấy cách viết bằng nháy kép, là cách thông dụng nhất. Phương án "'foo"bar'" hợp lệ về cú pháp nhưng tạo ra chuỗi foo"bar chứa dấu nháy kép, khác giá trị cần có. Phương án "'foo'bar'" lỗi cú pháp: dấu nháy đơn thứ hai đóng chuỗi ngay sau foo, phần bar' còn lại khiến Python báo SyntaxError; muốn dùng nháy đơn bao ngoài thì phải thoát dấu nháy bên trong thành 'foo\'bar'.
Mở trang câu hỏi này →
A4
B2
C4.2
D0.42
Lời giải
Đáp án đúng: "2". Toán tử % trong Python là phép lấy phần dư (modulo): a % b cho số dư khi chia a cho b. 42 chia 10 được thương nguyên 4 và dư 2, vì 4 × 10 = 40 và 42 − 40 = 2, nên 42 % 10 bằng 2. Phép này hay dùng để lấy chữ số hàng đơn vị của một số hoặc kiểm tra chẵn lẻ bằng n % 2. "4" là thương của phép chia lấy phần nguyên, tức kết quả của 42 // 10, không phải phần dư. "4.2" là kết quả của phép chia thường 42 / 10, luôn cho số thực float trong Python 3. "0.42" là 42 chia cho 100, không ứng với phép toán nào trong biểu thức; nó có thể đến từ việc hiểu nhầm % là phần trăm.
Mở trang câu hỏi này →