Tất cả câu hỏi

Ngân hàng câu hỏi trắc nghiệm có giải thích chi tiết.

3.900/20.114 câuCòn 16.214
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ự nên chỉ số dương hợp lệ là 0 tới 5 và chỉ số âm hợp lệ là -1 tới -6; fruit[6] vượt quá chỉ số cuối cùng nên Python ném IndexError: string index out of range. Phương án "fruit[5]" là chỉ số dương cuối cùng còn hợp lệ, cho chữ a. Phương án "fruit[-1]" dùng chỉ số âm đếm từ cuối, cũng trả về chữ a cuối chuỗi. Phương án "fruit[-2]" trả về ký tự áp cuối là n. Những chỉ số đó đều nằm trong phạm vi nên không gây lỗi. Lưu ý phép cắt lát (slicing) thì không báo lỗi khi vượt biên: fruit[2:10] vẫn trả về nana; chỉ truy cập một phần tử đơn lẻ ngoài phạm vi mới ném IndexError.
Mở trang câu hỏi này →
AFaster execution
BCatch connection and parsing errors
CWrite files faster
DAvoid memory issues
Lời giải
Đáp án đúng: "Catch connection and parsing errors". Khối try/except bắt ngoại lệ phát sinh trong khối try và chuyển sang xử lý ở except thay vì để chương trình dừng giữa chừng. Khi dùng urllib hoặc socket, mạng có thể lỗi (URLError, hết thời gian chờ, ConnectionRefusedError), và dữ liệu trả về có thể hỏng khiến json.loads ném JSONDecodeError hoặc ElementTree ném ParseError; đặt các lệnh đó trong try giúp chương trình báo lỗi gọn rồi bỏ qua hoặc thử lại. "Faster execution" sai vì try/except không tăng tốc; khi có ngoại lệ còn tốn thêm chi phí xử lý. "Write files faster" không liên quan, tốc độ ghi tệp do hệ điều hành và ổ đĩa quyết định. "Avoid memory issues" sai vì try/except không giải phóng bộ nhớ; bộ nhớ do bộ thu gom rác của Python quản lý, và muốn giảm bộ nhớ phải đọc dữ liệu theo từng phần.
Mở trang câu hỏi này →
3883What is the purpose of a primary key?4 lựa chọn
ATo look up a row based on a string that comes from outside the program
BTo look up a particular row in a table very quickly
CTo track the number of duplicate values in another column
DTo point to a particular row in another table
Lời giải
Đáp án đúng: "To look up a particular row in a table very quickly". Khoá chính (primary key), thường là cột id số nguyên tự tăng, định danh duy nhất mỗi dòng và được cơ sở dữ liệu lập chỉ mục, nên tìm đúng một dòng theo nó rất nhanh; các bảng khác cũng tham chiếu tới dòng qua giá trị này. "To look up a row based on a string that comes from outside the program" sai vì đó là vai trò của khoá logic (logical key), như cột email hay tên mà người dùng nhập vào để tìm, thường gắn UNIQUE. "To track the number of duplicate values in another column" sai vì khoá chính không đếm gì; đếm trùng làm bằng GROUP BY với COUNT. "To point to a particular row in another table" sai vì đó là định nghĩa khoá ngoại (foreign key), cột chứa giá trị khoá chính của bảng khác.
Mở trang câu hỏi này →
AModel each "object" in the application as one or more tables
BUse a person's email address as their primary key
CNever repeat string data in more than one table in a data model
DUse integers as primary keys
Lời giải
Đáp án đúng: "Use a person's email address as their primary key". Khoá chính nên là giá trị ổn định, gọn và không mang ý nghĩa nghiệp vụ; địa chỉ email thì người dùng có thể đổi, mà khi khoá chính đổi, mọi khoá ngoại trỏ tới nó ở các bảng khác cũng phải đổi theo. Email còn là chuỗi dài nên so sánh và đánh chỉ mục chậm hơn số nguyên. Cách đúng là dùng id số nguyên làm khoá chính và đặt email là cột UNIQUE để tra cứu. "Model each "object" in the application as one or more tables" là quy tắc tốt: mỗi đối tượng như người dùng, bài hát, album có bảng riêng. "Never repeat string data in more than one table in a data model" là nguyên tắc chuẩn hoá (normalization): chuỗi chỉ lưu một lần, nơi khác tham chiếu tới nó bằng số. "Use integers as primary keys" là quy tắc tốt vì số nguyên gọn, so sánh nhanh và có thể để SQLite tự tăng. Ba quy tắc này đều nên làm nên không được chọn.
Mở trang câu hỏi này →
A^
B?
C.
D*
E$
F+
Lời giải
Đáp án đúng: ".". Trong biểu thức chính quy (regular expression), dấu chấm là ký tự đại diện (wild card): nó khớp đúng một ký tự bất kỳ, trừ ký tự xuống dòng; ví dụ mẫu f.o khớp foo, fao hay f9o. Phương án "^" là ký tự neo khớp vị trí đầu dòng, không khớp ký tự nào. Phương án "?" là bộ lượng hoá (quantifier) cho phép phần đứng trước xuất hiện 0 hoặc 1 lần. Phương án "*" lặp phần đứng trước 0 lần trở lên; phải ghép dấu chấm với dấu sao mới thành mẫu khớp mọi chuỗi, còn bản thân dấu sao không khớp ký tự nào. Phương án "$" là ký tự neo khớp vị trí cuối dòng. Phương án "+" lặp phần đứng trước 1 lần trở lên, như [0-9]+ khớp một dãy chữ số. Muốn khớp dấu chấm thật phải thoát thành \. trong mẫu.
Mở trang câu hỏi này →
Đề bài
import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n'.encode()
mysock.send(cmd)

