牛客Python題目

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

"單下劃線" 開始的成員變量叫作保護變量,意思是隻有類對象和子類對象本身能訪問到這些變量;
"雙下劃線" 開始的是私有成員,意思是隻有類對象本身能訪問,連子類對象也不能訪問到這個數據。java

以單下劃線開頭(_foo)的表明不能直接訪問的類屬性,需經過類提供的接口進行訪問,不能用「from xxx import *」而導入;以雙下劃線開頭的(__foo)表明類的私有成員;以雙下劃線開頭和結尾的(__foo__)表明python裏特殊方法專用的標識,如 __init__()表明類的構造函數。python

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

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

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

 C.只有在__new__返回一個cls的實例時,後面的__init__才能被調用。spa

 D.當建立一個新實例時調用__new__,初始化一個實例時用__init__。 code

__init__ 方法爲初始化方法, __new__方法纔是真正的構造函數。 對象

__new__方法默認返回實例對象供__init__方法、實例方法使用。 blog

__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。
相關文章
相關標籤/搜索