1.單引號,雙引號,三引號的區別
分別闡述3種引號用的場景和區別 1),單引號和雙引號主要用來表示字符串 比如: 單引號:'python' 雙引號:"python" 2).三引號 三單引號:'''python ''',也可以表示字符串一般用來輸入多行文本,或者用於大段的注釋 三雙引號:"""python""",一般用在類里面,用來注釋類,這樣省的寫文檔,直接用類的對象__doc__訪問獲得文檔 區別: 若你的字符串里面本身包含單引號,必須用雙引號 比如:"can't find the log\n"
2.Python的參數傳遞是值傳遞還是引用傳遞
舉例說明Python函數參數傳遞的幾種形式,並說明函數傳參是值傳遞還是引用傳遞 1).Python的參數傳遞有: 位置參數 默認參數, 可變參數, 關鍵字參數 2).函數的傳值到底是值傳遞還是引用傳遞,要分情況 a.不可變參數用值傳遞: 像整數和字符串這樣的不可變對象,是通過拷貝進行傳遞的,因為你無論如何都不可能在原處改變不可變對象 b.可變參數是用引用傳遞的 比如像列表,字典這樣的對象是通過引用傳遞,和C語言里面的用指針傳遞數組很相似,可變對象能在函數內部改變.
3.什么是lambda函數?它有什么好處?
舉例說明lambda的用法,並說明用lambda的優點 1).lambda的用法: lambda是匿名函數,用法如下:lambda arg1,arg2..argN:expression using args 2).優點 lambda能和def做同樣種類的工作,特別是對於那些邏輯簡單的函數,直接用lambda會更簡潔, 而且省去取函數名的麻煩(給函數取名是個技術活)
4.字符串格式化:%和.format的區別
字符串的format函數非常靈活,很強大,可以接受的參數不限個數,並且位置可以不按順序, 而且有較為強大的格式限定符(比如:填充,對齊,精度等)
5.Python是如何進行內存管理的
1).對象的引用計數機制 Python內部使用引用計數,來保持追蹤內存中的對象,所有對象都有引用計數。 引用計數增加的情況: 一個對象分配一個新名稱 將其放入一個容器中(如列表、元組或字典) 引用計數減少的情況: 使用del語句對對象別名顯示的銷毀 引用超出作用域或被重新賦值 2).垃圾回收 當一個對象的引用計數歸零時,它將被垃圾收集機制處理掉。 3).內存池機制 Python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統: Pymalloc機制:為了加速Python的執行效率,Python引入了一個內存池機制,用於管理對小塊內存的申請和釋放。 對於Python對象,如整數,浮點數和List,都有其獨立的私有內存池,對象間不共享他們的內存池。 也就是說如果你分配又釋放了大量的整數,用於緩存這些整數的內存就不能再分配給浮點數。
6.寫一個函數, 輸入一個字符串, 返回倒序排列的結果
輸入: string_reverse(‘abcdef’), 返回: ‘fedcba’,寫出你能想到的多種方法
1).利用字符串本身的翻轉
def string_reverse1(text='abcdef'): return text[::-1]
2).把字符串變成列表,用列表的reverse函數

3).新建一個列表,從后往前取

4).利用雙向列表deque中的extendleft函數

5).遞歸

7.按升序合並如下兩個list, 並去除重復的元素
list1 = [2, 3, 8, 4, 9, 5, 6] list2 = [5, 6, 10, 17, 11, 2]
1).最簡單的方法用set
list3=list1+list2 print sorted(list(set(list3)))
2).遞歸
先選一個中間數,然后一邊是小的數字,一邊是大的數字,然后再循環遞歸,排完序(是不是想起了c里面的冒泡)

