2017年度python面試題超綱20道(一)

這么冷的天 不困么

相關(guān)鏈接:

??過去的2017年中,在同性交友網(wǎng)站stackoverflow上又提了哪些超綱違規(guī)的問題呢?
??????問題來源stackoverflow

What is python .. (“dot dot”) notation syntax?

Python的 .. (點 點) 是什么語法?

f = 1..__truediv__ # or 1..__div__ for python 2
print(f(8)) # prints 0.125 

??真的超綱了喂。..是什么鬼啊摔。真的不是問**args是什么語法么?那我們用python試試好了。

>>> f = 1.
>>> f
1.0
>>> f.__floordiv__
<method-wrapper '__floordiv__' of float object at 0x7f9fb4dc1a20>

??咦,你是不是有看出來什么了。再看一個例子。

>>> 1..__add__(2.)
3.0

??大家都看出來了吧,..本身并不是什么操作符更不是什么語法。其中,第一個點是浮點值的一部分,第二個點是點操作符來訪問對象屬性和方法
??太簡單,下一題。

Why is x**4.0 faster than x**4 in Python 3?

為什么在Python3中 x4.0 比 x4運行的快?

$ python -m timeit "for x in range(100):" " x**4.0"
  10000 loops, best of 3: 24.2 usec per loop

$ python -m timeit "for x in range(100):" " x**4"
  10000 loops, best of 3: 30.6 usec per loop

??我先解釋下為什么會有這個問題,先不要討論提問者的電腦怎么這么慢好么。我拿python2試了一下,結(jié)果是這樣。

$ python -m timeit "for x in range(100):" " x**4.0"
  10000 loops, best of 3: 15.6 usec per loop

$ python -m timeit "for x in range(100):" " x**4"
  10000 loops, best of 3: 4.59 usec per loop

??可以明顯看出python2中int型計算明顯快于float。嗯...其實我已經(jīng)回答完了不知道大家有沒有發(fā)現(xiàn)。這個問題是由python2與python3差別引起的。
??先指出答案核心:python3的4是PyLongObject,pytohn2的4是int。

  • pytohn3與python2中的float對象依然是那個原生類。
  • python3中的int對象實例化一個支持任意長度的成熟類,叫PyLongObject
  • python2中的整數(shù)分為int與long,比如:
# Python 2
type(4)  # <type 'int'>
type(4L) # <type 'long'>

??以上的區(qū)別導(dǎo)致python3中整數(shù)的運算更加繁瑣復(fù)雜,因為你需要用PyLongObject對象的值來執(zhí)行它的ob_digit陣數(shù)組。(參考:Understanding memory allocation for large integers in Python for more on PyLongObjects.)

Given a string of a million numbers (Pi for example), write a function/program that returns all repeating 3 digit numbers and number of repetition greater than 1

給定一個長度為100萬的數(shù)字(比如π),寫代碼計算出所有連續(xù)的三個數(shù)字,且要求該連續(xù)的三個數(shù)字至少重復(fù)出現(xiàn)過一次。

# For example: if the string was: 123412345123456 then the function/program would return:

# 123 - 3 times
# 234 - 3 times
# 345 - 2 times

??提問的人最后還加了一句能不能實現(xiàn)時間復(fù)雜度為常數(shù)級解決方案?這很明顯的面試題嘛,假如面試時候你遇到這個你會怎么回答?
??首先,在O(1)情況下無法處理任意大小的數(shù)據(jù)結(jié)構(gòu),在這種情況下,最好的希望是O(n),其中n是字符串的長度,也就是線性時間復(fù)雜度。
??但是這里如果每次輸入定長100w,從技術(shù)的角度來說實現(xiàn)O(1)是可行的(以為數(shù)據(jù)源定長嘛就相當(dāng)于n=100w,這屬于咬文嚼字了沒意思),但是我相信這絕不會是這題重點。還是先給出python實現(xiàn)代碼好了:

inpStr = '123412345123456'

# O(1) array creation.
freq = [0] * 1000

