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

Câu hỏi: PRP201c Lập trình Python – Bộ ôn tập cuối kỳ số 2

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
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 →
A!
B*
C^
D/
Lời giải
Đáp án đúng: "*". Bảng mã ASCII gán mỗi ký tự một số nguyên từ 0 đến 127; giá trị thập phân 42 ứng với dấu sao. Trong Python có thể kiểm bằng chr(42) trả về '*' và ord('*') trả về 42. Các ký tự lân cận: 40 và 41 là hai dấu ngoặc tròn, 43 là dấu cộng. "!" là dấu chấm than, mang mã 33, ký tự in được đầu tiên sau dấu cách (32). "^" là dấu mũ, mang mã 94, nằm sau các chữ hoa và dấu ngoặc vuông. "/" là dấu gạch chéo, mang mã 47, đứng ngay trước chữ số 0 (mã 48). Nhớ vài mốc như dấu cách là 32, chữ số 0 là 48, chữ hoa đầu bảng chữ cái là 65 và chữ thường đầu bảng là 97 giúp suy ra nhanh vị trí các ký tự khác.
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 →
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 →
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 →
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 →
AUTF-128
BUTF-8
CUTF-32
DUTF-64
Lời giải
Đáp án đúng: "UTF-8". Khi trao đổi dữ liệu giữa các hệ thống qua mạng, tệp hay API, UTF-8 là bảng mã Unicode phổ biến nhất vì nó mã hoá mỗi ký tự bằng 1 đến 4 byte với độ dài thay đổi, tương thích ngược với ASCII (chữ tiếng Anh vẫn chiếm đúng 1 byte) và không phụ thuộc thứ tự byte của máy; trong Python 3, encode() và decode() mặc định dùng UTF-8. "UTF-32" là mã hoá Unicode có thật nhưng dùng cố định 4 byte cho mọi ký tự, tốn dung lượng nên chủ yếu dùng nội bộ khi cần truy cập ký tự theo chỉ số, hiếm khi dùng để truyền dữ liệu. "UTF-128" không tồn tại; con số 128 dễ làm nhớ tới 128 ký tự của bảng ASCII chứ không phải một đơn vị mã hoá. "UTF-64" cũng không tồn tại: Unicode chỉ định nghĩa UTF-8, UTF-16 và UTF-32, và không gian mã chỉ tới U+10FFFF nên 32 bit đã thừa chỗ.
Mở trang câu hỏi này →
AThe local time zone of the sending computer without daylight savings time
BThe local time zone of the sending computer
CUniversal Time / GMT
DThe local time zone of the receiving computer
Lời giải
Đáp án đúng: "Universal Time / GMT". Khi các máy trao đổi dữ liệu qua API, bên gửi và bên nhận có thể ở bất kỳ múi giờ nào, mỗi nơi lại có quy tắc giờ mùa hè (daylight saving time) riêng. Dùng giờ quốc tế UTC, gần như trùng GMT, làm chuẩn chung, thường ghi theo dạng ISO 8601 có hậu tố Z, giúp mọi bên hiểu cùng một thời điểm mà không phải đoán; mỗi ứng dụng tự đổi sang giờ địa phương khi hiển thị. "The local time zone of the sending computer" buộc bên nhận phải biết múi giờ của bên gửi, và giờ mùa hè còn làm một số mốc bị lặp hoặc bị nhảy cóc. "The local time zone of the sending computer without daylight savings time" bớt được chuyện giờ mùa hè nhưng vẫn phụ thuộc vị trí bên gửi, mỗi nguồn dữ liệu một múi giờ khác nhau. "The local time zone of the receiving computer" không khả thi khi một API phục vụ nhiều bên nhận ở nhiều nơi, bên gửi không thể đổi theo từng người.
Mở trang câu hỏi này →
AIt optimizes files that are retrieved many times
BIt builds word clouds from web pages
CIt repairs and parses HTML to make it easier for a program to understand
DIt allows a web site to choose an attractive skin
EIt animates web operations to make them more attractive
Lời giải
Đáp án đúng: "It repairs and parses HTML to make it easier for a program to understand". BeautifulSoup là thư viện phân tích (parse) HTML và XML: nó chịu được mã HTML viết cẩu thả, thiếu thẻ đóng, lồng sai, tự sửa thành một cây hợp lệ, rồi cho chương trình tìm thẻ và đọc thuộc tính dễ dàng, nên rất hay dùng để thu thập dữ liệu web (web scraping). "It optimizes files that are retrieved many times" sai vì nó không lưu đệm (cache) hay tối ưu tệp tải nhiều lần. "It builds word clouds from web pages" sai vì đám mây từ là việc của thư viện khác như wordcloud, BeautifulSoup chỉ có thể là bước lấy chữ đầu vào. "It allows a web site to choose an attractive skin" sai vì giao diện trang do CSS và mã phía trang quyết định. "It animates web operations to make them more attractive" sai vì nó không tạo hiệu ứng động, chỉ đọc và phân tích tài liệu.
Mở trang câu hỏi này →
ALine merges with next
BFile is deleted
CData is lost
DNothing special
Lời giải
Đáp án đúng: "Line merges with next". Phương thức write() ghi đúng những gì được truyền vào, không tự thêm ký tự xuống dòng như print; vì vậy nếu gọi write hai lần với hai chuỗi mà không tự thêm ký tự xuống dòng vào cuối chuỗi thứ nhất, hai chuỗi sẽ nằm liền nhau trên cùng một dòng trong tệp. "File is deleted" sai vì thiếu ký tự xuống dòng không làm mất tệp; tệp chỉ bị làm rỗng khi mở lại bằng chế độ 'w'. "Data is lost" sai vì mọi ký tự vẫn được ghi đầy đủ, chỉ là dính liền nhau, không mất byte nào. "Nothing special" sai vì có hậu quả thực tế: khi đọc lại bằng vòng lặp for line in f, những đoạn định ghi thành nhiều dòng riêng sẽ chỉ trả về một dòng duy nhất, làm sai việc đếm hay xử lý theo dòng.
Mở trang câu hỏi này →
AGET
BPOST
CPUT
DDELETE
EINFO
Lời giải
Đáp án đúng: "GET". Khi người dùng bấm vào một thẻ neo (anchor tag), tức thẻ a có thuộc tính href, trình duyệt gửi một yêu cầu HTTP GET tới URL ghi trong href để lấy trang hoặc tài nguyên đó về hiển thị; GET là phương thức dùng để đọc, lấy dữ liệu từ máy chủ. Đề nhắc "like below" nhưng bản in thiếu đoạn thẻ ví dụ; câu vẫn trả lời được vì mọi liên kết thường đều dẫn tới yêu cầu GET. Phương án "POST" dùng để gửi dữ liệu lên máy chủ, điển hình khi nộp một biểu mẫu khai báo method là post, không phải khi bấm một liên kết thường. Phương án "PUT" dùng để tạo hoặc thay thế tài nguyên tại một URL, hay gặp trong API, trình duyệt không dùng nó khi mở liên kết. Phương án "DELETE" yêu cầu máy chủ xoá tài nguyên, cũng chỉ dùng trong API. Phương án "INFO" không phải phương thức HTTP chuẩn; các phương thức có thật gồm GET, POST, PUT, DELETE, HEAD, OPTIONS và PATCH.
Mở trang câu hỏi này →
AHow much memory does the server need to serve requests?
BWhat is the IP address for a domain like www.dr-chuck.com?
CHow long do we wait before packets are retransmitted?
DWhich application talks first? The client or server?
Lời giải
Đáp án đúng: "Which application talks first? The client or server?". Giao thức tầng ứng dụng (application layer protocol) như HTTP là bộ quy tắc hai chương trình thống nhất để nói chuyện qua một kết nối đã có sẵn: ai nói trước, nói gì, theo định dạng nào và khi nào kết thúc. Với HTTP, trình khách nói trước bằng một yêu cầu như GET kèm đường dẫn, máy chủ đáp lại bằng dòng trạng thái, các header và nội dung. "How much memory does the server need to serve requests?" là chuyện cấu hình phần cứng của máy chủ, giao thức không quy định. "What is the IP address for a domain like www.dr-chuck.com?" là việc của DNS, hệ thống phân giải tên miền, diễn ra trước khi HTTP bắt đầu. "How long do we wait before packets are retransmitted?" thuộc tầng giao vận: TCP lo việc gửi lại gói tin bị mất, nhờ vậy tầng ứng dụng không phải bận tâm.
Mở trang câu hỏi này →
AIt will remove the row "Cats".
BIt will move "Cats" to the end of the database.
CIt will remove the column "Cats".
DIt will remove the table "Cats".
Lời giải
Đáp án đúng: "It will remove the table "Cats".". Lệnh DROP TABLE trong SQL xoá hẳn một bảng khỏi cơ sở dữ liệu, gồm cả cấu trúc lẫn mọi dòng dữ liệu; phần IF EXISTS giúp lệnh không báo lỗi khi bảng chưa tồn tại, nên hay dùng ở đầu chương trình trước CREATE TABLE để tạo lại bảng sạch mỗi lần chạy. cur.execute chỉ là cách gửi câu SQL qua con trỏ của sqlite3. "It will remove the row "Cats"." sai vì xoá dòng dùng DELETE FROM ... WHERE, còn Cats ở đây là tên bảng. "It will move "Cats" to the end of the database." sai vì SQL không có khái niệm dời bảng về cuối cơ sở dữ liệu. "It will remove the column "Cats"." sai vì xoá cột phải dùng ALTER TABLE ... DROP COLUMN trên một bảng cụ thể.
Mở trang câu hỏi này →
Aencode()
Brstrip()
Cinternal()
Ddecode()
Esplit()
Lời giải
Đáp án đúng: "decode()". Dữ liệu đọc từ mạng, chẳng hạn kết quả read() của urlopen hay recv() của socket, có kiểu bytes: một dãy byte đã được mã hoá, thường theo UTF-8; còn str của Python 3 lưu ký tự Unicode ở dạng nội bộ, nên phải gọi decode() để chuyển bytes thành str trước khi xử lý như chuỗi. "encode()" làm chiều ngược lại, biến str thành bytes, dùng trước khi gửi dữ liệu đi qua mạng. "rstrip()" chỉ cắt khoảng trắng và ký tự xuống dòng ở bên phải, kiểu dữ liệu không đổi; gọi trên bytes vẫn trả về bytes. "internal()" không tồn tại trên bytes hay str; tên này chỉ mượn chữ internal trong câu hỏi. "split()" tách thành list các phần, và bytes.split vẫn trả về các phần tử kiểu bytes, nên không đổi sang dạng chuỗi.
Mở trang câu hỏi này →
AFTP
BSMTP
CHTTP
DPOP3
Lời giải
Đáp án đúng: "HTTP". HTTP (HyperText Transfer Protocol, giao thức truyền siêu văn bản) là giao thức tầng ứng dụng mà trình duyệt và máy chủ web dùng để yêu cầu và trả trang web: trình duyệt gửi một yêu cầu như GET /page.htm HTTP/1.0, máy chủ trả về các header rồi tới nội dung; phiên bản mã hoá của nó là HTTPS. Phương án "FTP" (File Transfer Protocol) dùng để truyền tệp giữa máy khách và máy chủ, không phải giao thức chính để lấy trang web. Phương án "SMTP" (Simple Mail Transfer Protocol) dùng để gửi thư điện tử giữa các máy chủ thư. Phương án "POP3" (Post Office Protocol phiên bản 3) dùng để tải thư điện tử từ hộp thư trên máy chủ về máy người dùng. Những giao thức này đều chạy trên TCP giống HTTP nhưng phục vụ mục đích khác.
Mở trang câu hỏi này →
ASERIAL
BASSERT_UNIQUE
CAUTOINCREMENT
DAUTO_INCREMENT
Lời giải
Đáp án đúng: "AUTOINCREMENT". Trong SQLite, khai báo id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE cho cột khoá chính khiến cơ sở dữ liệu tự cấp một số nguyên mới, lớn hơn các số đã dùng, mỗi khi ta INSERT mà không ghi giá trị cho cột đó; đây là mẫu tạo bảng quen thuộc trong PY4E. "AUTO_INCREMENT" có dấu gạch dưới là cú pháp của MySQL, SQLite không nhận từ này. "SERIAL" là kiểu cột tự tăng của PostgreSQL, không phải từ khoá của SQLite. "ASSERT_UNIQUE" không tồn tại trong SQL; muốn ràng buộc không trùng thì dùng UNIQUE, nhưng UNIQUE chỉ kiểm tra chứ không tự sinh giá trị. Lưu ý thêm: trong SQLite một cột INTEGER PRIMARY KEY vốn đã tự nhận giá trị khi bỏ trống; AUTOINCREMENT bảo đảm thêm rằng số đã cấp không bao giờ bị dùng lại.
Mở trang câu hỏi này →
AA function
BA method within a class
CA Python dictionary
DA file handle
Lời giải
Đáp án đúng: "A file handle". Con trỏ (cursor) lấy từ conn.cursor() trong sqlite3 đóng vai trò giống tay cầm tệp (file handle) trả về từ open(): ta gửi thao tác qua nó bằng cur.execute(...) giống như ghi vào tệp, rồi đọc kết quả qua nó bằng cách duyệt for row in cur hoặc gọi fetchone, fetchall giống như đọc từng dòng tệp; bản thân nó không chứa dữ liệu mà là cổng để truy cập cơ sở dữ liệu. "A function" sai vì cursor là một đối tượng có trạng thái, không phải hàm; ta gọi phương thức của nó chứ không gọi chính nó. "A method within a class" sai vì cursor() mới là phương thức của đối tượng kết nối, còn thứ nó trả về là một đối tượng. "A Python dictionary" sai vì cursor không lưu cặp khoá giá trị và không truy cập được bằng cur['ten'].
Mở trang câu hỏi này →
Asend()
Bsocket()
Cexecute()
Drun()
Lời giải
Đáp án đúng: "execute()". Với module sqlite3, ta mở kết nối bằng sqlite3.connect, lấy con trỏ bằng conn.cursor(), rồi gọi cur.execute với câu lệnh SQL và tuple tham số để chạy lệnh đó; với SELECT thì lặp trên cursor hoặc gọi fetchall() lấy kết quả, với lệnh thay đổi dữ liệu thì gọi conn.commit() để lưu. Đây là mẫu chuẩn của DB-API trong Python. "send()" là phương thức của đối tượng socket dùng để gửi bytes qua kết nối mạng, không có trên cursor. "socket()" là hàm tạo đối tượng socket trong module socket, thuộc lập trình mạng chứ không thuộc sqlite3. "run()" không có trên cursor của sqlite3; tên này gợi nhớ subprocess.run dùng để chạy một chương trình bên ngoài.
Mở trang câu hỏi này →
ASQLite
BPostgreSQL
CPySQL
DMySQL
Lời giải
Đáp án đúng: "SQLite". SQLite là hệ quản trị cơ sở dữ liệu nhỏ gọn, lưu toàn bộ cơ sở dữ liệu trong một tệp duy nhất và không cần máy chủ riêng; Python đi kèm sẵn mô-đun sqlite3 trong thư viện chuẩn, nên chỉ cần import sqlite3 rồi gọi sqlite3.connect('music.sqlite') là dùng được ngay. Phương án "PostgreSQL" là hệ quản trị mạnh theo mô hình máy khách và máy chủ, phải cài riêng và kết nối qua thư viện bên ngoài như psycopg2. Phương án "PySQL" không phải hệ cơ sở dữ liệu phổ biến nào đi kèm Python, chỉ là cái tên ghép Py với SQL. Phương án "MySQL" cũng là hệ quản trị máy khách và máy chủ, cần cài máy chủ riêng cùng thư viện kết nối riêng, không có sẵn trong bản cài Python.
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 →