8.以下的代碼的輸出將是什么? 說出你的答案並解釋
class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x = 2 print Parent.x, Child1.x, Child2.x Parent.x = 3 print Parent.x, Child1.x, Child2.x >> 1 1 1 1 2 1 3 2 3
解答:
使你困惑或是驚奇的是關於最后一行的輸出是 3 2 3 而不是 3 2 1。 為什么改變了 Parent.x 的值還會改變 Child2.x 的值,但是同時 Child1.x 值卻沒有改變? 這個答案的關鍵是,在 Python中,類變量在內部是作為字典處理的。 如果一個變量的名字沒有在當前類的字典中發現,將搜索祖先類(比如父類)直到被引用的變量名被找到. 首先,在父類中設置 x = 1 會使得類變量 x 在引用該類和其任何子類中的值為 1。 這就是因為第一個 print 語句的輸出是 1 1 1 然后,如果任何它的子類重寫了該值(例如,我們執行語句 Child1.x = 2)該值僅僅在子類中被改變 。這就是為什么第二個 print 語句的輸出是 1 2 1 最后,如果該值在父類中被改變(例如,我們執行語句 Parent.x = 3),這個改變會影響 到任何未重寫該值的子類當中的值(在這個示例中被影響的子類是 Child2)。 這就是為什么第三個 print 輸出是 3 2 3
9.下面的代碼會不會報錯
list = ['a', 'b', 'c', 'd', 'e'] print list[10:]
不會報錯,而且會輸出一個 [],並且不會導致一個 IndexError
解答:
當試圖訪問一個超過列表索引值的成員將導致 IndexError(比如訪問以上列表的 list[10])。 盡管如此,試圖訪問一個列表的以超出列表長度數作為開始索引的切片將不會導致 IndexError, 並且將僅僅返回一個空列表 一個討厭的小問題是它會導致出現 bug ,並且這個問題是難以追蹤的, 因為它在運行時不會引發錯誤,吐血啊~~
10.說出下面list1,list2,list3的輸出值
def extendList(val, list=[]): list.append(val) return list list1 = extendList(10) list2 = extendList(123,[]) list3 = extendList('a') print "list1 = %s" % list1 print "list2 = %s" % list2 print "list3 = %s" % list3 >> list1 = [10, 'a'] list2 = [123] list3 = [10, 'a']
許多人會錯誤的認為 list1 應該等於 [10] 以及 list3 應該等於 ['a']。認為 list 的參數會在 extendList 每次被調用的時候會被設置成它的默認值 []。
盡管如此,實際發生的事情是,新的默認列表僅僅只在函數被定義時創建一次。隨后當 extendList 沒有被指定的列表參數調用的時候,其使用的是同一個列表。這就是為什么當函數被定義的時候,表達式是用默認參數被計算,而不是它被調用的時候。
因此,list1 和 list3 是操作的相同的列表。而list2是操作的它創建的獨立的列表(通過傳遞它自己的空列表作為list參數的值)
所以這一點一定要切記切記.下面我們把list置為None就可以避免一些麻煩了

