1. 程式人生 > >牛客Python題目

牛客Python題目

1. python單下劃線_foo、雙下劃線__foo、__foo__的區別。

"單下劃線" 開始的成員變數叫做保護變數,意思是隻有類物件和子類物件自己能訪問到這些變數;
"雙下劃線" 開始的是私有成員,意思是隻有類物件自己能訪問,連子類物件也不能訪問到這個資料。

以單下劃線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的介面進行訪問,不能用“from xxx import *”而匯入;以雙下劃線開頭的(__foo)代表類的私有成員;以雙下劃線開頭和結尾的(__foo__)代表python裡特殊方法專用的標識,如 __init__()代表類的建構函式。

2. python中__new__和__init__的區別,說法正確的是? (A B C D)

 A.__new__是一個靜態方法,而__init__是一個例項方法。

 B.__new__方法會返回一個建立的例項,而__init__什麼都不返回。

 C.只有在__new__返回一個cls的例項時,後面的__init__才能被呼叫。

 D.當建立一個新例項時呼叫__new__,初始化一個例項時用__init__。 

__init__ 方法為初始化方法, __new__方法才是真正的建構函式。

__new__方法預設返回例項物件供__init__方法、例項方法使用。

__init__ 方法為初始化方法,為類的例項提供一些屬性或完成一些動作。

__new__ 方法建立例項物件供__init__ 方法使用,__init__方法定製例項物件。

__new__是一個靜態方法,而__init__是一個例項方法。

3.  有如下函式定義,執行結果正確的是?()

def dec(f):   n = 3   def wrapper(*args,**kw):     return f(*args,**kw) * n   return wrapper  
@dec def foo(n):   return n * 2

A.foo(2) == 12 B.foo(3) == 12 C.foo(2) == 6 D.foo(3) == 6

@dec 的作用是把原 foo 函式(待裝飾函式)賦值給 dec 函式(裝飾器),然後將返回值 wrapper 函式(已裝飾函式)重新賦值給 foo 函式。因此,foo 語句實際執行情況是:foo(2) = foo(2) * 3 = 2 * 2 * 3 = 12,其中前面的 foo 函式是已裝飾函式,後面的 foo 函式是原來的待裝飾函式。By the way,函式引數中的 *args 代表可變引數,**kw 代表關鍵字引數。

4. 裝飾器執行順序。

def decorator_a(func): print 'Get in decorator_a' def inner_a(*args, **kwargs): print 'Get in inner_a' return func(*args, **kwargs) return inner_a def decorator_b(func): print 'Get in decorator_b' def inner_b(*args, **kwargs): print 'Get in inner_b' return func(*args, **kwargs) return inner_b @decorator_b @decorator_a def f(x): print 'Get in f' return x * 2 f(1)

實際上執行的結果如下:

Get in decorator_a
Get in decorator_b Get in inner_b Get in inner_a Get in f

4.下列程式碼 [i**i for i in xrange(3)] 的執行結果是(A)

A.[1, 1, 4] B.[0, 1, 4] C.[1, 2, 3] D.(1, 1, 4)

(1)這是一個列表生成式,即對於生成器 xrange(3) 中的每個值(分別是0,1,2),賦值給變數 i,然後執行 i**i 的操作。

(2)xrange() 與 range() 的用法完全相同,區別是 xrange() 的返回值是生成器,而 range() 的返回值是列表。(Python3 range即為原來的xrange)

(3)Python 中的 ** 運算代表冪運算,但有個特殊情況,官方文件中把 0**0 的值定義為 1

 

5. 'a' < 'b' < 'c' 返回(True)。('a' > 'b' or 'c') 返回 ('c')。

Python 支援連續比較,'a' < 'b' < 'c' 相當於 'a' < 'b' and 'b' < 'c',其本質是字元 ASCII 碼的大小比較,該判斷式結果為 True。

 

6. 下列程式碼的列印結果是 (報錯)。 x =  1 def change(a):      x +=  1      print x change(x)   Python的變數作用範圍(即LEGB規則)。是錯在 x+=1,print(x)沒錯。定義在外部的變數是有全域性作用域,但是函式內部未宣告global時,只可讀而不能寫。   7. 如何解釋下面的執行結果? (B)
print 1.2 - 1.0 == 0.2
False
A. Python的實現有錯誤 B. 浮點數無法精確表示 C. 布林運算不能用於浮點數比較 D. Python將非0數視為False   Python 中浮點數的運算存在誤差。1.2 - 1.0的值不是0.2,而是0.19999999999999996。