Ngân hàng câu hỏi của chương

Câu hỏi: PRP201c - Phần 1: Nền tảng lập trình Python

40 câu trắc nghiệm kèm lời giải của môn PRP201c - Lập trình Python, xếp theo thứ tự nhập vào ngân hàng. Trang 2/2 — câu 21–40.

Danh sách câu hỏi

40/40 câuHết danh sách
21For the following code: astr = 'Hello Bob'4 lựa chọncó code
Đề bài
istr = 0
try:
    istr = int(astr)
except:
    istr = -1

What will the value be for istr after this code executes?

A-1
BIt will be the 'Not a number' value (i.e. NaN)
CIt will be a random number depending on the operating system the program runs on
Dfalse
Lời giải
Đáp án đúng: "-1". Lần theo mã: istr được gán 0, rồi vào khối try gọi int(astr) với astr = 'Hello Bob'. Chuỗi này không biểu diễn số nguyên nên int() phát sinh ValueError; ngoại lệ làm phép gán istr = int(astr) không bao giờ hoàn tất, luồng chạy nhảy sang khối except, nơi istr được gán -1. Vì vậy sau đoạn mã istr bằng -1. Đây là mẫu try/except quen thuộc để chương trình không dừng khi người dùng nhập sai. "It will be the 'Not a number' value (i.e. NaN)" sai vì int() không trả về NaN khi gặp chuỗi lạ mà ném ngoại lệ; NaN là giá trị float đặc biệt, chỉ có qua float('nan') hay phép tính số thực. "It will be a random number depending on the operating system the program runs on" sai vì Python xử lý giống nhau trên mọi hệ điều hành và không sinh số ngẫu nhiên ở đây. "false" sai vì không có dòng nào gán giá trị bool; vả lại Python viết hằng này là False với chữ hoa đầu.
Mở trang câu hỏi này →
A<class int>
B<class str>
C<class float>
D<class bool>
Lời giải

Đáp án đúng: "<class float> ". Hàm type() trả về kiểu (class) của đối tượng; số 3.2 có dấu chấm thập phân nên là số thực dấu phẩy động (floating-point), kiểu float, và Python 3 hiển thị kiểu dưới dạng <class 'float'>, phương án chỉ lược bỏ dấu nháy quanh tên kiểu. "<class int> " sai vì int là kiểu số nguyên, chỉ dành cho literal không có phần thập phân như 3; muốn ra int phải ép int(3.2), khi đó còn 3. "<class str> " sai vì 3.2 không đặt trong dấu nháy; chỉ '3.2' mới là chuỗi. "<class bool> " sai vì bool chỉ có hai giá trị True và False, dù 3.2 được coi là "truthy" khi đặt trong điều kiện if thì kiểu của nó vẫn là float.

