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.940/20.114 câuCòn 16.174
A?
B*
C.
D$
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), khớp với đúng một ký tự bất kỳ trừ ký tự xuống dòng; ví dụ mẫu ^X.*: khớp mọi dòng bắt đầu bằng X và có dấu hai chấm ở phía sau. 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, hoặc biến bộ lặp thành không tham (non-greedy), bản thân nó không khớp ký tự nào. Phương án "*" nghĩa là lặp phần đứng trước 0 lần trở lên; dễ nhầm vì trong mẫu tên tệp của hệ điều hành dấu sao là ký tự đại diện, nhưng trong regex thì không. Phương án "$" là ký tự neo khớp vị trí cuối dòng, không khớp một ký tự cụ thể. 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 →
AComponent.pack(side= "LEFT")
BComponent.pack("Left ")
CComponent.pack(side=LEFT)
DComponent.pack(Left-side)
Lời giải
Đáp án đúng: "Component.pack(side=LEFT)". Trong tkinter, trình quản lý hình học pack xếp các widget dọc theo một cạnh của khung chứa; mặc định side bằng TOP nên các widget chồng từ trên xuống thành một cột, còn khi đặt side bằng LEFT chúng được xếp lần lượt từ trái sang phải trên cùng một hàng. LEFT là hằng số của tkinter, có được nhờ from tkinter import hoặc viết tkinter.LEFT, giá trị thực là chuỗi left viết thường. "Component.pack(side= "LEFT")" truyền chuỗi viết hoa, mà Tk chỉ nhận top, bottom, left, right viết thường nên báo lỗi bad side. "Component.pack("Left ")" truyền chuỗi làm đối số vị trí, nhưng đối số vị trí đầu tiên của pack là từ điển cấu hình, và chuỗi đó lại có chữ hoa cùng dấu cách thừa nên không phải giá trị cạnh hợp lệ. "Component.pack(Left-side)" bị Python hiểu là phép trừ giữa hai tên Left và side chưa định nghĩa, nên báo NameError.
Mở trang câu hỏi này →
AA list of all the anchor tags (<a..) in the HTML from the URL
BTrue if there were any anchor tags in the HTML from the URL
CAll of the externally linked CSS files in the HTML from the URL
DAll of the paragraphs of the HTML from the URL
Lời giải
Đáp án đúng: "A list of all the anchor tags (<a..) in the HTML from the URL". Gọi trực tiếp đối tượng BeautifulSoup như soup('a') là cách viết tắt của soup.find_all('a'): nó duyệt toàn bộ cây HTML đã phân tích và trả về một danh sách (ResultSet) gồm mọi thẻ neo (anchor tag) a, mỗi phần tử là một Tag để lấy liên kết bằng tag.get('href', None). "True if there were any anchor tags in the HTML from the URL" sai vì kết quả là danh sách thẻ chứ không phải giá trị logic; danh sách rỗng mới cho biết không có thẻ nào. "All of the externally linked CSS files in the HTML from the URL" sai vì tệp CSS liên kết nằm trong thẻ link, không phải thẻ a, và BeautifulSoup không tự tải tệp nào. "All of the paragraphs of the HTML from the URL" sai vì đoạn văn là thẻ p, phải gọi soup('p').
Mở trang câu hỏi này →
ANo
BCan be
CYes
DMay be
Lời giải
Đáp án đúng: "Yes". Socket là đầu mối của một kênh liên lạc hai chiều giữa hai tiến trình; với socket TCP như trong PY4E, ví dụ lời gọi connect tới data.pr4e.org cổng 80, một kết nối nối đúng hai điểm cuối, mỗi điểm được xác định bằng cặp địa chỉ IP và số cổng, nên đó là kết nối điểm-điểm (point to point): dữ liệu một bên gửi chỉ tới đúng bên kia. Chỗ dễ tranh cãi là "Can be" và "May be": socket UDP không thiết lập kết nối và một socket có thể gửi tới nhiều địa chỉ, nên nghe như tuỳ trường hợp; điều đó có thật, nhưng câu hỏi hỏi theo nghĩa kết nối của PY4E, tức socket TCP, nên câu trả lời vẫn là có. "Can be" vì thế biến một tính chất cố định của kết nối TCP thành điều tuỳ hoàn cảnh. "May be" cũng chỉ là cách nói lưỡng lự tương tự, không trả lời dứt khoát. "No" sai vì một kết nối TCP không dùng chung cho ba bên trở lên; máy chủ phục vụ nhiều khách là nhờ tạo một socket riêng cho mỗi kết nối.
Mở trang câu hỏi này →
AThe socket.sendto(PORT) method
BThe bind(IP,PORT) method
CThe bind(PORT,IP) method
DThe socket.accept(PORT) method
Lời giải
Đáp án đúng: "The bind(IP,PORT) method". Ở phía máy chủ, sau khi tạo socket bằng socket.socket(), ta gọi bind() để gắn socket với một địa chỉ cụ thể; với họ địa chỉ IPv4 (AF_INET), địa chỉ là một tuple theo thứ tự host rồi port, ví dụ s.bind(('127.0.0.1', 9000)), sau đó mới listen() và accept() để nhận kết nối. Nói chặt, bind nhận một tuple duy nhất chứ không phải hai đối số rời, nhưng thứ tự IP trước, cổng sau là đúng. Phương án "The bind(PORT,IP) method" đảo thứ tự, đưa cổng lên trước nên sai. Phương án "The socket.sendto(PORT) method" dùng để gửi dữ liệu tới một địa chỉ (thường với UDP), không gắn địa chỉ cho socket, và đối số của nó là dữ liệu kèm địa chỉ chứ không chỉ một cổng. Phương án "The socket.accept(PORT) method" dùng để chấp nhận một kết nối đến trên socket đã bind và listen; accept() không nhận đối số và không gắn địa chỉ nào.
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 →
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 →
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 →
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 →
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 →
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 →
3932What 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 →
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 →
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 →
Đề 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 →
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 →
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(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 →
3939What 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 →
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 →