while True:
    data = mysock.recv(512)
    if (len(data) < 1):
        break
    print(data.decode())
mysock.close()
Amysock.recv()
Bsocket.socket()
Cmysock.close()
Dmysock.connect()
Emysock.send()
Lời giải
Đáp án đúng: "mysock.recv()". Lần theo mã: lời gọi recv(512) nhận tối đa 512 byte từ kết nối và trả về bytes, đó là chỗ dữ liệu thật sự được đọc; vòng while lặp lại cho tới khi recv trả về dữ liệu rỗng (độ dài nhỏ hơn 1), nghĩa là máy chủ đã đóng kết nối, và mỗi khối nhận được được decode rồi in ra. "socket.socket()" chỉ tạo đối tượng socket, với AF_INET là IPv4 và SOCK_STREAM là TCP, chưa kết nối hay đọc gì. "mysock.connect()" mở kết nối TCP tới data.pr4e.org ở cổng 80, mới là bước thiết lập đường truyền. "mysock.send()" gửi yêu cầu GET đã được mã hoá thành bytes tới máy chủ, là chiều đi chứ không phải đọc. "mysock.close()" đóng kết nối sau khi đã đọc xong, giải phóng tài nguyên.
Mở trang câu hỏi này →
A103
B14
C7
D71
Lời giải
Đáp án đúng: "71". Bảng mã ASCII gán chữ hoa từ 65 cho A, 66 cho B, rồi tăng dần nên G là chữ thứ bảy có mã 65 + 6 = 71; kiểm tra bằng ord('G') trong Python cho 71, ngược lại chr(71) cho 'G'. "103" sai vì đó là mã của chữ thường g; chữ thường bắt đầu từ 97 cho a, cách chữ hoa tương ứng đúng 32. "7" sai vì đó chỉ là vị trí của G trong bảng chữ cái, không phải mã số; mã 7 trong ASCII là ký tự điều khiển chuông BEL. "14" sai vì mã 14 là ký tự điều khiển SO (Shift Out), không phải chữ in được; mọi ký tự từ 0 tới 31 đều là ký tự điều khiển.
Mở trang câu hỏi này →
APacket
BSession
CData Link
DPhysical
Lời giải
Đáp án đúng: "Packet". Mô hình OSI có bảy tầng, từ dưới lên: Physical, Data Link, Network, Transport, Session, Presentation, Application. Packet (gói tin) không phải tên tầng mà là tên đơn vị dữ liệu ở tầng Network, nơi giao thức IP định tuyến các gói giữa các mạng; tương tự frame là đơn vị dữ liệu ở tầng Data Link. "Session" là tầng thứ năm, quản lý phiên làm việc giữa hai ứng dụng: mở, duy trì và đóng phiên. "Data Link" là tầng thứ hai, truyền khung dữ liệu giữa hai thiết bị kề nhau trên cùng đường truyền, ví dụ Ethernet hay Wi-Fi, dùng địa chỉ MAC. "Physical" là tầng thứ nhất, lo tín hiệu điện, sóng vô tuyến hay ánh sáng trên dây cáp. Ba tầng này đều có thật trong OSI nên không phải câu trả lời cho câu hỏi phủ định này.
Mở trang câu hỏi này →
AThat the web site allows scraping
BThat the web site supports the HTTP GET command
CThat the web site returns HTML for all pages
DThat the web site only has links within the same site
Lời giải
Đáp án đúng: "That the web site allows scraping". Trước khi viết chương trình tự động tải và bóc dữ liệu từ một trang (web scraping), cần xem trang có cho phép điều đó không: đọc điều khoản sử dụng và tệp robots.txt ở gốc tên miền, vì có trang cấm thu thập tự động hoặc chỉ cho phép ở mức độ nhất định; bỏ qua bước này có thể bị chặn địa chỉ IP hoặc vi phạm điều khoản. Phương án "That the web site supports the HTTP GET command" không cần kiểm vì mọi máy chủ web đều phục vụ trang qua GET, đó chính là cách trình duyệt mở trang. Phương án "That the web site returns HTML for all pages" không phải điều kiện: chương trình có thể xử lý cả JSON, XML hay ảnh tuỳ theo trang. Phương án "That the web site only has links within the same site" không liên quan: liên kết trỏ ra trang khác chỉ cần lọc khi lần theo, chứ không quyết định có được phép thu thập hay không.
Mở trang câu hỏi này →
3890What happens if you assign t = t.sort()?4 lựa chọn
At becomes sorted list
Bt becomes None
Ct becomes reversed
DError occurs
Lời giải
Đáp án đúng: "t becomes None". Phương thức sort() của list sắp xếp tại chỗ (in-place), tức sửa trực tiếp list đó, và trả về None; vì vậy khi gán lại vào t, list vẫn được sắp xếp xong nhưng tên t bị gán thành None và mất tham chiếu tới list. Muốn giữ kết quả, hãy gọi t.sort() trên một dòng riêng, hoặc dùng t = sorted(t) vì sorted() trả về list mới. "t becomes sorted list" chỉ đúng nếu dùng sorted(t), không đúng với sort(). "t becomes reversed" sai vì sort() sắp tăng dần chứ không đảo; muốn đảo phải dùng reverse() hoặc sort(reverse=True), mà reverse() cũng trả về None. "Error occurs" sai vì phép gán chạy bình thường; lỗi chỉ xuất hiện về sau khi dùng t như list, ví dụ lấy phần tử đầu sẽ gây TypeError vì NoneType không truy cập theo chỉ số được.
Mở trang câu hỏi này →
AThe Request/Response Cycle
BIMAP
CInternet Protocol (IP)
DDECNET
ESMTP
Lời giải
Đáp án đúng: "The Request/Response Cycle". Khi trình duyệt tải một trang, nó mở kết nối tới máy chủ, gửi yêu cầu (request) HTTP như GET /page.html, máy chủ trả về phản hồi (response) gồm phần đầu và nội dung, trình duyệt hiển thị rồi mỗi lần người dùng bấm liên kết lại lặp một vòng yêu cầu mới; chuỗi lặp đó gọi là chu trình yêu cầu/phản hồi. "IMAP" sai vì đó là giao thức đọc thư điện tử trên máy chủ thư. "Internet Protocol (IP)" sai vì IP là tầng định tuyến gói tin bên dưới, HTTP chạy trên TCP/IP chứ IP không phải tên của việc tải trang. "DECNET" sai vì đó là bộ giao thức mạng cũ của hãng Digital Equipment Corporation, không liên quan tới web. "SMTP" sai vì đó là giao thức gửi thư điện tử.
Mở trang câu hỏi này →
Aappend()
BIndex assignment list[2] = x
Cremove()
Dinsert()
Lời giải
Đáp án đúng: "Index assignment list[2] = x". List là kiểu khả biến (mutable), nên có thể ghi đè phần tử tại một vị trí bằng phép gán theo chỉ số: lst[2] = x thay giá trị ở vị trí 2, độ dài list giữ nguyên, các phần tử khác không bị dịch. Chỉ số phải nằm trong khoảng hiện có, nếu không sẽ gây IndexError. "append()" thêm một phần tử mới vào cuối list, làm list dài thêm chứ không sửa phần tử có sẵn. "remove()" xoá lần xuất hiện đầu tiên của một giá trị, tìm theo giá trị chứ không theo vị trí, và làm list ngắn lại. "insert()" chèn phần tử vào một vị trí, như lst.insert(2, x), đẩy các phần tử từ vị trí đó lùi ra sau; giá trị cũ ở vị trí 2 vẫn còn, chỉ bị dời chỗ, nên đó là chèn chứ không phải cập nhật. Lưu ý đặt tên biến là list sẽ che mất hàm list() có sẵn, nên thực tế nên dùng tên khác.
Mở trang câu hỏi này →
Asocket.accept()
Bsocket.sendto(address)
Csocket.acceptsocket
Daccept.socket()
Lời giải
Đáp án đúng: "socket.accept()". Một chương trình máy chủ TCP thường đi qua các bước: tạo socket, gọi bind() gắn địa chỉ và cổng, listen() để bắt đầu lắng nghe, rồi gọi accept(); accept() chờ tới khi có máy khách từ máy khác kết nối tới, sau đó trả về một cặp gồm socket mới dành riêng cho kết nối đó và địa chỉ của máy khách. Phương án "socket.sendto(address)" dùng để gửi dữ liệu tới một địa chỉ, chủ yếu với socket UDP, không nhận kết nối nào, và còn cần thêm đối số dữ liệu. Phương án "socket.acceptsocket" không phải phương thức nào của mô-đun socket, lại thiếu cặp ngoặc gọi hàm. Phương án "accept.socket()" đảo ngược tên đối tượng và phương thức: accept là phương thức của đối tượng socket nên phải viết theo thứ tự đối tượng rồi phương thức, không có đối tượng accept nào chứa phương thức socket.
Mở trang câu hỏi này →
3894In the following XML, which are attributes?5 lựa chọncó code
Đề bài
<person>
  <name>Chuck</name>
  <phone type="intl">
    +1 734 303 4456
  </phone>
  <email hide="yes" />
</person>
Atype
Bemail
Cperson
Dname
Ehide
Lời giải
Đáp án đúng gồm hai ý: "type" và "hide". Thuộc tính (attribute) trong XML là cặp tên bằng giá trị đặt trong nháy, viết bên trong thẻ mở của một phần tử: ở đây thẻ phone mang thuộc tính type với giá trị intl, còn thẻ tự đóng email mang thuộc tính hide với giá trị yes. Trong Python với ElementTree, ta đọc thuộc tính bằng get, ví dụ tree.find('phone').get('type') cho 'intl'. "person" là tên phần tử gốc (root element) bao toàn bộ tài liệu, không phải thuộc tính. "name" là một phần tử con chứa văn bản Chuck, đọc bằng thuộc tính text chứ không bằng get. "email" là tên một phần tử, cụ thể là thẻ tự đóng không có nội dung; nó là nơi mang thuộc tính hide chứ bản thân nó không phải thuộc tính.
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 →
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 →
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 →
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 →
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 →
3900What is the output from this print() function call:4 lựa chọncó code
Đề 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 →