精心整理的8道Python面試題!是否難到你了

每年的3-4月份是跳槽的高峯期,無論是應聘Python web開發,爬蟲工程師,或是數據分析,還是自動化運維,都涉及到一些基礎的知識!我挑了一些Python的基礎面試題,看看你能不能的答上來,也許面試的同學用的着!

NO.1

Python這麼好

說說它的特性吧

關鍵特性

  • Python是一種解釋型語言,這意味着,與C,C++不同,Python不需要在運行之前進行編譯。它是邊運行邊解釋。

  • Python是動態類型化的,這意味着當你聲明它們或類似的東西時,你不需要聲明變量的類型。你可以x=1 ,然後x="abc"沒有錯誤

  • Python非常適合面向對象編程,因爲它允許定義類以及組合和繼承。Python沒有訪問修飾符(如C ++的public,private).

  • 在Python中函數是一等對象,這意味着它們可以在運行時動態創建,能賦值給變量或者作爲參數傳給函數,還能能作爲函數的返回值

  • Python代碼容易上手,開發速度很快,但運行速度通常比編譯語言慢。幸運的是,Python允許包含基於C的擴展,所以瓶頸可以被優化掉,比如,numpy包就是一個很好的例子,它非常快,因爲它所做的很多運算在底部都是用C編

  • 寫的!

在這裏還是要推薦下我自己建的Python開發學習羣:483546416,羣裏都是學Python開發的,如果你正在學習Python ,小編歡迎你加入,大家都是軟件開發黨,不定期分享乾貨(只有Python軟件開發相關的),包括我自己整理的一份2018最新的Python進階資料和高級開發教程,歡迎進階中和進想深入Python的小夥伴

NO.2

Python中的賦值

淺拷貝和深拷貝的區別

深淺拷貝區別

1).對象的賦值

Python中對象的賦值實際上是簡單的對象引用也就是說,當你創建一個對象,然後把它複製給另一個變量的時候,Python並沒有拷貝這個對象,而是拷貝了這個對象的引用。

精心整理的8道Python面試題!是否難到你了

2).淺拷貝

一般使用copy.copy(),可以進行對象的淺拷貝.它複製了對象但對於對象中的元素,依然使用原始的引用.

精心整理的8道Python面試題!是否難到你了

使用copy對a進行淺拷貝,b複製了a的對象,但是b裏面的[2,3,4]和a裏面的[2,3,4]其實都是指向同一塊內存地址,所以改變了a[1]之後,b裏面的b[1]也發生了改變!

3).深度拷貝

深度拷貝需要用copy.deepcopy()進行深拷貝。它會複製一個容器對象,以及它裏面的所有元素(包含元素的子元素)

精心整理的8道Python面試題!是否難到你了

當對a列表進行深度拷貝之後,b複製了a的對象,但是b裏面的[2,3,4]和a裏面的[2,3,4]其實都是指向不同的內存地址.

a[1].append(5) print (a) print (b)>> [1, [2, 3, 4, 5]]#因爲是深度拷貝,改變了a[1],b[1]內容不會改變 [1, [2, 3, 4]]

NO.3

Python中的==

和is的區別

==和is

Python中==和is的區別

is是判讀對象標識符是否一致,而==是判讀兩個對象的內容是否相等!

  • x is y 相當於 id(x)==id(y)

  • ==是檢查兩個對象的內容是否相等,會調用對象的內部__eq__().

精心整理的8道Python面試題!是否難到你了

NO.4

線程如何在Python

中實現

多線程問題

線程如何在Python中實現

Python有一個多線程包threading,可以使用多線程來加快你的代碼。但是Python有一個叫做Global Interpreter Lock(GIL)的構造。GIL確保只有一個'線程'可以在任何時候執行。

線程獲取GIL,做一些工作,然後將GIL傳遞到下一個線程。這種情況發生得非常快,所以對於人眼而言,它可能看起來像你的線程並行執行,但它們實際上只是輪流使用相同的CPU內核。因此GIL的存在使得Python中的多線程無法真正的利用多核的優勢來提高性能。

對於IO密集型操作,在等待操作系統返回的時候會釋放GIL;再比如爬蟲因爲有等待的服務器的響應時間,可以利用多線程來加速!但是對於CPU密集型操作,只能通過多進程Multiprocess來加速。

NO.5

Python中的

猴子補丁式啥

猴子補丁

Python中的猴子補丁是什麼?

考慮下面的例子:

精心整理的8道Python面試題!是否難到你了

>>

f()

猴子補丁:

是一種非常Pythonic的用法,即函數在python中可以像使用變量一樣對它進行賦值等操作,我們可以在運行時動態替換模塊,俗稱手法稱爲猴子補丁!我們通過對MyClass.f 重新賦值,動態的改變了輸出的結果.

精心整理的8道Python面試題!是否難到你了

NO.6

Python中的

負數index

負值索引

Python中的負數index是用來做什麼的?

Python中的序列是索引的,它由正數和負數組成。正的數字使用'0'作爲第一個索引,'1'作爲第二個索引。

