python面試題

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

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

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除非讓他有名字
好處:一次性使用,隨時隨地的定義更容易閱讀,做了什么更是一目了然

為什么匿名函數沒有語句?

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

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

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

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

re.match()總是匹配的是字符串的開頭,并返回匹配的math對象,如果去匹配字符串非開頭的部分就會返回none
re.search()函數對整個字符串進行搜索,并返回第一個匹配字符串的match對象

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

python中的and是從左往右計算的,若所有的值都是真的,則返回最后一個,若存在假的,返第一個假的,1 or 2因為是1是非零,所以返回的值是1

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

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

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中數字除法有小數點

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

Unicode--->encode----->utf-8
utf-------->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
@outher
def 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):
    pass
a = 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協議的區別是什么?

1、TCP協議是有連接的,有連接的意思是開始傳輸實際數據之前TCP的客戶端和服務器端必須通過三次握手建立連接,會話結束后也要結束連接。而UDP是無連接的
2、TCP協議保證數據發送,按序送達,提供超時重傳保證數據可靠性,但是UDP不保證按序到達,甚至不能保證到達,還是努力交付,即便是按序發送的序列,也不保證按序送到。
3、TCP協議所需資源多,TCP首部需20個字節(不算可選項),UDP首部字段只需8個字節。
4、TCP有流量控制和擁塞控制,UDP沒有。網絡擁堵不會影響發送端的發送速率。
5、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 = None
a = 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)  # ABCDEGF

print('')

# 后序遍歷
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 = None

class 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-8
def 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 None
mylist = [1,3,5,7,9]
print binary_search(mylist,3)

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

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

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

find()方法可以在一個較長的字符串中查找子字符串,返回子串坐在位置的最左端索引
replace()方法返回某字符串的所有匹配項均被替換之后得到的字符串

69.一些經典的編程題:

轉自:http://www.lxweimin.com/p/177bb9c418ed

70.用Python字符串“這是一個test字符串”的中文字符個數,字符編碼為utf-8

import os
import 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 Counter
import re

with 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=9
def f1():
    num=20
def 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 傳入一個調用者不期望的值,即使值的類型是正確的`
圖片發自簡書App
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1 Python字符串格式化中,%s和.format的主要區別是什么? 1.1、匿名tuple(推薦在參數少時用)...
    whenitsallover閱讀 596評論 0 3
  • 萬物皆流—赫拉克里特 米利都學派和畢達哥拉斯更多的是對事物的實體本質或者數量上的關系、秩序感興趣。他們的思想里暗含...
    不軟丁閱讀 1,131評論 0 0
  • 茅前耕田,舍中織布;天河相隔,牛亡悲郎盼七七。 十日之下,舉弓射烏;月上桂下,魂銷腸斷思故人。 西湖斷橋,借傘還釵...
    海棠1005閱讀 363評論 0 1