Mở trang câu hỏi này →
AAddition +
BMultiplication *
CSubtraction -
DParentheses ()
Lời giải
Đáp án đúng: "Parentheses ()". Python tính biểu thức theo thứ tự ưu tiên toán tử (operator precedence): ngoặc tròn cao nhất, tiếp theo là luỹ thừa, rồi nhóm nhân, chia, chia lấy phần nguyên và chia lấy dư, cuối cùng là cộng và trừ; các toán tử cùng mức được tính từ trái sang phải. Vì vậy (1 + 2) * 3 cho 9, còn 1 + 2 * 3 cho 7. Ngoặc là công cụ để người viết ép thứ tự tính và làm biểu thức dễ đọc. "Multiplication *" được ưu tiên hơn cộng trừ nhưng vẫn đứng sau ngoặc: trong 2 * (3 + 4) phép cộng trong ngoặc được tính trước. "Addition +" thuộc mức ưu tiên thấp nhất trong nhóm số học nên được tính sau cùng. "Subtraction -" cùng mức với phép cộng, được tính từ trái sang phải cùng với cộng, cũng sau nhân chia và sau ngoặc.
Mở trang câu hỏi này →
A2
B6
C3
D5
Lời giải
Đáp án đúng: "2". Lần theo mã: dòng 1 gán aStr = 'Hello Bob' chạy bình thường; dòng 2 gọi int(aStr) nhưng chuỗi 'Hello Bob' không phải số nên Python ném ValueError, và vì không có try/except, chương trình dừng ngay tại đó. Cần nói thẳng: theo nghĩa chặt, dòng cuối cùng chạy thành công là dòng 1, vì dòng 2 bắt đầu thực thi nhưng thất bại; dòng 1 không có trong các lựa chọn, nên đáp án chốt là 2, tức dòng cuối cùng được thực thi, nơi chương trình dừng lại. Phương án "3" không bao giờ chạy vì chương trình đã dừng ở dòng 2; ngoài ra printf không tồn tại trong Python (hàm in là print), nên dù có tới được đây cũng ném NameError. Phương án "5" không được chạy tới, dù int('123') bản thân là hợp lệ và cho 123. Phương án "6" cũng không được chạy tới, và vì lại dùng printf nên nếu chạy cũng lỗi NameError.
Mở trang câu hỏi này →
AA variable
BA constant
CA parameter
DA pointer
Lời giải
Đáp án đúng: "A constant". 98.6 là một hằng (constant), hay literal: giá trị viết thẳng trong mã, cố định, không đổi khi chương trình chạy; ở đây là hằng số thực kiểu float. Python chỉ việc đưa giá trị đó cho print để in ra màn hình. "A variable" sai vì biến là một cái tên như x hay temp gắn với giá trị và có thể gán lại; 98.6 không phải tên, không thể viết 98.6 = 5. "A parameter" chưa đúng trọng tâm: tham số là tên biến trong phần định nghĩa hàm, dùng để nhận giá trị truyền vào; 98.6 là đối số (argument) được truyền cho print, nhưng bản thân nó vẫn là một hằng. "A pointer" sai vì Python không cho lập trình viên thao tác con trỏ như ngôn ngữ C; mọi tên chỉ là tham chiếu tới đối tượng, và 98.6 càng không phải một con trỏ.
Mở trang câu hỏi này →
A3.2e-3
B3.2e3
C0.32
D32e-3
Lời giải
Đáp án đúng: "3.2e3". Python viết số thực theo ký hiệu khoa học (scientific notation) bằng chữ e: phần trước e là phần định trị, phần sau e là số mũ cơ số 10, nên 3.2×10³ viết là 3.2e3 và có giá trị 3200.0, luôn mang kiểu float. "3.2e-3" sai vì số mũ âm nghĩa là 3.2×10⁻³ = 0.0032, nhầm dấu của số mũ. "0.32" sai vì đó là 3.2×10⁻¹, chỉ dời dấu chấm một chỗ sang trái. "32e-3" sai vì bằng 32×10⁻³ = 0.032, vừa đổi định trị vừa đổi dấu số mũ. Mẹo kiểm tra: gõ 3.2e3 == 3200 vào trình thông dịch sẽ được True.
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 →
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 →
A"She said 'Hi'"
B'She said "Hi"'
C'She said 'Hi''
DAll of the above
Lời giải
Đáp án đúng: ""She said 'Hi'"". Trong Python, chuỗi được bọc bằng nháy kép hoặc nháy đơn, và một loại nháy có thể nằm trong chuỗi bọc bằng loại kia mà không cần thoát ký tự, nên đây là chuỗi hợp lệ chứa nháy đơn bên trong. Nói thẳng chỗ tranh cãi: câu hỏi đòi chuỗi chứa cả nháy đơn lẫn nháy kép, nhưng thực ra không phương án nào chứa đồng thời hai loại; muốn vậy phải dùng nháy ba hoặc thoát ký tự bằng dấu gạch chéo ngược. Đáp án được chọn là cách viết tiêu biểu cho việc lồng một loại nháy vào loại kia. Cũng phải thừa nhận "'She said "Hi"'" hợp lệ y như vậy (nháy kép trong chuỗi nháy đơn), về ngữ nghĩa Python đúng ngang hàng, chỉ khác loại nháy bên ngoài. "'She said 'Hi''" gây SyntaxError: nháy đơn trước Hi đóng chuỗi sớm, khiến Hi thành một tên trần đứng sau chuỗi. "All of the above" sai vì có một phương án lỗi cú pháp.
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 →
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 →
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 →
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 →
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 →
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 →
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**
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 →
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 →
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 →
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 →