逛知乎,看到帖子Python學到什麼程度可以面試工作?
,在桃花島主
的回答中講到2019年最新的Python面試題,同時還有旭東
大佬已做了大部分的解答。
博主會在幾篇博文中,結合大佬的回答,對這些題目做更詳盡的解答。
本文實例源碼github地址:https://github.com/yngzMiao/yngzmiao-blogs/tree/master/2020Q1/20200103。
基礎知識
- 列出5個常用Python標準庫?
import os
import sys
import re
import math
import time
import datetime
import random
import threading
import multiprocessing
- Python的內建數據類型有哪些?
int、float、complex # 數值型
bool # 布爾型
str # 字符串
list # 列表
tuple # 元組
dict # 字典
- 簡述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 中的上下文管理器。
- Python的可變和不可變數據類型?
- 不可變數據類型:即數據被創建之後,數據的值將不再發生改變,有數值、字符、元祖類型;
- 可變數據類型:數據別創建之後,數據的值可以發生變化,有列表、字典、集合類型。
- Python獲取當前日期?
# -*- coding: UTF-8 -*-
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)
- 用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
- 舉例說明異常模塊中try except else finally的相關意義。
# -*- coding: UTF-8 -*-
def read_filedata(file_name):
file_obj = ""
try:
# 需要檢測的異常代碼片段
file_obj = open(file_name, "r")
result_data = file_obj.read()
except IOError, e:
# 發生“IOError”異常進行處理的代碼片段
file_obj = "文件不存在:"+ str(e)
else:
# 沒有引發“IOError”異常執行的代碼片段,返回讀取到的數據
return result_data
finally:
# 不管有沒有引發錯誤都會執行的代碼片段,isinstance()用於判斷一個數據類型
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)
- 遇到 bug 如何處理?
- 首先查看報錯信息,根據報錯信息找到相應代碼,通常一般的數據結構或者算法錯誤只要找到報錯代碼就可以順利解決;
- 如果遇到暫時不能解決的錯誤先不要慌,我們可以使用編譯器的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)這兩個步驟。編譯是把源代碼編譯成機器碼,鏈接是把各個模塊的機器碼和依賴庫串連起來生成可執行文件。解釋型語言
:使用解釋器將源碼逐行解釋成機器碼並立即執行,不會進行整體性的編譯和鏈接處理,相比編譯型語言省了道工序。- 一個像是喫飯等菜都上全了再開動,一個像是喫火鍋,邊涮邊喫,時機不一樣。
- 解釋型語言的優點:跨平臺容易,只需提供特定平臺的解釋器;缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。
- 簡述解釋型和編譯型編程語言?
可參考上一條的解釋內容。
- Python的解釋器種類以及相關特點?
CPython
:官方版本的解釋器。這個解釋器是用C語言開發的,所以叫CPython。在命令行下運行python就是啓動CPython解釋器。 CPython是使用最廣的Python解釋器。IPython
:IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所增強,但是執行Python代碼的功能和CPython是完全一樣的。CPython用>>>作爲提示符,而IPython用In [序號]:作爲提示符。PyPy
:它的目標是執行速度。PyPy採用JIT技術,對Python代碼進行動態編譯(注意不是解釋),所以可以顯著提高Python代碼的執行速度。絕大部分Python代碼都可以在PyPy下運行,但是PyPy和CPython有一些是不同的,這就導致相同的Python代碼在兩種解釋器下執行可能會有不同的結果。Jython
:Jython是運行在Java平臺上的Python解釋器,可以直接把Python代碼編譯成Java字節碼執行。IronPython
:IronPython和Jython類似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,可以直接把Python代碼編譯成.Net的字節碼。
- 說說你知道的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是函數。例如:
# py2
>>> print("hello", "world")
('hello', 'world')
# py3
>>> print("hello", "world")
hello world
這個例子就比較明顯了,在py2中,print語句後面接的是一個元組對象,而在py3中,print函數可以接收多個位置參數。如果希望在Python2中把print當函數使用,那麼可以導入future模塊中的print_function。
import
:python2默認是按照相對路徑導入模塊和包,python3默認則是按照絕對路徑導入。
import的理解:python2和python3 通過import導入模塊和包的區別
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,一般使用在閉包中的,使變量使用外層的同名變量。
LEGB
作用域的理解:python3的local, global, nonlocal簡析
- Python3和Python2中int和long區別?
可參考上一條的解釋內容。
- xrange和range的區別?
可參考上上一條的解釋內容。