本文截取了一些面試題及解決方案:javascript
Python 基礎java
什麼是 Python?根據Python 建立者 Guido van Rossum 所言,Python是一種高級編程語言,其設計的核心理念是代碼的易讀性,以及容許編程者經過若干行代碼輕鬆表達想法創意。實際上,不少開發者選擇學習 Python 的首要緣由是其編程的優美性,用它編碼和表達想法很是天然。面試
文件操做正則表達式
1.如有一個jsonline格式的文件file.txt,大小約爲10K,咱們的處理方式爲:編程
def get_lines(): l = [] with open('file.txt', 'rb') as f: for eachline in f: l.append(eachline) return l if __name__ == '__main__': for e in get_lines(): process(e) #處理每一行數據
如今要處理一個大小爲10G的file.txt文件,可是內存只有4G。若是在只修改get_lines 函數而其餘代碼保持不變的狀況下,應該如何實現?須要考慮的問題都有那些?json
def get_lines(): l = [] with open('file.txt','rb') as f: data = f.readlines(60000) l.append(data) yield l
要考慮的問題有:內存只有4G,沒法一次性讀入10G文件。而分批讀入數據要記錄每次讀入數據的位置,且分批每次讀取得過小會在讀取操做上花費過多時間。設計模式
模塊與包markdown
2.如何輸入日期, 判斷這一天是這一年的第幾天?網絡
import datetime def dayofyear(): year = input("請輸入年份: ") month = input("請輸入月份: ") day = input("請輸入天: ") date1 = datetime.date(year=int(year),month=int(month),day=int(day)) date2 = datetime.date(year=int(year),month=1,day=1) return (date1-date2).days+1
數據類型多線程
3.如何反轉字符串"aStr"?
print("aStr"[::-1])
4.下面代碼的輸出結果將是什麼?會報錯嗎?
list = ['a','b','c','d','e'] print(list[10:])
代碼將輸出[],並不會產生IndexError 錯誤。若是嘗試用超出成員的個數的index來獲取某個列表的成員,那就會報錯。例如,嘗試獲取 list[10] 和以後的成員,會致使IndexError。然而當咱們嘗試獲取列表的切片時,開始的index超過成員個數並不會產生IndexError,而是僅僅返回一個空列表。由於並不會報錯,因此這種Bug很難追蹤到。
5.請寫出一段Python代碼,實現刪除list裏面的重複元素?
l1 = ['b','c','d','c','a','a'] l2 = list(set(l1)) print(l2)
用list類的sort方法能夠保證順序不變:
l1 = ['b', 'c', 'd', 'c', 'a', 'a'] l2 = list(set(l1)) l2.sort(key=l1.index) print(l2)
也能夠這樣寫:
l1 = ['b', 'c', 'd', 'c', 'a', 'a'] l2 = sorted(set(l1), key=l1.index) print(l2)
也能夠用遍歷:
l1 = ['b', 'c', 'd', 'c', 'a', 'a'] l2 = [] for i in l1: if not i in l2: l2.append(i) print(l2)
企業面試題
6.設計實現遍歷目錄與子目錄,抓取.pyc文件
第一種方法:
import os def getFiles(dir, suffix): res = [] for root, dirs, files in os.walk(dir): for filename in files: name, suf = os.path.splitext(filename) if suf == suffix: res.append(os.path.join(root, filename)) print(res) getFiles("./", '.pyc')
第二種方法:
import os def pick(obj): try: if obj.[-4:] == ".pyc": print(obj) except: return None def scan_path(ph): file_list = os.listdir(ph) for obj in file_list: if os.path.isfile(obj): pick(obj) elif os.path.isdir(obj): scan_path(obj) if __name__ == '__main__': path = input('輸入目錄') scan_path(path)
7.如何反轉一個整數,例如-123--> -321?
class Solution(object): def reverse(self, x): if -10 < x < 10: return x str_x = str(x) if str_x[0] != "-": str_x = str_x[::-1] x = int(str_x) else: str_x = str_x[1:][::-1] x = int(str_x) x = -x return x if -2147483648 < x < 2147483647 else 0 if __name__ == '__main__': s = Solution() reverse_int = s.reverse(-120) print(reverse_int)
Python高級
Python高級包含不少重要的模塊,例如函數、類和實例、系統編程、正則表達式、網絡編程等等。根據這些高級屬性,Python可用於數據科學、網頁開發、機器學習等等。
設計模式
8.對設計模式的理解,簡述你瞭解的設計模式?
設計模式是爲咱們常常會碰到的一些編程問題構建的可重用解決方案,它是總結性和經優化的。一個設計模式並不像一個類或一個庫那樣可以直接做用於咱們的代碼,反之,設計模式更爲高級,它是一種在特定情形下實現的方法模板。常見的是工廠模式和單例模式。
單例模式應用的場景通常發如今如下條件下:資源共享的狀況下,避免因爲資源操做時致使的性能或損耗等,如日誌文件,應用配置。控制資源的狀況下,方便資源之間的互相通訊。
9.生成器和迭代器的區別?
迭代器是一個更抽象的概念,任何對象,若是它的類有 next 方法和 iter 方法返回本身自己,它就是可迭代的。對於 string、list、dict、tuple 等這類容器對象,使用for循環遍歷是很方便的,for 語句實際上會對容器對象調用 iter() 函數。iter() 會返回一個定義了 next() 方法的迭代器對象,它在容器中逐個訪問容器內元素,在沒有後續元素時,next()會拋出一個StopIteration異常。
生成器(Generator)是建立迭代器的簡單而強大的工具。它們寫起來就像是正規的函數,只是在須要返回數據的時候使用yield語句。生成器能作到迭代器能作的全部事,並且由於自動建立iter()和next()方法,生成器顯得特別簡潔,並且生成器也是高效的,使用生成器表達式取代列表解析能夠同時節省內存。除了建立和保存程序狀態的自動方法,當發生器終結時,還會自動拋出StopIteration異常。
10.對裝飾器的理解,你能寫出一個計時器裝飾器,它能記錄函數的執行時間嗎?
裝飾器本質上是一個Python函數,它可讓其餘函數在不須要作任何代碼變更的前提下增長額外功能,裝飾器的返回值也是一個函數對象。
import time def timeit(func): def wrapper(): start = time.clock() func() end = time.clock() print('used:',end-start) return wrapper @timeit def foo(): print('in foo()'foo())
系統編程
11.介紹一下你瞭解的進程。
程序運行在操做系統上的一個實例,就稱之爲進程。進程須要相應的系統資源:內存、時間片、pid。建立進程:首先要導入multiprocessing中的Process;建立一個Process對象;建立Process對象時,能夠傳遞參數。
p = Process(target=XXX, args=(tuple,), kwargs={key: value}) target = XXX # 指定的任務函數,不用加() args = (tuple,) kwargs = {key: value} # 給任務函數傳遞的參數
使用start()啓動進程 結束進程 給子進程指定函數傳遞參數Demo
import os from mulitprocessing import Process import time def pro_func(name, age, **kwargs): for i in range(5): print("子進程正在運行中,name=%s,age=%d,pid=%d" % (name, age, os.getpid())) print(kwargs) time.sleep(0.2) if __name__ == "__main__": # 建立Process對象 p = Process(target=pro_func, args=('小明', 18), kwargs={'m': 20}) # 啓動進程 p.start() time.sleep(1) # 1秒鐘以後,馬上結束子進程 p.terminate() p.join()
12.談談你對多進程、多線程、以及協程的理解,項目是否用?
進程:一個運行的程序(代碼)就是一個進程,沒有運行的代碼叫程序,進程是系統資源分配的最小單位,進程擁有本身獨立的內存空間,全部進程間數據不共享,開銷大。線程: cpu調度執行的最小單位,也叫執行路徑,不能獨立存在,依賴進程存在,一個進程至少有一個線程,叫主線程,而多個線程共享內存能夠極大地提升了程序的運行效率。協程: 是一種用戶態的輕量級線程,協程的調度徹底由用戶控制,協程擁有本身的寄存器上下文和棧。協程調度時,將寄存器上下文和棧保存到其餘地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操中棧則基本沒有內核切換的開銷,能夠不加鎖的訪問全局變量,因此上下文的切換很是快。
關於系統編程還有不少問題,例如: