答案python
下面是一些關鍵點:程序員
Python是一種解釋型語言。這就是說,與C語言和C的衍生語言不一樣,Python代碼在運行以前不須要編譯。其餘解釋型語言還包括PHP和Ruby。算法
Python是動態類型語言,指的是你在聲明變量時,不須要說明變量的類型。你能夠直接編寫相似x=111和x="I'm a string"這樣的代碼,程序不會報錯。編程
Python很是適合面向對象的編程(OOP),由於它支持經過組合(composition)與繼承(inheritance)的方式定義類(class)。Python中沒有訪問說明符(access specifier,相似C++中的public和private),這麼設計的依據是「你們都是成年人了」。網絡
在Python語言中,函數是第一類對象(first-class objects)。這指的是它們能夠被指定給變量,函數既能返回函數類型,也能夠接受函數做爲輸入。類(class)也是第一類對象。數據結構
Python代碼編寫快,可是運行速度比編譯語言一般要慢。好在Python容許加入基於C語言編寫的擴展,所以咱們可以優化代碼,消除瓶頸,這點一般是能夠實現的。numpy就是一個很好地例子,它的運行速度真的很是快,由於不少算術運算其實並非經過Python實現的。函數
Python用途很是普遍——網絡應用,自動化,科學建模,大數據應用,等等。它也常被用做「膠水語言」,幫助其餘語言和組件改善運行情況。學習
Python讓困難的事情變得容易,所以程序員能夠專一於算法和數據結構的設計,而不用處理底層的細節大數據
A0 = dict(zip(('a','b','c','d','e'),(1,2,3,4,5)))優化
A1 = range(10)
A2 = [i for i in A1 if i in A0]
A3 = [A0[s] for s in A0]
A4 = [i for i in A1 if i in A3]
A5 = {i:i*i for i in A1}
A6 = [[i,i*i] for i in A1]
答案
A0 = {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}
A1 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
A2 = []
A3 = [1, 3, 2, 5, 4]
A4 = [1, 2, 3, 4, 5]
A5 = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
A6 = [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16], [5, 25], [6, 36], [7, 49], [8, 64], [9, 81]]
若是咱們不知道要往函數中傳入多少個關鍵詞參數,或者想傳入字典的值做爲關鍵詞參數時,那就要使用**kwargs。
args和kwargs這兩個標識符是約定俗成的用法,你固然還能夠用*bob和**billy,可是這樣就並不太妥。
4 簡要描述Python的垃圾回收機制(garbage collection)。(重點)
答案
這裏能說的不少。你應該提到下面幾個主要的點:
Python在內存中存儲了每一個對象的引用計數(reference count)。若是計數值變成0,那麼相應的對象就會小時,分配給該對象的內存就會釋放出來用做他用。
偶爾也會出現引用循環(reference cycle)。垃圾回收器會定時尋找這個循環,並將其回收。舉個例子,假設有兩個對象o1和o2,並且符合o1.x == o2和o2.x == o1這兩個條件。若是o1和o2沒有其餘代碼引用,那麼它們就不該該繼續存在。但它們的引用計數都是1。
Python中使用了某些啓發式算法(heuristics)來加速垃圾回收。例如,越晚建立的對象更有可能被回收。對象被建立以後,垃圾回收器會分配它們所屬的代(generation)。每一個對象都會被分配一個代,而被分配更年輕代的對象是優先被處理的。
匿名函數:沒有名字函數就是匿名函數
格式:
lambda [變量名1],[變量名n...] : 表達式
print((lambda x: x ** 3)(2))
print((lambda x,y,z: x + y + z)(1, 2, 3))
print((lambda x,y=10: x * y)(5))
好處:
若是函數體涉及的業務邏輯並不複雜(代碼量不大),咱們書寫匿名函數代碼更加簡潔;
節省內存,提升運行效率
弊端:
雖然代碼簡潔了,可是對於整個功能的閱讀性相對變差
不能實現複雜功能的定義,在表達式這部分不能同時定義多個函數的調用執行
什麼時候去定義匿名函數使用:
若是某個功能不會被屢次執行,僅僅是執行不多的次數;
那麼將此功能定義稱爲匿名函數更加的節省內存資源,提升程序的運行效率
match()函數只檢測RE是否是在string的開始位置匹配, search()會掃描整個string查找匹配, 也就是說match()只有在0位置匹配成功的話纔有返回,若是不是開始位置匹配成功的話,match()就返回none
例如:print(re.match(’super’, ’superstition’).span())會返回(0, 5)
而print(re.match(’super’, ‘insuperable’))則返回None
search()會掃描整個字符串並返回第一個成功的匹配
例如:print(re.search(’super’, ’superstition’).span())返回(0, 5)
print(re.search(’super’, ‘insuperable’).span())返回(2, 7)
Python的except用來捕獲全部異常, 由於Python裏面的每次錯誤都會拋出 一個異常,因此每一個程序的錯誤都被看成一個運行時錯誤。
一下是使用except的一個例子:
try:foo = opne(」file」) #open被錯寫爲opneexcept:sys.exit(」could not open file!」)
由於這個錯誤是因爲open被拼寫成opne而形成的,而後被except捕獲,因此debug程序的時候很容易不知道出了什麼問題
下面這個例子更好點:
try:foo = opne(」file」) # 這時候except只捕獲IOErrorexcept IOError:sys.exit(」could not open file」)
構造函數的做用:
1).建立對象
2).在建立對象的同時爲屬性賦值
注意事項:
1).一個類中若是沒有顯示的定義構造函數,那麼編譯器會默認添加一個空參數的構造函數
2).若是一個類中已經顯示的定義了構造函數,那麼編譯器就不會在默認添加空參構造了
3).函數和函數之間若是名字相同,下面定義的會將上面定義的函數覆蓋掉,反應:python語言沒有函數重載這一說
__str__函數的使用:
因爲建立了對象而且爲對象屬性賦值,可是咱們直接打印對象名在控制檯看到的是對象的完整信息,不理想(不是咱們想要的)
而咱們想要看到的是對象中屬性的內容,因此咱們須要重寫object類中的__str__函數;
在打印對象的時候就會根據咱們本身對於__str__函數體的設計來進行屬性值的回饋
答案:是,從列表變爲生成器。
Python是一種解釋型語言。Python程序直接從源代碼運行,將程序員編寫的源代碼轉換成中間語言,再將中間語言翻譯成必須執行的機器語言。
要在Unix上建立Python腳本可執行文件須要作兩件事情:
Script文件的模式必須是可執行的
第一行必須以#(#!/ usr / local / bin / python)開頭
要在單個程序的模塊之間共享全局變量,請建立一個配置模塊。在應用程序的全部模塊中導入配置模塊,該模塊將做爲跨模塊的全局變量提供。
你能夠經過下面的方法訪問一個用C寫成的模塊,
Module = = PyImport_ImportModule(「<modulename>」);
Python GC主要使用引用計數(reference counting)來跟蹤和回收垃圾。在引用計數的基礎上,經過「標記-清除」(mark and sweep)解決容器對象可能產生的循環引用問題,經過「分代回收」(generation collection)
以空間換時間的方法提升垃圾回收效率(我以爲這句話寫的比較好)。