Python面試題

https://www.imooc.com/article/36931css

 

 

 

1.python字符串格式化中,%s和.format的主要區別是什麼

python用一個tuple將多個值傳遞給模板,每一個值對應一個格式符
print(「 my name is %s ,im %d year old」%("gaoxu",19))
自從python2.6開始,新增了一種格式化字符串的函數str.format(),經過{}和.來代替傳統的%
主要的區別是:不須要指定的字符串仍是數字類型html

print('ma name is {} ,age is {} year old'.format("小明",17))print('my name is {1},age is {0}'.format(15,'小明')) #:位置攢參的方式li=['hollo',18]print('may name is {0},my year old is {1}'.format(*li))# 按照關鍵字傳參hash={'name':'hoho','age':18}print ('my name is {name},age is {age}'.format(**hash))

2.現有兩個元組,(('a'),('b')),(('c'),('d'))請用匿名函數把他變成[{'a':'c'},{'b':'d'}]

t1=(('a'),('b'))
t2=(('c'),('d'))
res=lambda t1,t2:[{i:j}for i,j in zip(t1,t2)]
print(res(t1,t2))

3.如何給列表去重並保持原來的順序不變

l=[11,2,3,4,7,6,4,3,54,3,]
now_l=[]for i in l:if i not in now_l:
now_l.append(i)print(now_l)
也能夠用set直接去重和排序print(set(l)

4.解釋什麼是匿名函數,它有什麼好處

匿名函數與函數有共同的做用域,可是匿名函數意味着引用計數爲0除非讓他有名字
好處:一次性使用,隨時隨地的定義更容易閱讀,作了什麼更是一目瞭然python

爲何匿名函數沒有語句?

是被用於在代碼被執行的時候構建新的函數對象而且返回mysql

5.python如何書寫可變參數和關鍵字參數

在python中定義函數,可也用必選函數,默認參數,可變參數,和關鍵字參數,這四種參數均可以一塊使用,或者只用其中的一些可是請注意的是參數定義的順序必須是必選參數,默認參數,可變參數,關鍵字參數nginx

6.python模塊中match和search的區別

re.match()老是匹配的是字符串的開頭,並返回匹配的math對象,若是去匹配字符串非開頭的部分就會返回none
re.search()函數對整個字符串進行搜索,並返回第一個匹配字符串的match對象程序員

7. 1 and 2和1 or2輸出結果是什麼

python中的and是從左往右計算的,若全部的值都是真的,則返回最後一個,若存在假的,返第一個假的,1 or 2由於是1是非零,因此返回的值是1web

8.,示例說明args和**kwargs

*args(表示的就是將實參中按照位置傳參,多餘的都是給args,切都是以元組的方式實現)
**kwargs:(表示的是按照關鍵字傳參,保存的是字典的形式ajax

9.寫出打印結果

print((i%2 for i in range(10)))   #:<generator object <genexpr> at 0X000001c577DDE258>print([i%2 for i in range(10)])    [0,,1,0,1,0,1,0,1]

總結:
1,把列表解析【】換成()獲得生成器表達式
2,列表解析和生成器表達式都是一種便利的編程方式,只不過生成器表達式更節省內存
3,pyrhon不但使用迭代器協議,讓for循環變得更加通用,大部份內置函數,也是使用迭代器協議
訪問對象的,列如:sun是python的內置函數,該函數使用迭代器協議訪問對象,而生成器實現了迭代器協議算法

10.python2和python3的區別

python3的字節是python2的字符串
python3的字符竄是python2的unciode
在python3中print要加括號
在python3中數字除法有小數點sql

11.請描述unIcode,utf-8,gbk之間的關係

Unicode--->encode----->utf-8utf-------->decode------>unicode

12.迭代器,生成器,裝飾器

迭代器即迭代工具,那麼什麼是迭代那
迭代重複上一個重複的過程,每一次重複即一次迭代,而且每一次迭代的結果都是下一次迭代的開始
爲什麼要用迭代器
對於序列類型:字符串,列表,元組,咱們可使用索引的方式迭代取出包含的元素
對於字典,集合,文件等類型沒有索引,若還行取出內部包的元素,則須要找出不依賴索引的方式,那這就是迭代器
什麼是可迭代的對象,具備init方法返回就是迭代器,具備next方法
特色優勢:提供了一種不依賴索引的取值的方式
缺點: 只能往前循環,不能日後找沒法獲取長度,
注意的是:迭代器對象必定是可迭代對象,但可迭代對象不必定是迭代器的對象
生成器迭代器的一種關鍵字yield+關鍵字,next方法,yield語句一次返回一個結果,在每一個
結果中間掛起鉤子函數,以便下次重它離開的地方繼續
生成器表達式相似於列表推導式,可是生成器返回按需求產生結果的一個對象,而不是一次構建
一個結果的列表
特色:惰性運算,節省空間
裝飾器:在不改變原來函數和函數的調用方式進行擴展,就是對外開放,對內封閉的原則
目標:爲被裝飾的對象添加新的功能

13.def func(a,b=[])這樣寫有什麼陷阱?

Python函數在定義的時候。默認b的值就被計算出來了,即[],由於默認參數b也是一個變量,它指向
對象即[],每次調用這個函數,若是改變b的內容每次調用時候默認參數也就改變了,不在是定義時候的[]了

 

image.png

 

因此默認參數要牢記一點:默認參數必須指向不變對象

14.python實現9乘9乘法兩種方法?

for i in range(1,10):        for j in range(1,i+1):             print('%s * %s= %s'%(i,j,i*j),end="")        print('')
     print( '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)])for x in range(1,10)]))

15.如何在python中拷貝一個對象,並說出他們的區別

拷貝有兩種方式:淺拷貝和深拷貝copy.copy()and copy.deepcopy()
咱們尋常意義上的複製就是深複製,即將被複制的對象徹底再複製一遍做爲獨立的新個體單獨存在,因此
改變原有被複制的到對象不會對已經複製的新對象產生影響。
而淺複製並不會產生一個獨立的對象存在,他只是將原有的數據打上一塊新標籤,因此當其中一塊標籤被
改變時候,數據就會變化,另外一個標籤也會隨之改變,數據塊就發生變化,另外一個標籤也會隨着改變,

 

image.png

16.談談你對python裝飾器的理解

裝飾器本質上就是一個python函數,它可讓其餘函數在不須要任何代碼變更的前提下增長額外的功能
,裝飾器的返回值也是一個函數對象,她有不少的應用場景,好比:插入日誌,事物處理,緩存,權限裝飾器就是爲已經存在的對象
添加額外功能

def outher(func):
       def good(*args,**kwargs):
               ret=func(*args,**kwargs)                return ret       return good@outherdef bar():
      print('狗241131313')
bar()

17.python基礎:

計算列表中的元素的個數和向末尾追加元素所用到的方法?len(),append()
判斷字典中有沒有某個key的方法?用到get('key')方法,若沒有,將返回值none
現有my_list=range(100)

18.簡述python中垃圾回收機制

主要是以對象引用計數爲主標記清除和分帶技術爲輔的那麼一種方式
Python在內存中存儲了每一個對象的引用計數(reference count)。若是計數值變爲0,那麼相應的對象就會消失。分配給該對象的內存就會釋放出來用做他用。
偶爾也會出現引用循環。垃圾回收器會定時尋找這個循環,並將其回收。
Python中還使用了某些啓示算法來加速回收。

19.如何判斷一個變量是不是字符串

a='sadsadada'print(isinstasnce(a,str))

20.Differences between list and tuple in python link:

http://www.hacksparrow.com/python-difference-between-list-and-tuple.html

21.range和xrange的區別

首先xrange在python3中已經不適用了
range:
函數說明:range([start,]stop[,step]),根據start與stop指定的範圍以及step設定的步長
生成一個列表
xrange與range相似,只是返回的是一個「xrange object"對象,而非數組list
要生成很大的數字序列的時候,用xrange會比range性能優不少
區別:range會生成一個list對象,而xrange會返回一個生成器對象

22.'1','2','3'如何變成['1','2','3']?

x='1','2','3'li=[]for i in x:
     li .append(i)print(li)'1','2','3' 如何變成[1,2,3]
x='1','2','3'li=[]for i in x:
     li .append(int(i))print(li)

23.一行實現[1,4,9,16,25,36,49,81,100]

target=list(map(lambda x:  x*x,[1,2,3,4,5,6,7,8,9,10]

24.print(map(str,[1,2,3,4])))輸出的是什麼

map obj

25.請解釋Python中的statimethod(靜態方法)和classmethod(類方法),

並補全下面的代碼

 

image.png

26.如何用python刪除一個文件?

import os
os.remove(r'D:\ggg\fileobj)
os.remove(‘路徑’)

27.面向對象

](https://upload-images.jianshu.io/upload_images/8562039-d872b16188d4ba64.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

28.python如何生成隨機數

import random
print(random.randint(1,10))

29.如何在function裏面設置一個全局變量

image.png

30.請用python寫一個獲取用戶輸入數字,並根據數字大小輸出不一樣腳本信息

image.png

31.請解釋生成器和函數的不一樣,並實現簡單的生成器與函數

# def beautiful(c):# for i in range(c):# yield i**2# for item in beautiful(5):# print(item)#函數# def gensquares(N):# res=[0]# for i in range(N):# res.append(i*i)# return res# for item in gensquares(5):# print(item)

總結:
1語法上和函數相似:生成器函數和常規函數幾乎如出一轍的,他們都是使用def語句進行
定義,區別在於,生成器使用yield語句返回一個值,而常規函數使用return語句返回一個值
2.自動實現迭代器的協議:對於生成器,python自動實現迭代器協議,因此咱們能夠調用它的next
方法,而且在沒有值返回的時候,生成器自動生成Stopltwration異常
3.狀態掛起,生成器使用yield語句返回一個值.yield語句掛起該生成器函數的狀態,保留足夠的信息,方便以後離開的
地方繼續執行

38.輸入一個字符串,打印結果爲倒敘

a=input('please enter a string')print(a[::-1])

32.請寫出本身的計算方法,按照升序合併以下列表

list1=[2,3,4,9,6]
list2=[5,6,10,17,11,2]
list1.extend(list2)print(sorted(list(set(list))))####33.到底什麼是python?你能夠在回答中進行技術對比(也鼓勵這樣作)。python是一門解釋性語言,這裏說與c語言和c的衍生語言不一樣,python代碼不須要編譯,其餘解釋語言還包括Ruby和pyp
python是動態語言,在聲明變量的時候,不須要聲明變量的類型
python很是適合面向對象編程,由於它支持經過組合和繼承的方式定義類
python代碼編寫快,可是運行速度比編譯語言一般要慢,好在python容許加入基於c語言編寫擴展,所以咱們能優化代碼,消除瓶頸,這點一般是能夠實現的numpy就是一個很好的例子
python用途很普遍----網絡應用,自動化,科學建模,大數據應用,等等一般被稱爲膠水語言

34.http狀態碼的不一樣,列出你所知道的http狀態碼,而後講出他們都是什麼意思

狀態代碼有三位數字組成,第一個數字定義響應的類別,共分5種類型
1xx:提示信息--表示請求接受,繼續處理
2xx:成功表示請求成功接收,理解,接受
3xx:重定向要完成請求必須更進一步操做
4xx:客戶端錯誤,請求有語法錯誤或請求沒法實現
5xx:服務器端錯誤--服務器沒有實現合法請求
常見狀態碼:

200 OK//客戶端請求成功 400 Bad Request//客戶端請求有語法錯誤,不能被服務器所理解401 Unauthorized//請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用 403 Forbidden//服務器收到請求,可是拒絕提供服務 404 Not Found//請求資源不存在,eg:輸入了錯誤的URL 500 Internal Server Error//服務器發生不可預期的錯誤 503 Server Unavailable//服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

34.lambda表達式和列表推導式

l2=[lambda:i for i in range(10)]
l1=[i for i in range(10)]
print(l1[0])
print(l2[0])
print(l2[0]())

35.eval和exce的區別

eval有返回值
exec沒有返回值

print(eval('2+3'))print(exec('2+1'))exec("print('1+1')")
eval還能夠將字符串轉化成對象
class obj(object):
    passa = eval('obj()')
print(a,type(a))  #<__main__.obj object at 0x000001F1F6897550> <class '__main__.obj'>

36.cookie和session的區別

session在服務器,cooking在客戶端(瀏覽器)
session默認存在服務器上的文件裏面(也能夠是內存,數據庫)
session的運行依賴session_id,而session_id是存在cookie中,也就是說,若果瀏覽器禁用lcookie,同時session也會失效(可是能夠經過其餘方式實現,好比在url中傳入session_id)
session能夠放在文件,數據庫,內存中均可以的
用戶驗證一般會用session
維持一個會話核心就是客戶端的惟一標識,即session_id

37.http是有狀態協議仍是無狀態協議?如何從兩次請求判斷是不是同一用戶?

無狀態協議,判斷session_id是否相同。

38.有一組數組[3,4,1,2,5,6,6,5,4,3,3]請寫一個函數,找出該數組中

沒有重複的數的總和

def MyPlus(l):
       new_l = []      for i in l:          if i not in new_l:
              new_l.append(i) 
return sum(new_l)
 print(MyPlus(l = [2,3,4,4,5,5,6,7,8]))

39.Python一行print出1-100的偶數列表:

print(i for i in range(1,100)if  i%2 ==0])

40.1,2,3,4,5能組成多少個互不相同且無重複的元素?

nums = [] for i in range(1,6): for j in range(1,6): for k in range(1,6): if i != j and j != k and i !=k: new_num = i*100 + k*10 + j if new_num not in nums: nums.append(new_num) print(nums)

41.請寫出五中不一樣的http的請求方法:

get,post,put,delete,head,connect

42.描述多進程開發中的join與daemon的區別

守護進程(daemon)
主進程建立守護進程
其一:守護進程會在主進程代碼執行結束後就終止
其二:守護進程內沒法開啓子進程,不然拋出異常:AssertionError: daemonic processes are not allowed to have children
注意:進程之間是相互獨立的,主進程的代碼運行結束,守護進程隨即終止
p.join([timeout]): 主進程等待相應的子進程p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)。須要強調的是p.join()只能join住start開始的進程,而不能join住run開啓的進程

43.簡述GRL對python的影響

因爲GIL的影響,python沒法利用多核優點
CIL本質就是一把互斥鎖,既然是互斥鎖,全部互斥鎖都同樣將併發運行轉化爲串行,此時來控制同一時間內只能被一個任務修改,進而保證數據的安全.能夠確定的是:保護不一樣數據的安全,須要加不一樣的鎖。
如今計算機基本都是多核,python對於計算密集型任務開多線程的效率並不能帶來多大的技術提高,甚至不如串行(沒有大量的切換),可是對於io密集型任務效率仍是有顯著的提高的
所以,對於io密集型任務,python多線程更加的適合。

44.執行python腳本的兩種方式

./run.py.shell直接調用python腳本
python run.py 調用python 解釋器來調用python腳本

45.TCP協議和UDP協議的區別是什麼?

一、TCP協議是有鏈接的,有鏈接的意思是開始傳輸實際數據以前TCP的客戶端和服務器端必須經過三次握手創建鏈接,會話結束後也要結束鏈接。而UDP是無鏈接的
二、TCP協議保證數據發送,按序送達,提供超時重傳保證數據可靠性,可是UDP不保證按序到達,甚至不能保證到達,仍是努力交付,即使是按序發送的序列,也不保證按序送到。
三、TCP協議所需資源多,TCP首部需20個字節(不算可選項),UDP首部字段只需8個字節。
四、TCP有流量控制和擁塞控制,UDP沒有。網絡擁堵不會影響發送端的發送速率。
五、TCP面向的字節流的服務,UDP面向的是報文的服務。

三次握手創建鏈接時,發送方再次發送確認的必要性?
主 要是爲了防止已失效的鏈接請求報文段忽然又傳到了B,於是產生錯誤。假定出現一種異常狀況,即A發出的第一個鏈接請求報文段並無丟失,而是在某些網絡結 點長時間滯留了,一直延遲到鏈接釋放之後的某個時間纔到達B,原本這是一個早已失效的報文段。但B收到此失效的鏈接請求報文段後,就誤認爲是A又發出一次 新的鏈接請求,因而就向A發出確認報文段,贊成創建鏈接。假定不採用三次握手,那麼只要B發出確認,新的鏈接就創建了,這樣一直等待A發來數據,B的許多 資源就這樣白白浪費了。

四次揮手釋放鏈接時,等待2MSL的意義?
第 一,爲了保證A發送的最有一個ACK報文段可以到達B。這個ACK報文段有可能丟失,於是使處在LAST-ACK狀態的B收不到對已發送的FIN和ACK 報文段的確認。B會超時重傳這個FIN和ACK報文段,而A就能在2MSL時間內收到這個重傳的ACK+FIN報文段。接着A重傳一次確認。
第二,就是防止上面提到的已失效的鏈接請求報文段出如今本鏈接中,A在發送完最有一個ACK報文段後,再通過2MSL,就可使本鏈接持續的時間內所產生的全部報文段都從網絡中消失。

46.一句話總結tcp和udp的區別

tcp是面向鏈接的,可靠的字節流服務,udp是面向無鏈接的,不可靠而數據服務

47.python有以下一個字典

python有以下的字典,
dic_tmp={'carry':17,'bob':21,'matty':23,'jack':33,'tom':17,'alex':23}

print(sorted(dic_tmp.items(),key=lambda dic_tmp:dic_tmp[0]))

48.簡述inndb和myisam的特色:

innodb是mysql最經常使用的一種存儲引擎,Facebook,google等公司的成功已證實了innodb存儲引擎具備高可用性,高性能以及高擴展性,支持事物,其特色是行鎖設計,支持外鍵,並支持相似oracle的非鎖定讀,對於表中數據的存儲,inndb存儲引擎採用了彙集的方式,每張表都是按主鍵的順序進行存儲的,若是沒有顯示地在表定義時候指定主鍵,innodb,存儲引擎會爲每一行生成六個字節的ROWId,並以此爲主鍵。
myisam不支持事物,表鎖設計,支持全文索引,主要面向一些olap數據庫應用,此外myisam存儲引擎的另外一個不同凡響的地方是,它的緩衝池只緩存索引文件,而不緩存數據文件,這與大多數數據庫不同

49.利用python上下文管理器,實現一個寫入文件的功能(寫入內容爲'hello world')

class Open(object):
    def __init__(self,name,mode):        self.name=name        self.mode=mode    def __enter__(self):        self.opened=open(self.name,self.mode)        return self.opened    def __exit__(self,exc_type,exc_val,exc_tb):        self.opened.close()
with open('mytext.txt','w') as write:
    write.write('hello   qaweqwe world')

50.Django的請求生命週期

1,當用戶在瀏覽器中輸入url時瀏覽器會生成請求頭和請求體發送給服務端請求頭和請求體中會包含瀏覽器的動做(action)這個動做一般爲get或者post提如今url之中
2.url通過Django中的wsgi再通過django的中間件,最後url到路由的映射表一條一條進行匹配一旦其中的某一條匹配成功就執行視圖函數,後面的路由就不在繼續匹配了
3視圖函數根據客戶端的請求查詢相應的數據,返回給Django,而後Django把客戶端想要的數據做爲一個字符串返回給客戶端
4客戶端瀏覽器接受到返回的數據,通過渲染後顯示給用戶

51.django rest framework規範

1url後儘可能用名詞,由於rest frame是面向資源的編程,所以url命名時能體現出資源
2method的不一樣,實現增刪改查的操做
3版本號,由於有版本的更替,爲了體現出版本的過分,所以在發請求的時候,要體現出版本號
4返回值,與以往只返回json不一樣,rest api規範要加上狀態碼。
5域名,因爲先後端分離,所以要處理跨域問題,解決方法:jsonp,cors
6過濾,經過url傳參的形式傳遞搜索條件(列如:指定返回的記錄數量,指定分頁等)

52.jsonp和cors

jsonp的本質就是利用script的src屬性繞過同源策略
cors
整個cors通訊過程,都是瀏覽器自動完成,不須要用戶參與,對於開發者來講cors通訊和同源的ajax沒有什麼區別,挨代碼徹底同樣,瀏覽器一旦發現ajax請求跨源,就會自動添加一些附加頭的信息,有時還會多出一次附加的請求,但用戶不會有感受.

53.現有字典dic = {'a':1,'b':2,'c':23,'d':11,'e':4,'f':21},請按照字段中的value進行排序

print(sorted(dic.items(),key=lambda dic:dic[1]))

54.mysql 搜索引擎和局域網權限,mysql中的鎖

innodb存儲引擎(最經常使用的引擎,支持事物,特色是行鎖,特色是行鎖設計,支持外鍵)
myisam存儲引擎(不支持事物,表鎖的設計,支持全文索引)
nod存儲引擎
memory存儲引擎

55.二叉樹的遍歷

class BiTreeNode(object):
    def __init__(self,data):
        self.data = data
        self.lchild = None
        self.rchild = Nonea = BiTreeNode('A')
b= BiTreeNode('B')
c = BiTreeNode('C')
d = BiTreeNode('D')
e = BiTreeNode('E')
f = BiTreeNode('F')
g = BiTreeNode('G')

e.lchild = a
e.rchild = g
a.rchild = c
c.lchild = b
c.rchild = d
g.rchild = f

root = e# 前序遍歷  (先找作子樹,後找右子樹)def pre_order(root):
    if root:
        print(root.data,end='')  # EACBDGF
        pre_order(root.lchild)
        pre_order(root.rchild)
pre_order(root)

print('')# 中序遍歷def in_order(root):
    if root:
        in_order(root.lchild)
        print(root.data,end='')   # ABCDEGF
        in_order(root.rchild)
in_order(root)  # ABCDEGFprint('')# 後序遍歷def post_order(root):
    if root:
        post_order(root.lchild)
        post_order(root.rchild)
        print(root.data,end='')
post_order(root)  #BDCAFGE

56.實現頁面刷新的方法:

1輪訓
2長輪訓
3websocket

輪訓:客戶端定向向服務器發送ajax請求,服務器接到請求後立刻返回響應信息並關閉鏈接.

優勢:後端程序編寫比較容易
缺點:請求中有大半是無用浪費帶寬和服務器資源.
實例:適用小型應用

長輪訓:客戶端向服務器發送ajax請求,服務器鏈接到hold住鏈接,直到有新消息才返回響應信息並關閉鏈接,客戶端處理完響應後再向服務端發送新的請求.

優勢:在無消息的狀況下不會頻繁的請求
缺點:服務器hold鏈接會消耗資源。
實例:webqq,hi網頁版,facebook im。

57.字典推導式

d = {key: value for (key, value) in iterable}

58.python中單下劃線和雙下劃線

>>> class MyClass():...     def __init__(self):
...             self.__superprivate = "Hello"...             self._semiprivate = ", world!"...>>> mc = MyClass()>>> print mc.__superprivate
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>AttributeError: myClass instance has no attribute '__superprivate'>>> print mc._semiprivate
, world!>>> print mc.__dict__{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}

foo:一種約定,Python內部的名字,用來區別其餘用戶自定義的命名,以防衝突,就是例如init(),del(),call()這些特殊方法
_foo:一種約定,用來指定變量私有.程序員用來指定私有變量的一種方式.不能用from module import * 導入,其餘方面和公有同樣訪問;
__foo:這個有真正的意義:解析器用classname__foo來代替這個名字,以區別和其餘類相同的命名,它沒法直接像公有成員同樣隨便訪問,經過對象名.類名__xxx這樣的方式能夠訪問.
詳情見:http://www.zhihu.com/question/19754941

59.python重載

函數重載主要是爲了解決兩個問題。
1.可變參數類型。
2.可變參數個數。
另外,一個基本的設計原則是,僅僅當兩個函數除了參數類型和參數個數不一樣之外,其功能是徹底相同的,此時才使用函數重載,若是兩個函數的功能其實不一樣,那麼不該當使用重載,而應當使用一個名字不一樣的函數。
好吧,那麼對於狀況 1 ,函數功能相同,可是參數類型不一樣,python 如何處理?答案是根本不須要處理,由於 python 能夠接受任何類型的參數,若是函數的功能相同,那麼不一樣的參數類型在 python 中極可能是相同的代碼,沒有必要作成兩個不一樣函數。
那麼對於狀況 2 ,函數功能相同,但參數個數不一樣,python 如何處理?你們知道,答案就是缺省參數。對那些缺乏的參數設定爲缺省參數便可解決問題。由於你假設函數功能相同,那麼那些缺乏的參數終歸是須要用的。
好了,鑑於狀況 1 跟 狀況 2 都有了解決方案,python 天然就不須要函數重載了。
引自知乎:http://www.zhihu.com/question/20053359

60.虛擬內存技術

虛擬存儲器是指具備請求和調入功能,能從邏輯上對內存容量加以擴充的一種存儲系統

61.分頁和分段

分頁: 用戶程序的地址空間被劃分紅若干固定大小的區域,稱爲「頁」,相應地,內存空間分紅若干個物理塊,頁和塊的大小相等。可將用戶程序的任一頁放在內存的任一塊中,實現了離散分配。
分段: 將用戶程序地址空間分紅若干個大小不等的段,每段能夠定義一組相對完整的邏輯信息。存儲分配時,以段爲單位,段與段在內存中能夠不相鄰接,也實現了離散分配。

分頁與分段的主要區別

1.頁是信息的物理單位,分頁是爲了實現非連續分配,以便解決內存碎片問題,或者說分頁是因爲系統管理的須要.段是信息的邏輯單位,它含有一組意義相對完整的信息,分段的目的是爲了更好地實現共享,知足用戶的須要.
2.頁的大小固定,由系統肯定,將邏輯地址劃分爲頁號和頁內地址是由機器硬件實現的.而段的長度卻不固定,決定於用戶所編寫的程序,一般由編譯程序在對源程序進行編譯時根據信息的性質來劃分.
3.分頁的做業地址空間是一維的.分段的地址空間是二維的.

62.去除列表中重複的元素

用集合

list(set(l))

用字典

l1 = ['b','c','d','b','c','a','a']
l2 = {}.fromkeys(l1).keys()print l2

用字典並保持順序

l1 = ['b','c','d','b','c','a','a']
l2 = list(set(l1))
l2.sort(key=l1.index)print l2

列表推導式

l1 = ['b','c','d','b','c','a','a']
l2 = []
[l2.append(i) for i in l1 if not i in l2]

sorted排序而且用列表推導式

l = ['b','c','d','b','c','a','a'] [single.append(i) for i in sorted(l) if i not in single] print single

63.鏈表對調換

1->2->3->4轉換成2->1->4->3.

class ListNode:
    def __init__(self, x):        self.val = x        self.next = Noneclass Solution:
    # @param a ListNode
    # @return a ListNode
    def swapPairs(self, head):        if head != None and head.next != None:
            next = head.next
            head.next = self.swapPairs(next.next)            next.next = head            return next
        return head

65.建立字典方法

1直接建立

dict = {'name':'earth', 'port':'80'}

2工廠方法

items=[('name','earth'),('port','80')]
dict2=dict(items)
dict1=dict((['name','earth'],['port','80']))

3frokeys()方法

dict1={}.fromkeys(('x','y'),-1)
dict={'x':-1,'y':-1}
dict2={}.fromkeys(('x','y'))
dict2={'x':None, 'y':None}

66.二分查找

#coding:utf-8def binary_search(list,item):
    low = 0
    high = len(list)-1
    while low<=high:
        mid = (low+high)/2
        guess = list[mid]        if guess>item:
            high = mid-1
        elif guess<item:
            low = mid+1
        else:            return mid    return Nonemylist = [1,3,5,7,9]print binary_search(mylist,3)

67.列舉你所知道的python代碼檢測工具以及它們之間的區別

pychecker是一個python代碼靜態分析工具,它能夠幫助python代碼找bug會對代碼的複雜度提出警告
pulint高階的python代碼分析工具,分析python代碼中的錯誤查找不符合代碼風格標準

68.如何用python來進行查找替換一個文本字符串

find()方法能夠在一個較長的字符串中查找子字符串,返回子串坐在位置的最左端索引
replace()方法返回某字符串的全部匹配項均被替換以後獲得的字符串

69.一些經典的編程題:

轉自:https://www.jianshu.com/p/177bb9c418ed

70.用Python字符串「這是一個test字符串」的中文字符個數,字符編碼爲utf-8

import osimport re
s='這是一個test字符串'result=re.findall(r'[\u4e00-\u9fa5]',s)
print(len(result)

71.什麼是python或者說python的特色

python是一門解釋性語言,運行以前不須要編譯,動態類型語言在聲明變量的時候不用聲明變量的類型面向對象編程,編寫快,用途普遍,能讓困難的事變得容易.

72.補充缺失的代碼

def print_directory_contents(sPath):
「「」」
這個函數接受文件夾的名稱做爲輸入參數,
返回該文件夾中文件的路徑,
以及其包含文件夾中文件的路徑。
"""

def print_directory_contents(sPath):
    import os                                       
    for sChild in os.listdir(sPath):                
        sChildPath = os.path.join(sPath,sChild)        if os.path.isdir(sChildPath):
            print_directory_contents(sChildPath)        else:            print sChildPath

73.下面這些是什意思@classmethod,@staticmethod,@property?

裝飾器,裝飾器是一種特殊的函數,要麼接受函數做爲輸入參數,並返回一個函數,要麼接受一個類爲輸入參數,並返回一個類
@標記是語法糖,可讓你簡單易讀的方式裝飾目標對象。
詳細三種裝飾器:Sheena@codementor

74.介紹一下except的用法和做用

try....except執行try下的語句,若是發生異常,則執行過程跳到except語句,對每一個except分支順序嘗試執行,若是異常與except中的異常組匹配,指行相應的語句.

75.python中的pass語句做用是什麼

佔位符

76.python中的unittest是什麼

在python中,unittest是python中的單元測試框架,它有支持共享搭建,自動測試,在測試中暫停代碼,將不一樣測試迭代成一組.

77.python中的模塊和包

在python中,模塊是搭建程序的一種方式,每一個python代碼文件都是一個模塊,而且能夠引用其餘的模塊,好比對象和屬性。
一個包包含許多python代碼的文件夾是一個包,一個能夠包含模塊和子文件夾

78.如何異常撲捉,常見的異常捕捉有哪些?

74題是一種方式
assert語句:判斷assert後面緊跟語句是True,仍是False,若是是True則繼續執行print若是是false則中斷程序,調用默認的異常處理器,同時輸出assert語句逗號的提示信息.
with語句:若是with語句或語句塊中發生異常,會調用默認的異常處理器處理但文件仍是會正常關閉。

79.用python匹配html tag的時候,<.>和<.?>有什麼區別?

前者是貪婪匹配,會從頭匹配到尾
然後者是非貪婪匹配,只匹配到第一個

80.簡述標準庫中functools.wraps的做用

將原函數的對象指定屬性複製給包裝函數對象,默認有module。name,doc

81.部署python開發的web程序的方法

  • mod_python,這是一個apache內置模塊,很嚴重的依賴於mod_python編譯使用的python版本,和apache配套使用,不推薦

  • fastcgi,這是目前流行最廣的作法,經過flup模塊來支持的在nginx裏面對應的配置指令是fastcgi_pass

  • scgi是cgi的替代版本scgi和fastcgi差很少nginx對應的配置指令是scgi_pass

82.Django的model有哪幾種繼承形式,有何不一樣?

Django中有三種繼承方式

  • 一般,你只想用父model來保存那些你不想在子model中重複錄入的信息,父類是不使用的也就是不生成單獨的數據表,這種狀況下使用抽象基類繼承 Abstract base classes

  • 若是你想從現有的model繼承並並讓每一個model都有本身的數據表,那麼使用多重表繼承MUlti-table inheritance.

  • 最後,若是你只想在model中修改python-level級的行爲,而不涉及改變字段改變,代理model (proxy models)適用各類場合.

83.如何提升網頁的響應速度?

  • 減小http的請求

  • 使用cdn(cdn內容發佈網絡)是一組分佈在不一樣地理位置的web服務器 ,cdn可能選擇網絡階躍數最小的服務器,或者具備最短期的服務器.

  • 添加Expires頭(頁面初次訪問會進行不少的http請求,可是經過使用一個長久的expires頭,可使這些組件被緩存,下次訪問的時候就能夠減小沒必要要的http請求,從而提升加載速度

  • 壓縮組件從http1.1開始web服務端能夠經過http請求中的accept-Encoding頭表示對壓縮的支持

  • 將腳本放在底部

  • 避免css表達式(css表達式是動態設置css屬性的一種強大而且)

84.統計一篇英文文章內每一個單詞出現頻率,並返回出現頻率最高的前10個單詞及其出現次數。

from collections import Counterimport rewith open('a.txt', 'r', encoding='utf-8') as f:
    txt = f.read()
c = Counter(re.split('\W+',txt))  #取出每一個單詞出現的個數print(c)
ret = c.most_common(10)   #取出頻率最高的前10個print(ret)

85.給你一個數,如何找到最大值

max(list)
說明max實現原理?

    max(iterable, *[, default=obj, key=func]) -> value
    max(arg1, arg2, *args, *[, key=func]) -> value
    
    With a single iterable argument, return its biggest item. The    default keyword-only argument specifies an object to return if
    the provided iterable is empty.
    With two or more arguments, return the largest argument.

86.寫出這段代碼的輸出結果

num=9def f1():
    num=20def f2():
    print(num)
f2()
f1()
f2()

結果:
9
9

常見的報錯問題

AttributeError 試圖訪問一個對象沒有的樹形,好比foo.x,可是foo沒有屬性x
IOError 輸入/輸出異常;基本上是沒法打開文件
ImportError 沒法引入模塊或包;基本上是路徑問題或名稱錯誤
IndentationError 語法錯誤(的子類) ;代碼沒有正確對齊
IndexError 下標索引超出序列邊界,好比當x只有三個元素,卻試圖訪問x[5]
KeyError 試圖訪問字典裏不存在的鍵
KeyboardInterrupt Ctrl+C被按下
NameError 使用一個還未被賦予對象的變量SyntaxError Python代碼非法,代碼不能編譯(我的認爲這是語法錯誤,寫錯了)TypeError 傳入對象類型與要求的不符合
UnboundLocalError 試圖訪問一個還未被設置的局部變量,基本上是因爲另有一個同名的全局變量,
致使你覺得正在訪問它
ValueError 傳入一個調用者不指望的值,即便值的類型是正確的`

 

做者:絕地無雙連接:https://www.imooc.com/article/36931來源:慕課網

相關文章
相關標籤/搜索