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 đề. Trang 2/3 — câu 21–40.

Danh sách câu hỏi

40/46 câuCòn 6
AreplaceString()
Brepl()
Cswitch()
Dreplace()
Lời giải
Đáp án đúng: "replace()". Chuỗi Python có phương thức replace(old, new) trả về một chuỗi MỚI trong đó mọi lần xuất hiện của old được thay bằng new, có thể thêm đối số thứ ba để giới hạn số lần thay; ví dụ 'Hello Bob'.replace('Bob', 'Jane') cho 'Hello Jane'. Vì chuỗi là bất biến (immutable), chuỗi gốc không đổi, phải gán kết quả vào biến nếu muốn giữ. "replaceString()" là kiểu tên tự đặt giống Java, không tồn tại trong kiểu str, gọi sẽ gây AttributeError. "repl()" không phải phương thức chuỗi; REPL là tên vòng đọc, thực thi, in của chế độ tương tác, còn thay thế theo biểu thức chính quy thì dùng hàm re.sub. "switch()" không có trong str; switch là câu lệnh rẽ nhánh của C hay Java, còn Python từ bản 3.10 dùng match và case cho việc đó.
Mở trang câu hỏi này →
A{}
B()
C[]
DNone
Lời giải

Đáp án đúng: "[]". Cặp ngoặc vuông rỗng tạo một list (danh sách) rỗng, ví dụ friends = [], sau đó có thể thêm phần tử bằng friends.append('Joe'); cách viết tương đương là gọi hàm list(). Phương án "{}" tạo một dict (từ điển) rỗng chứ không phải list, và cũng không phải set rỗng, vì set rỗng phải viết set(). Phương án "()" tạo một tuple rỗng; tuple giống list ở chỗ giữ thứ tự phần tử nhưng là kiểu bất biến (immutable), không append được. Phương án "None" là giá trị đặc biệt biểu thị không có giá trị, thuộc kiểu NoneType; biến bằng None không phải list và gọi append trên nó sẽ ném AttributeError. Có thể tự kiểm bằng type([]), kết quả là lớp list.

Mở trang câu hỏi này →
Afunction_name arguments
Bfunction_name(arguments)
Cfunction_name[arguments]
Lời giải
Đáp án đúng: "function_name(arguments)". Gọi hàm (function call) trong Python là viết tên hàm rồi đặt đối số trong cặp ngoặc tròn, các đối số cách nhau bởi dấu phẩy, ví dụ print('Hi'), max('Hello world') hay len(lst). Ngay cả khi không có đối số vẫn phải có ngoặc rỗng, như input(); chỉ viết tên hàm thì Python hiểu là chính đối tượng hàm chứ không chạy nó. "function_name arguments" giống cách gõ lệnh trong shell hoặc lệnh print của Python 2; ở Python 3 hai tên đứng cạnh nhau không có toán tử là lỗi cú pháp. "function_name[arguments]" dùng ngoặc vuông, vốn là cú pháp truy cập phần tử theo chỉ số hoặc theo key của list, chuỗi, dict; áp lên một hàm sẽ gây TypeError vì hàm không hỗ trợ kiểu truy cập này.
Mở trang câu hỏi này →
ASyntaxError
BIndexError
CFileNotFoundError
DNameError
Lời giải
Đáp án đúng: "FileNotFoundError". Khi mở tệp bằng open('ten.txt') mà tệp không tồn tại, Python 3 phát sinh FileNotFoundError, một lớp con của OSError; đây là lỗi lúc chạy (runtime) điển hình mà ta bọc lời gọi open trong try/except để báo cho người dùng và thoát gọn thay vì để chương trình đổ traceback. "SyntaxError" sai vì lỗi cú pháp phát hiện khi biên dịch, trước khi khối try kịp chạy, nên không bắt được bằng try/except trong cùng tệp. "IndexError" sai vì nó phát sinh khi truy cập chỉ số vượt ngoài danh sách hoặc chuỗi, không gắn với việc mở tệp. "NameError" sai vì nó báo dùng tên biến chưa định nghĩa; bắt nó cũng được nhưng đó là lỗi lập trình, không phải lỗi đặc trưng khi làm việc với tệp.
Mở trang câu hỏi này →
Aconnect
Bresend
Creject
Ddisconnect
Lời giải
Đáp án đúng: "connect". Lời gọi chặn (blocking call) là lời gọi khiến chương trình dừng lại chờ tới khi thao tác hoàn tất mới trả về. Với socket ở chế độ mặc định, connect() chặn cho tới khi bắt tay ba bước của TCP xong hoặc thất bại; tương tự recv() chặn chờ dữ liệu và accept() chặn chờ kết nối tới. Câu hỏi viết ở số nhiều nhưng chỉ có connect là lời gọi chặn chuẩn, nên chỉ chọn một. "resend" không phải phương thức của socket; việc gửi lại gói tin bị mất do TCP tự làm bên trong hệ điều hành, chương trình không gọi. "reject" cũng không phải lời gọi socket; máy chủ từ chối kết nối bằng cách không lắng nghe hoặc đóng kết nối, phía khách nhận ConnectionRefusedError. "disconnect" không tồn tại trong module socket; ngắt kết nối dùng close() hoặc shutdown(), và ở chế độ mặc định chúng trả về ngay chứ không chờ sự kiện.
Mở trang câu hỏi này →
AOne or more digits
BSeveral digits followed by a plus sign
CAny mathematical expression
DAny number of digits at the beginning of a line
EZero or more digits
Lời giải
Đáp án đúng: "One or more digits". Trong biểu thức chính quy (regular expression), [0-9] là một lớp ký tự (character class) khớp đúng một chữ số từ 0 tới 9, còn dấu + đứng sau nghĩa là phần đứng trước được lặp một lần trở lên; ghép lại, [0-9]+ khớp một dãy liền gồm ít nhất một chữ số, như 7 hay 2024. Phương án "Several digits followed by a plus sign" sai vì + ở đây là ký tự đặc biệt chỉ số lần lặp; muốn khớp dấu cộng thật phải thoát thành \+. Phương án "Any mathematical expression" sai vì mẫu chỉ khớp chữ số, không khớp toán tử hay khoảng trắng. Phương án "Any number of digits at the beginning of a line" sai vì mẫu không có ký tự neo ^ nên có thể khớp ở bất kỳ vị trí nào trong dòng. Phương án "Zero or more digits" mô tả mẫu [0-9]* dùng dấu sao, chứ không phải dấu cộng.
Mở trang câu hỏi này →
AA variable
BA built-in function
Ckeyword
DA data type
Lời giải