# O(n) string processing.
for val in [int(inpStr[pos:pos+3]) for pos in range(len(inpStr) - 2)]:
    freq[val] += 1

# O(1) output of relevant array values.
print ([(num, freq[num]) for num in range(1000) if freq[num] > 1])

??代碼不復(fù)雜,相信大家都看的懂,我們繼續(xù)討論速度的問題。上述代碼可見實現(xiàn)O(n)是沒什么問題的,但是如果再提速呢?
??方法也有,運用歸并思想,將輸入值切片,多線程運行。像這樣

# 123412345123456
# 拆成
    vv
123412  vv
    123451
        5123456

??運用歸并的思想去解決問題,但問題來了,因為pytohn有GIL的存在,所以用python實現(xiàn)該思想可能成本很大。當(dāng)然你可以用其他語言實現(xiàn)。我覺得面試時候給出python代碼提出歸并思想就比較好了。

Why in python 0, 0 == (0, 0) equals (0, False)

為什么在Python中表達式 0, 0 == (0, False) 的結(jié)果是 (0, False)

(0, 0) == 0, 0   # results in a two element tuple: (False, 0)
0, 0 == (0, 0)   # results in a two element tuple: (0, False)
(0, 0) == (0, 0) # results in a boolean True 
# But:
a = 0, 0
b = (0, 0)
a == b # results in a boolean True

??這題很簡單啊,我換種寫法,標明優(yōu)先級大家就懂了。

(((0, 0) == 0), 0)   # results in a two element tuple: (False, 0)
(0, (0 == (0, 0)))   # results in a two element tuple: (0, False)
((0, 0) == (0, 0)) # results in a boolean True 
# ALSO:
a = 0, 0
b = (0, 0)
a == b # results in a boolean True

??逗號分隔符與相等運算符的優(yōu)先級是不同的。

Does Python optimize away a variable that's only used as a return value?

Python會把一個只用做返回值的變量優(yōu)化掉嗎?

# Case 1:
def func():
    a = 42
    return a

# Case 2:
def func2():
    return 42

??這個問題非常有趣,我是從來沒往這方面想過。我對其底層可能理解不多大家輕點噴,我把解決問題的過程幫大家寫出來,大家可以看著思考一下:

# 用dis打印運行過程

from dis import dis
# Case 1:
dis(func)
  2           0 LOAD_CONST               1 (42)
              2 STORE_FAST               0 (a)

  3           4 LOAD_FAST                0 (a)
              6 RETURN_VALUE

# Case 2:
dis(func2)
  2           0 LOAD_CONST               1 (42)
              2 RETURN_VALUE

??可以明顯的看出,問題的答案是沒有優(yōu)化,運行速度也是第二種快一丟丟,因為需要執(zhí)行的命令更少。嗯...其他解釋我就不太清楚了,我只能從這個層面回答解釋。

??那...我們下期再見?
??喜歡的話可以關(guān)注、點贊、順便看看前面文章,其實講道理,我覺得前面寫的大部分爬蟲文章還挺好的。
??生活愉快下期見。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 約莫還是當(dāng)年。 他們將酒壇捧高,肩疊肩,肘搭肘,薄甲春衫都不需論,只并靠著。夜風(fēng)里摻野露,陵光偏開臉想避避月色,高...
    沈懷書閱讀 1,345評論 0 2
  • 他慢慢向葉語芊走過去。走過去的時候正好聽見湘櫟正在對葉語芊說著什么。 “第三種可能,就是他對你也...
    一只小萌狐w閱讀 341評論 0 0
  • 想想為什么起這么一個昵稱,應(yīng)該是沒有什么人知道其中的原因。 解讀一下吧,因為爛木頭是一根從心里開始爛的木頭,從最里...
    一根爛木頭閱讀 408評論 3 2
  • 丁酉年六月初四辰時,余從校返家,適逢一尋人啟事,讀之有感,作此雜詩以抒懷。 艱難困苦總流去,兒孫滿堂享樂時。 光陰...
    豎子小閱讀 479評論 5 1

友情鏈接更多精彩內(nèi)容