歡迎光臨
每天分享高質量文章

Python知識沖頂大會:這10個題,有 68% 的人答不對

來自:Python之禪(微訊號:VTtalk)

這10道題總共收到118條留言,回答正確的有40 人,68% 的人答錯了,以下是每道題的詳細解答。

第一題:下麵哪個單詞不是Python3裡面的關鍵字

a) eval
b) assert
c) nonlocal
d) pass

這道題選a,所謂關鍵字就是 Python 預先保留的識別符號,每個關鍵字都有特殊的含義,不能作為變數名,透過 keyword 可以檢視所有關鍵字,eval 是Python中的一個內建函式。

>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', ...]

第二題:運算式3*1**3的值是多少

a) 27
b) 9
c) 3
d) 1

這道題選c,考察的是運運算元優先順序,指數運算具有最高優先順序,下圖運運算元優先順序從高到低

第三題:下麵兩個運算式輸出內容是什麼?

>>> a = 1
>>> b = 1
>>> a is b
???
>>> a = 300
>>> b = 300
>>> a is b
???

a) True True
b) True False
c) False False
d) False True

這道題選b,考察的是 Python 中兩個整數物件的比較,“is” 比較物件記憶體地址,只有兩個物件都指向相同的地址時才傳回True,“==” 比較物件的值,值相等的兩個物件記憶體地址不一定相同。值為300的兩個整數在記憶體中是兩個不同的物件,介於[-5,256]之間的整數,值相同的整數都會共享同一個物件,所以不管記憶體中出現了多少個數值為1的物件,都表示同一個物件。

第四題:下麵這個函式的傳回值是什麼?

def func(a):
   a = a + '2'
   a = a*2
   return a
>>>func("hello")

a) hello
b) 字串不支援*操作
c) hello2
d) hello2hello2

選d,這道題考察是運運算元多載的概念,在Python中,運運算元支援多載,也就是說不僅數字支援“+”操作,串列也支援這些操作,因為串列物件多載了這兩個運運算元。自定義類也可以多載這些運運算元,例如:

class Point(object):
   def __init__(self, x: int, y: int):
       self.x = x
       self.y = y

   def __repr__(self):
       return "Point(x={}, y={})".format(self.x, self.y)

   def __add__(self, other):
       return Point(self.x + other.x, self.y + other.y)

   def __mul__(self, other):
       return Point(self.x * other.x, self.y * other.y)

>>> p1 = Point(1, 3)
>>> p2 = Point(2, 4)
>>> p1 + p2
Point(x=3, y=7)
>>> p1*p2
Point(x=2, y=12)

第五題:在Python中,運算式 0.1 + 0.2 == 0.3 的傳回是?

a) True
b) False
c) 不確定

選b,在Python中,數值物件都是用二進位制來表示的,浮點數也不例外,但不是所有的浮點數都能用二進位制精確表示的。一個浮點數轉化為二進位制就是是不斷的乘2,取其中的整數部分,例如:

(1) 0.1*2 = 0.2, 整數部分為0,小數部分為0.2 
(2) 0.2*2 = 0.4 , 整數部分為0,小數部分為0.4
(3) 0.4*2 = 0.8 , 整數部分為0,小數部分為0.8
(4) 0.8*2 = 1.6, 整數部分為1,小數部分為0.6
(5) 0.6*2 = 1.2, 整數部分為1,小數部分為0.2
重覆第2

所以0.1的二進製表示就是0.0 0011 0011 0011…,計算機沒法精確表示這個浮點數,所有就造成了誤差。

第六題:運算式 ~~~5 的值是多少?

a) +5
b) -11
c) +11
d) -5

“~”是按位取反運運算元,就是對整數的二進位制位進行取反,把1變為0,0變為1,例如5的二進製表示為00000101,按位取反是 111111010,這串二進位制在計算機裡面以補碼的形式儲存,我們需要把它轉換為原碼才知道它代表的真實數值是多少。因為這個補碼的最高位為1,所以他是一個負數,負數從補碼轉換為原碼是符號位保留為1,其它各位取反,再加1,所有 111111010 取反是 100000101,加1轉換成了原碼 100000110,轉換為10進位制整數就是-6(最高位為1表示負數),取三次反跟取一次是一樣的。所以這道題的答案是-6。

第七題:運算式 bool(‘False’) 的傳回值是:

a) True
b) False
c) 0
d) 1

選a,這道題考察的是物件的真假值,”False”在這裡是一個字串,只要不是空字串,bool傳回的結果就是True,下麵是真假值對照表。

第八題:運算式 True==False==False 的傳回值是:

a) True
b) False
c) 0
d) 1

選b,鏈式比較中,True==False==False 等價於 (True==False) and (False==False)

第九題:下麵運算式輸出結果為:

i = 0
while i < 5:
   print(i)
   i += 1
   if i == 3:
       break
else:
   print(0)

a) 0 1 2 0
b) 0 1 2
c) 0 1
d) 0 1 2 3

選b,這道題考察的是while … break …else 的執行邏輯,只要執行了break就不會執行else,反之亦然,沒有執行break就一定會執行else。

第十題:下麵運算式輸出結果為:

x = 12

def f1():
   x = 3
   print(x)

def f2():
   x += 1
   print(x)

f1()
f2()

a) 3 4
b) 3 13
c) 12 13
d) 3 報錯

選d,考察的是變數的作用域概念,模組中x是全域性變數,函式中的x是區域性變數,變數的查詢順序是LEGB,至於為什麼選d,請看這篇文章Python 開發者都會遇到的錯誤:UnboundLocalError


●本文編號335,以後想閱讀這篇文章直接輸入335即可

●輸入m獲取到文章目錄

推薦↓↓↓

Linux學習

更多推薦18個技術類公眾微信

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

贊(0)

分享創造快樂