Đáp án đúng: "A built-in function". Trong biểu thức type(32), type được gọi như một hàm có sẵn (built-in function): Python cung cấp sẵn, không cần import, nó nhận đối tượng 32 và trả về kiểu của nó, in ra <class 'int'>. Dạng tên, ngoặc tròn, đối số chính là một lời gọi hàm. "A variable" sai vì type không phải tên do người lập trình đặt ra để chứa dữ liệu; về kỹ thuật vẫn gán đè được nhưng việc đó nên tránh. "keyword" sai vì từ khoá là các từ dành riêng như if, def, while, không gán được và không gọi được; type không nằm trong danh sách đó. "A data type" là chỗ dễ phân vân: trong Python 3, type về bản chất là một lớp, kiểu của mọi kiểu, nhưng trong biểu thức này nó được dùng để hỏi kiểu của 32; kiểu dữ liệu ở đây là int, còn type đóng vai trò hàm có sẵn trả lời câu hỏi đó.

Mở trang câu hỏi này →
Asocket.sendto(address, data)
Bsocket.address()
Csocket.sendto(data, address)
Dsocket.data
Lời giải
Đáp án đúng: "socket.sendto(data, address)". Với socket UDP (SOCK_DGRAM) không có kết nối cố định, phương thức sendto của đối tượng socket gửi dữ liệu tới một địa chỉ chỉ định trong từng lần gọi; theo tài liệu Python, đối số đầu là dữ liệu dạng bytes, đối số sau là địa chỉ, thường là tuple (host, port), ví dụ s.sendto(b'hello', ('127.0.0.1', 9999)). "socket.sendto(address, data)" sai vì đảo thứ tự đối số; truyền tuple địa chỉ vào chỗ dữ liệu sẽ gây TypeError. "socket.address()" sai vì socket không có phương thức address; lấy địa chỉ dùng getsockname() hoặc getpeername(). "socket.data" sai vì đây không phải lời gọi phương thức và socket không có thuộc tính data; nhận dữ liệu dùng recv hoặc recvfrom.
Mở trang câu hỏi này →
A[123, 'john', 123, 'john']
B[123, 'john'] * 2
CError
DNone of the others
Lời giải
Đáp án đúng: "[123, 'john', 123, 'john']". Toán tử nhân giữa một list và một số nguyên n tạo ra list mới bằng cách nối list đó với chính nó n lần (phép lặp, repetition), không nhân từng phần tử như mảng NumPy, nên tinylist nhân 2 cho list bốn phần tử như trên. Cách viết print không ngoặc là của Python 2; ở Python 3 viết print(tinylist * 2) cho cùng kết quả. "[123, 'john'] * 2" là biểu thức chứ không phải kết quả: print tính giá trị trước rồi in giá trị đó, không in lại nguyên văn biểu thức. "Error" sai vì list hỗ trợ nhân với số nguyên; TypeError chỉ xảy ra khi nhân list với list hoặc với số thực. "None of the others" sai vì đã có một kết quả khớp đúng với cách Python tính. Tương tự, chuỗi cũng lặp được: 'ab' * 3 cho 'ababab'.
Mở trang câu hỏi này →
AMAKE people;
BCREATE TABLE people;
CMAKE DATASET people;
DCREATE people;
Lời giải