負數的索引從'-1'開始,表示序列中的最後一個索引,'-2'作爲倒數第二個索引,序列像正數一樣向前。

負數索引也可以用來非常方便的切片,比如:

s='abcdedf'

print (s[1:-1])

>>bcded

NO.7

類裏面的new

和init的區別

new/init區別

說說__new__和__init__的區別

  • __init__爲初始化方法,而__new__方法纔是是真正的構造函數。只有繼承了object的新式類纔有__new__.

  • __new__至少要有一個參數cls,代表要實例化的類,此參數在實例化時由Python解釋器自動提供,__new__必須要有返回值,返回實例化出來的實例。

  • __init__有一個參數self,就是這個__new__返回的實例, 先運行__new__ 然後才運行__init__.

  • __init__在__new__的基礎上可以完成一些其它初始化的動作,__init__不需要返回值.

NO.8

Python中的

參數

*args和**kwargs

Python中的*args,**kwargs的用法

*args是可變參數,一般用來表示我們不能確定多少參數將被傳遞給函數,或者如果我們想用列表或元組的方式傳遞給函數.

精心整理的8道Python面試題!是否難到你了

**kwars是可變關鍵字參數,當我們不知道有多少關鍵字參數會傳遞給一個函數時,或者想把一個字典作爲關鍵字參數時使用

精心整理的8道Python面試題!是否難到你了

注:*args和**kwargs可以同時在函數的定義中,但是*args必須在**kwargs前面.

更多Python面試題,,私信回覆:學習資料。與更多人一起學習Python。

很多人想要了解Python實現人臉識別,今天我們就來講下

人臉識別,乍一聽還是高大上的東西.

今天我們就分享下怎麼玩?

不需要一大坨代碼,只要你會裝……包.

當然,我們的重點不是裝包,歸根結底,還是怎麼玩.

Ok,那麼,我們開始

一、需要安裝什麼?

1.OpenCV 一個圖像處理的強大的包.官網 http://opencv.org/,最新的版本3.3.0

  • 不需要最新的版本直接brew install opencv3,我這裏裝好是3.2.0的

  • 如果需要最新的版本3.3.0的話,請按照這裏安裝 http://www.pyimagesearch.com/2016/12/19/install-opencv-3-on-macos-with-homebrew-the-easy-way/

2.Python2.7或者Python3.x

3.依賴包NumPY. 可以pip install numpy

4.依賴包face recognition.主角就是他了.pip install face recognition

注意事項參照地址 https://github.com/ageitgey/face_recognition

二、怎麼玩

  1. 我們首先給定一張被照片

精心整理的8道Python面試題!是否難到你了

2.從攝像頭捕捉的圖像裏獲取檢測出頭像,跟上面的照片的圖片進行對比.

先看下結果:

精心整理的8道Python面試題!是否難到你了

從截下來的圖片來看. 我自己因爲沒有放圖片上去進行識別,所以是unknown的. 手機上的圖片被識別到了寫上chu(名字) 標籤.

代碼:

import face_recognition import cv2 import time #獲取攝像頭video_capture = cv2.VideoCapture(0)# 加載圖片obama_image = face_recognition.load_image_file("IMG_20170723_213850R.jpg") # 圖片先識別一遍人臉,後面用來比較obama_face_encoding = face_recognition.face_encodings(obama_image)[0]# 初始化變量face_locations = [] face_encodings = [] face_names = [] process_this_frame = Truewhile True: # 從攝像頭獲取圖像 ret, frame = video_capture.read() # 縮放1/4大小,方便快速處理 small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25) # 保證只處理一遍 if process_this_frame: #找出所有的人臉 face_locations = face_recognition.face_locations(small_frame) face_encodings = face_recognition.face_encodings(small_frame, face_locations) face_names = [] for face_encoding in face_encodings: # 判斷是否匹配給定的人臉 match = face_recognition.compare_faces([obama_face_encoding], face_encoding) name = "Unknown" if match[0]: name = "CHU<del>" face_names.append(name) process_this_frame = not process_this_frame # 把識別到和爲識別到的人臉進行標記 for (top, right, bottom, left), name in zip(face_locations, face_names): # 原來是1/4的大小,現在放大4倍 top *= 4 right *= 4 bottom *= 4 left *= 4 # 給臉部畫框 cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) # 臉部下面顯示標籤 cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), 2) font = cv2.FONT_HERSHEY_DUPLEX cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.5, (255, 255, 255), 3) #識別到時候進行抓屏 for name in face_names: if name=="CHU</del>": cv2.imwrite('img-%d.png'%int(time.time()), frame) # 顯示加了頭像框視頻 cv2.imshow('Video', frame) # Hit 'q' on the keyboard to quit! if cv2.waitKey(1) & 0xFF == ord('q'): break# 釋放攝像頭句柄video_capture.release() cv2.destroyAllWindows()

如果我的分享對你有幫助,與你分享更多Python方面的知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章