逛知乎,看到帖子Python學到什麼程度能夠面試工做?,在桃花島主的回答中講到2019年最新的Python面試題,同時還有旭東大佬已作了大部分的解答。
基礎知識
-
列出5個經常使用Python標準庫?
import os
import sys
import re
import math
import time
import datetime
import random
import threading
import multiprocessing複製代碼
int、float、complex
bool
str
list
tuple
dict 複製代碼
3. 簡述with方法打開處理文件幫我咱們作了什麼?
-
with語句適用於對資源進行訪問的場合,確保無論使用過程當中是否發生異常都會執行必要的清理操做,釋放資源,好比文件使用後自動關閉、線程中鎖的自動獲取和釋放等;
-
with語句即上下文管理器,在程序中用來表示代碼執行過程當中所處的先後環境。上下文管理器:含有__enter__和__exit__方法的對象就是上下文管理器。
-
enter():在執行with語句以前,首先執行該方法,一般返回一個實例對象,若是with語句有as目標,則將對象賦值給as目標。
-
exit():在執行with語句結束後,自動調用__exit__()方法,用戶釋放資源,若此方法返回布爾值True,程序會忽略異常。
-
使用環境:文件讀寫、線程鎖的自動釋放等。
with context_expression [as target(s)]:
with-body複製代碼
這裏context_expression要返回一個上下文管理器對象,該對象並不賦值給as子句中的target(s),而是會將上下文管理器的__enter__()方法的返回值賦值給target(s)。
不太清楚的能夠參考連接:深刻理解 Python 中的上下文管理器。
交流羣:887934385 遇到問題能夠再羣內交流,當中有資料分享 python
import datetime
import time
if __name__ == "__main__":
print(time.time())
print(time.strftime("%Y-%m-%d %H:%M:%S %w", time.localtime()))
print(datetime.datetime.now()) 複製代碼
def word_amount(sentence):
split_list = sentence.split()
dict_result = {}
for word_name in split_list:
if word_name not in dict_result.keys():
dict_result[word_name] = 1
else:
dict_result[word_name] += 1
return dict_result
if __name__ == '__main__':
sentence = "I can because i think i can"
dict_result = word_amount(sentence)
print(dict_result)複製代碼
if __name__ == '__main__':
sentence = "I can because i think i can"
result = {word: sentence.split().count(word) for word in set(sentence.split())}
print(result)複製代碼
from collections import Counter
if __name__ == '__main__':
sentence = "I can because i think i can"
counts = Counter(sentence.split())
print(counts)複製代碼
7. 用python刪除文件和用linux命令刪除文件方法。
import os
os.remove("demo.txt")複製代碼
rm demo.txt複製代碼
class printException(Exception):
pass
def testRaise():
raise printException('printErr')
if __name__ == '__main__':
try:
testRaise()
except printException, e:
print e複製代碼
9. 舉例說明異常模塊中try except else finally的相關意義。
def read_filedata(file_name):
file_obj = ""
try:
file_obj = open(file_name, "r")
result_data = file_obj.read()
except IOError, e:
file_obj = "文件不存在:"+ str(e)
else:
return result_data
finally:
if isinstance(file_obj, str):
return file_obj
elif isinstance(file_obj, file):
file_obj.close()
else:
return "未知錯誤,請檢查您的代碼..."
if __name__ == '__main__':
result = read_filedata("abc.txt")
print(result)複製代碼
首先查看報錯信息,根據報錯信息找到相應代碼,一般通常的數據結構或者算法錯誤只要找到報錯代碼就能夠順利解決;
若是遇到暫時不能解決的錯誤先不要慌,咱們可使用編譯器的Debug模式或者本身在代碼中加註斷點進行代碼排查;
若是依然不能解決bug,咱們能夠拷貝報錯信息,在搜索引擎中進行搜索。 沒有人寫代碼不出bug,若是你在一個bug上耗費時間超過半小時,能夠與其餘同事探討(注意節制,可能有些費同事);
另闢蹊徑:方法總比困難多,在進行快速開發時,咱們應該優先實現功能而不是拘泥於運行效率,因此遇到一些暫時不能解決的BUG能夠考慮另外的實現方法。
語言特性
-
談談對Python的瞭解和其餘語言的區別?
Python是一門語法簡潔優美,功能強大無比,應用領域很是普遍,具備強大完備的第三方庫的一門強類型的動態,可移植,可擴展,可嵌入的解釋型編程語言。
-
若是語言常常隱式地轉換變量的類型,那這個語言就是弱類型語言,若是不多會這樣作,那就是強類型語言。Python不多會隱式地轉換變量的類型,因此Python是強類型的語言。
-
強類型語言和弱類型緣由其判斷的根本是是否會隱式進行語言類型轉變。強類型緣由在速度上可能略遜於弱類型語言,可是強類型定義語帶來的嚴謹性又避免了沒必要要的錯誤。
-
強類型語言包括:Java、.net、Python、C++等語言。其中Python是動態語言,是強類型定義語言,是類型安全的語言,Java是靜態語言,是強類型定義語言,也是類型安全的語言;弱類型語言包括:VB,PHP,JavaScript等語言。其中VBScript是動態語言,是一種類型不安全的緣由。
-
動態類型語言:動態性語言是指在運行期間纔去作數據類型檢查的語言,也就是說動態類型語言編程時,永遠不用給任何變量指定數據類型,該語言會在第一次賦值給變量時,在內部將數據類型記錄下來**。Python和Ruby就是一種典型的動態類型語言,其餘的各類腳本語言如VBScript也多少屬於動態類型語言。
-
靜態類型語言:靜態類型語言與動態類則恰好相反,它的數據類型在編譯期間檢查,也就是說在寫程序時要聲明全部變量的數據類型,C/C++是靜態類型語言的典型表明,其餘靜態語言還有C#、Java等。
-
對於動態語言與靜態語言的區分,其根本在於數據類型是在運行期間檢查仍是在編譯期間檢查。
-
編譯型語言:須要將一段程序直接翻譯成機器碼(對於C/C++這種非跨平臺的語言)或者中間碼(Java這種跨平臺語言,須要虛擬機再將中間碼印射成機器碼)。通常需通過編譯(compile)、連接(linker)這兩個步驟。編譯是把源代碼編譯成機器碼,連接是把各個模塊的機器碼和依賴庫串連起來生成可執行文件。
-
解釋型語言:使用解釋器將源碼逐行解釋成機器碼並當即執行,不會進行總體性的編譯和連接處理,相比編譯型語言省了道工序。
-
一個像是吃飯等菜都上全了再開動,一個像是吃火鍋,邊涮邊吃,時機不同。
-
解釋型語言的優勢:跨平臺容易,只需提供特定平臺的解釋器;缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。
-
簡述解釋型和編譯型編程語言?
-
說說你知道的Python3和Python2之間的區別?
編碼:Python2的默認編碼是asscii,這也是致使Python2中常常遇到編碼問題的緣由之一,至因而爲何會使用asscii做爲默認編碼,緣由在於Python這門語言誕生的時候還沒出現Unicode。Python3默認採用了UTF-8做爲默認編碼,所以你再也不須要在文件頂部寫# coding=utf-8了。
字符串:Python2中字符的類型,str:已經編碼後的字節序列,unicode:編碼前的文本字符;而Python3中字符的類型,str:編碼過的unicode文本字符,bytes:編碼前的字節序列。
能夠認爲字符串有兩種狀態,即文本狀態和字節(二進制)狀態。Python2和Python3中的兩種字符類型都分別對應這兩種狀態,而後相互之間進行編解碼轉化。編碼就是將字符串轉換成字節碼,涉及到字符串的內部表示;解碼就是將字節碼轉換爲字符串,將比特位顯示成字符。
在Python2中,str和unicode都有encode和decode方法。可是不建議對str使用encode,對unicode使用decode, 這是Python2設計上的缺陷。Python3則進行了優化,str只有一個encode方法將字符串轉化爲一個字節碼,並且bytes也只有一個decode方法將字節碼轉化爲一個文本字符串。
print:Python2中的print是語句;Python3中的print是函數。例如:
>>> print("hello", "world")
('hello', 'world')
>>> print("hello", "world")
hello world複製代碼
這個例子就比較明顯了,在py2中,print語句後面接的是一個元組對象,而在py3中,print函數能夠接收多個位置參數。若是但願在Python2中把print當函數使用,那麼能夠導入future模塊中的print_function。
import:python2默認是按照相對路徑導入模塊和包,python3默認則是按照絕對路徑導入。
input:Python3:input解析輸入爲str字符型;Python2:input解析輸入爲int型,raw_input解析輸入爲str類型。
算法符:在Python2中,/執行傳統除法,對於整數執行截斷除法,浮點數執行浮點除法(保留小數部分,即便整除);//執行Floor除法,截除掉餘數而且針對整數操做數返回一個整數,若是有任何一個操做數是浮點數,則返回一個浮點數。在Python3中,/老是執行真除法,無論操做數的類型,都會返回包含任何餘數的浮點結果;//執行Floor除法,截除掉餘數而且針對整數操做數返回一個整數,若是有任何一個操做數是浮點數,則返回一個浮點數。
int/long:Python3裏,只有一種整數類型int,大多數狀況下,它很像Python2裏的長整型。Python2有爲非浮點數準備的int和long類型。int類型的最大值不能超過sys.maxint,並且這個最大值是平臺相關的。
True和False:在Python2中,True和False是兩個全局變量(名字),在數值上分別對應1和0,既然是變量,那麼它們就能夠指向其它對象。Python3修正了這個缺陷,True和False變爲兩個關鍵字,永遠指向兩個固定的對象,不容許再被從新賦值。
迭代器:在Python2中不少返回列表對象的內置函數和方法在Python3都改爲了返回相似於迭代器的對象,由於迭代器的惰性加載特性使得操做大數據更有效率。
例如:Python2中使用xrange()來建立一個迭代器對象,使用range()建立一個list數組(要生成很大的數字序列的時候,用xrange會比range性能優不少,由於不須要一上來就開闢一塊很大的內存空間);Python3中使用range()建立迭代器對象,移除了xrange()方法。
另外,字典對象的dict.keys()、dict.values()方法都再也不返回列表,而是以一個相似迭代器的view對象返回。高階函數map、filter、zip返回的也都不是列表對象了。Python2的迭代器必須實現next方法,而Python3改爲了__iter__()、next。
nonlocal:在Python2中能夠在函數裏面能夠用關鍵字global聲明某個變量爲全局變量,可是在嵌套函數中,想要給一個變量聲明爲非局部變量是無法實現的,在Pyhon3,新增了關鍵字nonlcoal,通常使用在閉包中的,使變量使用外層的同名變量。
-
Python3和Python2中int和long區別?
-
xrange和range的區別?
交流羣:887934385 遇到問題能夠再羣內交流,當中有資料分享
linux