Đáp án đúng: "CREATE TABLE people; ". Câu lệnh tạo bảng mới trong SQL bắt đầu bằng hai từ khoá CREATE TABLE rồi tới tên bảng; trong thực tế còn kèm danh sách cột trong ngoặc, ví dụ CREATE TABLE people (name TEXT, email TEXT), và SQLite đòi ít nhất một cột mới chịu chạy. Dù viết rút gọn, đây là lựa chọn duy nhất dùng đúng cặp từ khoá tạo bảng. Phương án "MAKE people;" sai vì SQL không có từ khoá MAKE. Phương án "MAKE DATASET people;" cũng không tồn tại; dataset chỉ là khái niệm chung về tập dữ liệu chứ không phải lệnh SQL. Phương án "CREATE people; " thiếu từ chỉ loại đối tượng: sau CREATE phải nói rõ tạo gì, như TABLE, INDEX hay VIEW, nên câu này lỗi cú pháp.

Mở trang câu hỏi này →
Afruit[5]
Bfruit[-1]
Cfruit[6]
Dfruit[-2]
Lời giải
Đáp án đúng: "fruit[6]". Chuỗi banana dài 6 ký tự, chỉ số dương chạy từ 0 đến 5 (b, a, n, a, n, a), còn chỉ số âm chạy từ -1 đến -6, đếm ngược từ cuối. Truy cập một chỉ số nằm ngoài khoảng đó gây IndexError: string index out of range. fruit[6] vượt chỉ số lớn nhất là 5 nên lỗi; đây là lỗi kinh điển khi quên rằng chỉ số bắt đầu từ 0, tức vị trí cuối là len(fruit) - 1. "fruit[5]" hợp lệ, trả về 'a' là ký tự cuối. "fruit[-1]" hợp lệ, cũng là ký tự cuối 'a', vì -1 nghĩa là vị trí cuối cùng. "fruit[-2]" hợp lệ, trả về 'n' là ký tự áp chót. Ba cách viết này đều lấy được một ký tự có thật nên không gây lỗi.
Mở trang câu hỏi này →
Ainverted
BUnicode
CEBCDIC
DUTF-16
Ebubble memory
Lời giải
Đáp án đúng: "Unicode". Trong Python 3 mọi chuỗi str đều là chuỗi Unicode: mỗi phần tử là một điểm mã (code point) Unicode, nên chuỗi tiếng Việt hay tiếng Nhật được xử lý như nhau; còn dữ liệu byte thô là kiểu bytes riêng, phải encode/decode (thường bằng UTF-8) khi đọc ghi mạng hoặc tệp. Đây là khác biệt lớn so với Python 2, nơi str mặc định là byte. "UTF-16" sai vì đó là một cách mã hoá cụ thể; từ Python 3.3 (PEP 393), CPython lưu chuỗi theo biểu diễn linh hoạt 1, 2 hoặc 4 byte mỗi ký tự tuỳ ký tự lớn nhất, không cố định UTF-16. "EBCDIC" sai vì đó là bảng mã cũ của máy IBM, không dùng cho chuỗi Python. "inverted" sai vì không có cách lưu "đảo ngược" nào. "bubble memory" sai vì đó là một công nghệ bộ nhớ phần cứng cũ, không phải cách mã hoá chuỗi.
Mở trang câu hỏi này →
AGROUP BY
BORDER BY
CWHERE
DNone of these
Lời giải
Đáp án đúng: "ORDER BY". Mệnh đề ORDER BY sắp xếp tập kết quả của truy vấn theo một hay nhiều cột, tăng dần với ASC (mặc định) hoặc giảm dần với DESC, ví dụ SELECT name FROM Users ORDER BY name. Không có ORDER BY thì cơ sở dữ liệu không bảo đảm thứ tự nào. "GROUP BY" gom các dòng có cùng giá trị thành từng nhóm để tính hàm tổng hợp như COUNT hay SUM; một số hệ có thể tình cờ trả kết quả theo thứ tự nhóm nhưng chuẩn SQL không cam kết điều đó, nên muốn sắp xếp vẫn phải dùng ORDER BY. "WHERE" lọc dòng theo điều kiện, chỉ quyết định dòng nào được lấy chứ không đổi thứ tự. "None of these" sai vì đã có từ khoá đúng làm đúng việc sắp xếp.
Mở trang câu hỏi này →
AAbility to store data in a format that can be sent across a network
BAbility to execute Python code within the file
CAbility to quickly convert data to HTML
DAbility to scan large amounts of data quickly
Lời giải
Đáp án đúng: "Ability to scan large amounts of data quickly". Tệp phẳng (flat file) như tệp văn bản hay CSV buộc chương trình đọc tuần tự từ đầu tới cuối mới tìm được dữ liệu cần; cơ sở dữ liệu quan hệ (relational database) tổ chức dữ liệu thành bảng, có chỉ mục (index) và bộ tối ưu truy vấn, nên tìm, lọc, sắp xếp một lượng dữ liệu lớn nhanh hơn nhiều, lại liên kết được nhiều bảng với nhau qua khoá. Phương án "Ability to store data in a format that can be sent across a network" không phải lợi thế riêng, vì tệp phẳng cũng gửi qua mạng được. Phương án "Ability to execute Python code within the file" sai: cơ sở dữ liệu lưu dữ liệu và chạy câu lệnh SQL, không chạy mã Python nằm bên trong tệp. Phương án "Ability to quickly convert data to HTML" không phải chức năng của cơ sở dữ liệu; chuyển dữ liệu sang HTML là việc của chương trình hiển thị.
Mở trang câu hỏi này →
AAll the rows without a primary key will be deleted
BThe first row of the table will be deleted
CIt is a syntax error
DAll the rows in the table are deleted
Lời giải
Đáp án đúng: "All the rows in the table are deleted". WHERE là bộ lọc chọn những dòng mà lệnh tác động; DELETE FROM Users WHERE email = 'ted@umich.edu' chỉ xoá các dòng khớp điều kiện. Bỏ WHERE thì không còn bộ lọc, lệnh áp lên mọi dòng, nên DELETE FROM Users xoá sạch dữ liệu nhưng vẫn giữ bảng và cấu trúc cột (khác DROP TABLE xoá cả bảng). Vì vậy nên thử bằng SELECT với cùng WHERE trước khi xoá. "All the rows without a primary key will be deleted" sai vì khoá chính không liên quan tới việc lọc; dòng có hay không có khoá chính đều bị xoá như nhau. "The first row of the table will be deleted" sai vì SQL không ngầm giới hạn còn một dòng, và bảng quan hệ vốn không có thứ tự dòng cố định. "It is a syntax error" sai vì DELETE không có WHERE là câu lệnh hoàn toàn hợp lệ, chính vì thế mà nó nguy hiểm.
Mở trang câu hỏi này →
ASELECT all FROM Users
BRETRIEVE * FROM Users
CSELECT * FROM Users
DRETRIEVE all FROM User
Lời giải
Đáp án đúng: "SELECT * FROM Users". Trong SQL, lệnh đọc dữ liệu là SELECT, theo sau là danh sách cột cần lấy; dấu sao * là ký tự đại diện nghĩa là mọi cột, và khi không có mệnh đề WHERE thì mọi dòng (record) của bảng Users đều được trả về. "SELECT all FROM Users" sai vì all không phải ký hiệu cho mọi cột; ALL trong SQL là từ khoá đối lập với DISTINCT (giữ cả dòng trùng), đứng một mình như vậy sẽ bị hiểu là tên cột all và báo lỗi nếu bảng không có cột đó. "RETRIEVE * FROM Users" sai vì SQL không có lệnh RETRIEVE. "RETRIEVE all FROM User" sai vì vừa dùng lệnh không tồn tại vừa sai tên bảng, User thay vì Users.
Mở trang câu hỏi này →
ADELETE FROM Cats WHERE name = 'Ruby'
BDELETE name='Ruby' FROM Cats
CDELETE ROW name='Ruby' FROM Cats
DDELETE FROM Cats WHERE name == 'Ruby'
Lời giải
Đáp án đúng: "DELETE FROM Cats WHERE name = 'Ruby'". Cú pháp chuẩn của SQL để xoá dòng là DELETE FROM tên bảng rồi WHERE điều kiện; mệnh đề WHERE chọn mọi dòng thoả điều kiện, nên tất cả các dòng có tên Ruby đều bị xoá, còn nếu bỏ WHERE thì cả bảng bị xoá sạch. So sánh bằng trong SQL dùng một dấu bằng và chuỗi đặt trong nháy đơn. "DELETE name='Ruby' FROM Cats" sai cú pháp vì DELETE không nhận tên cột hay điều kiện đứng trước FROM. "DELETE ROW name='Ruby' FROM Cats" cũng sai: SQL không có từ khoá ROW trong lệnh DELETE, bản thân DELETE vốn đã thao tác trên dòng. "DELETE FROM Cats WHERE name == 'Ruby'" dùng toán tử so sánh quen thuộc của Python; SQLite tình cờ chấp nhận hai dấu bằng như một cách viết khác của một dấu bằng, nhưng đó không phải SQL chuẩn và MySQL hay PostgreSQL sẽ báo lỗi cú pháp, nên cách viết đúng chuẩn vẫn là một dấu bằng.
Mở trang câu hỏi này →
AADD ROW
BINSERT ROW
CINSERT INTO
DINSERT AFTER
Lời giải
Đáp án đúng: "INSERT INTO". Lệnh chèn dòng mới có dạng INSERT INTO tên bảng, danh sách cột trong ngoặc, rồi VALUES với danh sách giá trị tương ứng; trong sqlite3 của Python thường dùng dấu hỏi làm chỗ giữ tham số trong câu lệnh, truyền giá trị thật dưới dạng tuple vào cur.execute, rồi gọi conn.commit() để lưu thay đổi. "ADD ROW" không phải cú pháp SQL; từ ADD chỉ xuất hiện trong ALTER TABLE để thêm cột hoặc ràng buộc. "INSERT ROW" sai vì sau INSERT phải là INTO; MySQL cho phép lược INTO nhưng không hệ nào có từ ROW ở đây. "INSERT AFTER" sai vì bảng quan hệ không có thứ tự vị trí dòng nên không có khái niệm chèn sau một dòng nào đó; từ AFTER chỉ gặp trong định nghĩa trigger hoặc khi thêm cột trong MySQL.
Mở trang câu hỏi này →
ADELETE
BREMOVE
CCOLLAPSE
DDROP
Lời giải