11.寫出你認為最Pythonic的代碼
Pythonic編程風格是Python的一種追求的風格,精髓就是追求直觀,簡潔而容易讀.
下面是一些比較好的例子
1).交互變量
非Pythonic
temp = a a = b b = temp
pythonic:
a,b=b,a
2).判斷其值真假
name = 'Tim' langs = ['AS3', 'Lua', 'C'] info = {'name': 'Tim', 'sex': 'Male', 'age':23 }
非Pythonic
if name != '' and len(langs) > 0 and info != {}: print('All True!')
pythonic:
if name and langs and info: print('All True!')
3).列表推導式
[x for x in range(1,100) if x%2==0]
4).zip創建鍵值對
keys = ['Name', 'Sex', 'Age'] values = ['Jack', 'Male', 23] dict(zip(keys,values))
12.寫出一段python 代碼實現一個刪除一個list 里面重復元素。
答案:
list_element = ['a','c,','z','x','a'] #此列表元素有重復 delete_element = list( set(list_element)) #利用集合的唯一性刪除重復元素 print("原始列表為:",list_element) print("修改后的列表為:",delete_element)
結果:
原始列表為: ['a', 'c,', 'z', 'x', 'a'] 修改后的列表為: ['c,', 'x', 'z', 'a'] Process finished with exit code 0
但是這樣做有缺點,就是去重后,元素的排序改變了,想保持原來的排序,我們需要用下面的方法:
list_element = ['a','c,','z','x','a'] #此列表元素有重復 delete_element = list( set(list_element)) #利用集合的唯一性刪除重復元素 delete_element.sort(key = list_element.index) #對修改后的列表進行排序 print("原始列表為:",list_element) print("修改后的列表為:",delete_element)
結果:
原始列表為: ['a', 'c,', 'z', 'x', 'a'] 修改后的列表為: ['a', 'c,', 'z', 'x'] Process finished with exit code 0
13.什么是切片?
答案: 切片的第一個索引為起始點,第二個索引則是比我們需要的最后一個元素的索引值大1的數字。 嚴格的講,list[i,j] 就是原始列表從索引i(包含)處開始,一直到索引 j 處(不包含)結束的一個切片。 注釋:Python使用這種約定的原因是為了與列表索引的合法規則保持一致(從0開始,最高比例列表長度小1的數字)
14:模塊是什么?
模塊(module)是 Python 中非常重要的東西,你可以把它理解為 Python 的擴展工具。 換言之,Python 默認情況下提供了一些可用的東西,但是這些默認情況下提供的還遠遠不 能滿足編程實踐的需要,於是就有人專門制作了另外一些工具。這些工具被稱之為“模塊” 任何一個 Pythoner 都可以編寫模塊,並且把這些模塊放到網上供他人來使用。 當安裝好 Python 之后,就有一些模塊默認安裝了,這個稱之為“標准庫”,“標准庫”中 的模塊不需要安裝,就可以直接使用。 如果沒有納入標准庫的模塊,需要安裝之后才能使用。模塊的安裝方法,我特別推薦使用 pip 來安裝。
15:dir()是什么指令?
dir(module)是一個非常有用的指令,可以通過它查看任何模塊中所包含的工具。
16:如何把一個文件內的字符串形式通過json轉化為相應的字典格式?
常見錯誤:
#account_file是文件的絕對路徑 with open(account_file, "r", encoding="utf-8") as f: #打開文件 file_data = json.load(account_file) print(file_data) 這樣竟然出錯了!! 錯誤信息:AttributeError: 'str' object has no attribute 'read'
改正后為:
#改正: if os.path.isfile(account_file): #如果用戶文件存在(即用戶存在) with open(account_file, "r", encoding="utf-8") as f: #打開文件 file_data = json.load(f) print(file_data)
17:反斜杠的困擾
與大多數編程語言相同,正則表達式里面使用“ \ ”作為轉義字符,這就可能造成反斜杠困擾 ,假如你需要匹配文本中的字符'' \ '' 那么使用編程語言表示的正則表達式里面將需要4個反斜 杠"\\\\",前兩個和后兩個分別用於在編程語言里轉義成反斜杠,轉換成兩個反斜杠后再在正則表 達式里面轉義成一個反斜杠,python里的原生字符串很好的解決了這個問題,這個例子中的正則 表達式可以使用 r"\\ 表示。同樣,匹配一個數字的"\\d"可以寫成r"\d.有了原生字符串,你再 也不用擔心是不是漏寫了反斜杠,寫出來的表達式也更直觀。
僅僅需要知道及格匹配模式
re.I(re.IGNORECASE): 忽略大小寫(括號內是完整寫法,下同) M(MULTILINE): 多行模式,改變'^'和'$'的行為(參見上圖) S(DOTALL): 點任意匹配模式,改變'.'的行為
18:python中 if __name__ == '__main__': 的作用是什么呢
這段代碼的功能理解如下:
一個python的文件有兩種使用方法:
作用一:直接作為腳本執行 作用二:import 到其他的python腳本中被調用執行
簡而言之:__name__就是當前模塊名,當模塊被直接運行時候模塊名稱為__main__。當模塊被直接運行的時候,代碼被運行,當模塊被導入的時候,代碼不被運行。
詳細解釋:
模塊是對象,並且所有的模塊都有一個內置屬性__name__。一個模塊的__name__的值取決於我們如何應用模塊,如果import 一個模塊,那么模塊__name__的值通常是模塊文件名,不帶路徑或者文件擴展名,但是我們也可以像一個標准的程序直接運行模塊,在這種情況下,__name__的值將是一個特別缺省"__main__"
首先,可以讓大家看一下在cmd中運行.py文件則__name__的值為“__main__”
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> __name__ '__main__'
而在import 一個.py文件后,__name__的值就不是'__main__'了;
從而用if __name__ == '__main__'來判斷是否是在直接運行該.py文件
運行原理
每個python模塊(python文件)都包含內置的變量__name__,當運行模塊被執行的時候,__name__等於文件名(包含了后綴.py)。如果import到其他模塊中,則__name__等於模塊名稱(不包含后綴.py)。而“__main__”等於當前執行文件的名稱(包含了后綴.py)。所以當模塊被直接執行時,__name__ == '__main__'結果為真;而當模塊被import到其他模塊中時,__name__ == '__main__'結果為假,就是不調用對應的方法。
19:深淺copy
具體內容見博客:http://www.cnblogs.com/wj-1314/p/7436299.html
20:遞歸函數(假設面試官讓你把number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]中的正數的平均值求出來,你怎么算)
首先循環列表中的值,累計次數,並對大於0的數進行累加,最后求取平均值。
這就是命令式編程——你要做什么事情,你得把達到目的的步驟詳細的描述出來,然后交給機器去運行。
這也正是命令式編程的理論模型——圖靈機的特點。一條寫滿數據的紙帶,一條根據紙帶內容運動的機器,機器每動一步都需要紙帶上寫着如何達到。
#計算數組中正整數的平均值 number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8] count = 0 sum = 0 for i in range(len(number)): if number[i]>0: count += 1 sum += number[i] print sum,count if count>0: average = sum/count print average #========輸出=========== 30 6 5
還有一種方法:
number =[2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8] positive = filter(lambda x: x>0, number) average = reduce(lambda x,y: x+y, positive)/len(positive) print average #========輸出=========== 5
這段代碼最終達到的目的同樣是求取正數平均值,但是它得到結果的方式和 之前有着本質的差別:通過描述一個列表->正數平均值 的映射,而不是描述“從列表得到正數平均值應該怎樣做”來達到目的。