Đáp án đúng: "DELETE". Lệnh DELETE FROM xoá các dòng dữ liệu khỏi bảng, thường kèm WHERE để chọn dòng cần xoá, ví dụ DELETE FROM Users WHERE email = 'ted@umich.edu'; bảng và cấu trúc cột vẫn còn nguyên. Nếu thiếu WHERE thì mọi dòng bị xoá nhưng bảng vẫn tồn tại. Phương án "REMOVE" không phải lệnh SQL. Phương án "COLLAPSE" cũng không phải lệnh SQL và không mang nghĩa gì trong ngôn ngữ truy vấn. Phương án "DROP" là lệnh có thật nhưng thuộc nhóm định nghĩa cấu trúc: DROP TABLE xoá luôn cả bảng, gồm cấu trúc lẫn toàn bộ dữ liệu, chứ không phải xoá dữ liệu bên trong một bảng vẫn còn đó; câu hỏi nói tới việc xoá dữ liệu khỏi bảng nên DELETE mới đúng.

Mở trang câu hỏi này →
AUI/UX Designer
BDatabase Administrator
CDeveloper
DProject Manager
Lời giải
Đáp án đúng: "Database Administrator". Trong môi trường vận hành trực tuyến, cơ sở dữ liệu production chứa dữ liệu thật của người dùng, nên quyền truy cập trực tiếp được giới hạn cho Database Administrator (DBA, quản trị viên cơ sở dữ liệu), người chịu trách nhiệm sao lưu, phân quyền, tối ưu và giữ an toàn dữ liệu. Các vai trò khác làm việc với dữ liệu thông qua ứng dụng hoặc bản sao. "UI/UX Designer" thiết kế giao diện và trải nghiệm người dùng, không cần chạm vào dữ liệu thật. "Developer" viết mã làm việc với cơ sở dữ liệu nhưng thường chạy trên môi trường phát triển hoặc kiểm thử; mã của họ chạm tới production qua ứng dụng đã triển khai chứ bản thân họ không vào thẳng, để tránh sửa nhầm dữ liệu thật. Ở nhóm nhỏ có khi một người kiêm cả hai vai trò, nhưng câu hỏi nói về cách tổ chức điển hình. "Project Manager" quản lý tiến độ, nhân sự và phạm vi dự án, xem số liệu qua báo cáo chứ không truy cập cơ sở dữ liệu.
Mở trang câu hỏi này →