https://www.imooc.com/article/36931css
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))
t1=(('a'),('b')) t2=(('c'),('d')) res=lambda t1,t2:[{i:j}for i,j in zip(t1,t2)] print(res(t1,t2))
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)
匿名函數與函數有共同的做用域,可是匿名函數意味着引用計數爲0除非讓他有名字
好處:一次性使用,隨時隨地的定義更容易閱讀,作了什麼更是一目瞭然python
是被用於在代碼被執行的時候構建新的函數對象而且返回mysql
在python中定義函數,可也用必選函數,默認參數,可變參數,和關鍵字參數,這四種參數均可以一塊使用,或者只用其中的一些可是請注意的是參數定義的順序必須是必選參數,默認參數,可變參數,關鍵字參數nginx
re.match()老是匹配的是字符串的開頭,並返回匹配的math對象,若是去匹配字符串非開頭的部分就會返回none
re.search()函數對整個字符串進行搜索,並返回第一個匹配字符串的match對象程序員
python中的and是從左往右計算的,若全部的值都是真的,則返回最後一個,若存在假的,返第一個假的,1 or 2由於是1是非零,因此返回的值是1web
*args(表示的就是將實參中按照位置傳參,多餘的都是給args,切都是以元組的方式實現)
**kwargs:(表示的是按照關鍵字傳參,保存的是字典的形式ajax
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的內置函數,該函數使用迭代器協議訪問對象,而生成器實現了迭代器協議算法
python3的字節是python2的字符串
python3的字符竄是python2的unciode
在python3中print要加括號
在python3中數字除法有小數點sql
Unicode--->encode----->utf-8utf-------->decode------>unicode
迭代器即迭代工具,那麼什麼是迭代那
迭代重複上一個重複的過程,每一次重複即一次迭代,而且每一次迭代的結果都是下一次迭代的開始
爲什麼要用迭代器
對於序列類型:字符串,列表,元組,咱們可使用索引的方式迭代取出包含的元素
對於字典,集合,文件等類型沒有索引,若還行取出內部包的元素,則須要找出不依賴索引的方式,那這就是迭代器
什麼是可迭代的對象,具備init方法返回就是迭代器,具備next方法
特色優勢:提供了一種不依賴索引的取值的方式
缺點: 只能往前循環,不能日後找沒法獲取長度,
注意的是:迭代器對象必定是可迭代對象,但可迭代對象不必定是迭代器的對象
生成器迭代器的一種關鍵字yield+關鍵字,next方法,yield語句一次返回一個結果,在每一個
結果中間掛起鉤子函數,以便下次重它離開的地方繼續
生成器表達式相似於列表推導式,可是生成器返回按需求產生結果的一個對象,而不是一次構建
一個結果的列表
特色:惰性運算,節省空間
裝飾器:在不改變原來函數和函數的調用方式進行擴展,就是對外開放,對內封閉的原則
目標:爲被裝飾的對象添加新的功能
Python函數在定義的時候。默認b的值就被計算出來了,即[],由於默認參數b也是一個變量,它指向
對象即[],每次調用這個函數,若是改變b的內容每次調用時候默認參數也就改變了,不在是定義時候的[]了
image.png
因此默認參數要牢記一點:默認參數必須指向不變對象
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)]))
拷貝有兩種方式:淺拷貝和深拷貝copy.copy()and copy.deepcopy()
咱們尋常意義上的複製就是深複製,即將被複制的對象徹底再複製一遍做爲獨立的新個體單獨存在,因此
改變原有被複制的到對象不會對已經複製的新對象產生影響。
而淺複製並不會產生一個獨立的對象存在,他只是將原有的數據打上一塊新標籤,因此當其中一塊標籤被
改變時候,數據就會變化,另外一個標籤也會隨之改變,數據塊就發生變化,另外一個標籤也會隨着改變,
image.png
裝飾器本質上就是一個python函數,它可讓其餘函數在不須要任何代碼變更的前提下增長額外的功能
,裝飾器的返回值也是一個函數對象,她有不少的應用場景,好比:插入日誌,事物處理,緩存,權限裝飾器就是爲已經存在的對象
添加額外功能
def outher(func): def good(*args,**kwargs): ret=func(*args,**kwargs) return ret return good@outherdef bar(): print('狗241131313') bar()
計算列表中的元素的個數和向末尾追加元素所用到的方法?len(),append()
判斷字典中有沒有某個key的方法?用到get('key')方法,若沒有,將返回值none
現有my_list=range(100)
主要是以對象引用計數爲主標記清除和分帶技術爲輔的那麼一種方式
Python在內存中存儲了每一個對象的引用計數(reference count)。若是計數值變爲0,那麼相應的對象就會消失。分配給該對象的內存就會釋放出來用做他用。
偶爾也會出現引用循環。垃圾回收器會定時尋找這個循環,並將其回收。
Python中還使用了某些啓示算法來加速回收。
a='sadsadada'print(isinstasnce(a,str))
http://www.hacksparrow.com/python-difference-between-list-and-tuple.html
首先xrange在python3中已經不適用了
range:
函數說明:range([start,]stop[,step]),根據start與stop指定的範圍以及step設定的步長
生成一個列表
xrange與range相似,只是返回的是一個「xrange object"對象,而非數組list
要生成很大的數字序列的時候,用xrange會比range性能優不少
區別:range會生成一個list對象,而xrange會返回一個生成器對象
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)
target=list(map(lambda x: x*x,[1,2,3,4,5,6,7,8,9,10]
map obj
並補全下面的代碼
image.png
import os os.remove(r'D:\ggg\fileobj) os.remove(‘路徑’)
import random print(random.randint(1,10))
image.png
image.png
# 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語句掛起該生成器函數的狀態,保留足夠的信息,方便以後離開的
地方繼續執行
a=input('please enter a string')print(a[::-1])
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用途很普遍----網絡應用,自動化,科學建模,大數據應用,等等一般被稱爲膠水語言
狀態代碼有三位數字組成,第一個數字定義響應的類別,共分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//服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
l2=[lambda:i for i in range(10)] l1=[i for i in range(10)] print(l1[0]) print(l2[0]) print(l2[0]())
eval有返回值
exec沒有返回值
print(eval('2+3'))print(exec('2+1'))exec("print('1+1')")
class obj(object): passa = eval('obj()') print(a,type(a)) #<__main__.obj object at 0x000001F1F6897550> <class '__main__.obj'>
session在服務器,cooking在客戶端(瀏覽器)
session默認存在服務器上的文件裏面(也能夠是內存,數據庫)
session的運行依賴session_id,而session_id是存在cookie中,也就是說,若果瀏覽器禁用lcookie,同時session也會失效(可是能夠經過其餘方式實現,好比在url中傳入session_id)
session能夠放在文件,數據庫,內存中均可以的
用戶驗證一般會用session
維持一個會話核心就是客戶端的惟一標識,即session_id
無狀態協議,判斷session_id是否相同。
沒有重複的數的總和
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]))
print(i for i in range(1,100)if i%2 ==0])
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)
get,post,put,delete,head,connect
守護進程(daemon)
主進程建立守護進程
其一:守護進程會在主進程代碼執行結束後就終止
其二:守護進程內沒法開啓子進程,不然拋出異常:AssertionError: daemonic processes are not allowed to have children
注意:進程之間是相互獨立的,主進程的代碼運行結束,守護進程隨即終止
p.join([timeout]): 主進程等待相應的子進程p終止(強調:是主線程處於等的狀態,而p是處於運行的狀態)。須要強調的是p.join()只能join住start開始的進程,而不能join住run開啓的進程
因爲GIL的影響,python沒法利用多核優點
CIL本質就是一把互斥鎖,既然是互斥鎖,全部互斥鎖都同樣將併發運行轉化爲串行,此時來控制同一時間內只能被一個任務修改,進而保證數據的安全.能夠確定的是:保護不一樣數據的安全,須要加不一樣的鎖。
如今計算機基本都是多核,python對於計算密集型任務開多線程的效率並不能帶來多大的技術提高,甚至不如串行(沒有大量的切換),可是對於io密集型任務效率仍是有顯著的提高的
所以,對於io密集型任務,python多線程更加的適合。
./run.py.shell直接調用python腳本 python run.py 調用python 解釋器來調用python腳本
一、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,就可使本鏈接持續的時間內所產生的全部報文段都從網絡中消失。
tcp是面向鏈接的,可靠的字節流服務,udp是面向無鏈接的,不可靠而數據服務
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]))
innodb是mysql最經常使用的一種存儲引擎,Facebook,google等公司的成功已證實了innodb存儲引擎具備高可用性,高性能以及高擴展性,支持事物,其特色是行鎖設計,支持外鍵,並支持相似oracle的非鎖定讀,對於表中數據的存儲,inndb存儲引擎採用了彙集的方式,每張表都是按主鍵的順序進行存儲的,若是沒有顯示地在表定義時候指定主鍵,innodb,存儲引擎會爲每一行生成六個字節的ROWId,並以此爲主鍵。
myisam不支持事物,表鎖設計,支持全文索引,主要面向一些olap數據庫應用,此外myisam存儲引擎的另外一個不同凡響的地方是,它的緩衝池只緩存索引文件,而不緩存數據文件,這與大多數數據庫不同
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')
1,當用戶在瀏覽器中輸入url時瀏覽器會生成請求頭和請求體發送給服務端請求頭和請求體中會包含瀏覽器的動做(action)這個動做一般爲get或者post提如今url之中
2.url通過Django中的wsgi再通過django的中間件,最後url到路由的映射表一條一條進行匹配一旦其中的某一條匹配成功就執行視圖函數,後面的路由就不在繼續匹配了
3視圖函數根據客戶端的請求查詢相應的數據,返回給Django,而後Django把客戶端想要的數據做爲一個字符串返回給客戶端
4客戶端瀏覽器接受到返回的數據,通過渲染後顯示給用戶
1url後儘可能用名詞,由於rest frame是面向資源的編程,所以url命名時能體現出資源
2method的不一樣,實現增刪改查的操做
3版本號,由於有版本的更替,爲了體現出版本的過分,所以在發請求的時候,要體現出版本號
4返回值,與以往只返回json不一樣,rest api規範要加上狀態碼。
5域名,因爲先後端分離,所以要處理跨域問題,解決方法:jsonp,cors
6過濾,經過url傳參的形式傳遞搜索條件(列如:指定返回的記錄數量,指定分頁等)
jsonp的本質就是利用script的src屬性繞過同源策略
cors
整個cors通訊過程,都是瀏覽器自動完成,不須要用戶參與,對於開發者來講cors通訊和同源的ajax沒有什麼區別,挨代碼徹底同樣,瀏覽器一旦發現ajax請求跨源,就會自動添加一些附加頭的信息,有時還會多出一次附加的請求,但用戶不會有感受.
print(sorted(dic.items(),key=lambda dic:dic[1]))
innodb存儲引擎(最經常使用的引擎,支持事物,特色是行鎖,特色是行鎖設計,支持外鍵)
myisam存儲引擎(不支持事物,表鎖的設計,支持全文索引)
nod存儲引擎
memory存儲引擎
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
1輪訓
2長輪訓
3websocket
優勢:後端程序編寫比較容易
缺點:請求中有大半是無用浪費帶寬和服務器資源.
實例:適用小型應用
優勢:在無消息的狀況下不會頻繁的請求
缺點:服務器hold鏈接會消耗資源。
實例:webqq,hi網頁版,facebook im。
d = {key: value for (key, value) in iterable}
>>> 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
函數重載主要是爲了解決兩個問題。
1.可變參數類型。
2.可變參數個數。
另外,一個基本的設計原則是,僅僅當兩個函數除了參數類型和參數個數不一樣之外,其功能是徹底相同的,此時才使用函數重載,若是兩個函數的功能其實不一樣,那麼不該當使用重載,而應當使用一個名字不一樣的函數。
好吧,那麼對於狀況 1 ,函數功能相同,可是參數類型不一樣,python 如何處理?答案是根本不須要處理,由於 python 能夠接受任何類型的參數,若是函數的功能相同,那麼不一樣的參數類型在 python 中極可能是相同的代碼,沒有必要作成兩個不一樣函數。
那麼對於狀況 2 ,函數功能相同,但參數個數不一樣,python 如何處理?你們知道,答案就是缺省參數。對那些缺乏的參數設定爲缺省參數便可解決問題。由於你假設函數功能相同,那麼那些缺乏的參數終歸是須要用的。
好了,鑑於狀況 1 跟 狀況 2 都有了解決方案,python 天然就不須要函數重載了。
引自知乎:http://www.zhihu.com/question/20053359
虛擬存儲器是指具備請求和調入功能,能從邏輯上對內存容量加以擴充的一種存儲系統
分頁: 用戶程序的地址空間被劃分紅若干固定大小的區域,稱爲「頁」,相應地,內存空間分紅若干個物理塊,頁和塊的大小相等。可將用戶程序的任一頁放在內存的任一塊中,實現了離散分配。
分段: 將用戶程序地址空間分紅若干個大小不等的段,每段能夠定義一組相對完整的邏輯信息。存儲分配時,以段爲單位,段與段在內存中能夠不相鄰接,也實現了離散分配。
1.頁是信息的物理單位,分頁是爲了實現非連續分配,以便解決內存碎片問題,或者說分頁是因爲系統管理的須要.段是信息的邏輯單位,它含有一組意義相對完整的信息,分段的目的是爲了更好地實現共享,知足用戶的須要.
2.頁的大小固定,由系統肯定,將邏輯地址劃分爲頁號和頁內地址是由機器硬件實現的.而段的長度卻不固定,決定於用戶所編寫的程序,一般由編譯程序在對源程序進行編譯時根據信息的性質來劃分.
3.分頁的做業地址空間是一維的.分段的地址空間是二維的.
用集合
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
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
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}
#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)
pychecker是一個python代碼靜態分析工具,它能夠幫助python代碼找bug會對代碼的複雜度提出警告 pulint高階的python代碼分析工具,分析python代碼中的錯誤查找不符合代碼風格標準
find()方法能夠在一個較長的字符串中查找子字符串,返回子串坐在位置的最左端索引
replace()方法返回某字符串的全部匹配項均被替換以後獲得的字符串
轉自:https://www.jianshu.com/p/177bb9c418ed
import osimport re s='這是一個test字符串'result=re.findall(r'[\u4e00-\u9fa5]',s) print(len(result)
python是一門解釋性語言,運行以前不須要編譯,動態類型語言在聲明變量的時候不用聲明變量的類型面向對象編程,編寫快,用途普遍,能讓困難的事變得容易.
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
裝飾器,裝飾器是一種特殊的函數,要麼接受函數做爲輸入參數,並返回一個函數,要麼接受一個類爲輸入參數,並返回一個類
@標記是語法糖,可讓你簡單易讀的方式裝飾目標對象。
詳細三種裝飾器:Sheena@codementor
try....except執行try下的語句,若是發生異常,則執行過程跳到except語句,對每一個except分支順序嘗試執行,若是異常與except中的異常組匹配,指行相應的語句.
佔位符
在python中,unittest是python中的單元測試框架,它有支持共享搭建,自動測試,在測試中暫停代碼,將不一樣測試迭代成一組.
在python中,模塊是搭建程序的一種方式,每一個python代碼文件都是一個模塊,而且能夠引用其餘的模塊,好比對象和屬性。
一個包包含許多python代碼的文件夾是一個包,一個能夠包含模塊和子文件夾
74題是一種方式
assert語句:判斷assert後面緊跟語句是True,仍是False,若是是True則繼續執行print若是是false則中斷程序,調用默認的異常處理器,同時輸出assert語句逗號的提示信息.
with語句:若是with語句或語句塊中發生異常,會調用默認的異常處理器處理但文件仍是會正常關閉。
前者是貪婪匹配,會從頭匹配到尾
然後者是非貪婪匹配,只匹配到第一個
將原函數的對象指定屬性複製給包裝函數對象,默認有module。name,doc
mod_python,這是一個apache內置模塊,很嚴重的依賴於mod_python編譯使用的python版本,和apache配套使用,不推薦
fastcgi,這是目前流行最廣的作法,經過flup模塊來支持的在nginx裏面對應的配置指令是fastcgi_pass
scgi是cgi的替代版本scgi和fastcgi差很少nginx對應的配置指令是scgi_pass
Django中有三種繼承方式
一般,你只想用父model來保存那些你不想在子model中重複錄入的信息,父類是不使用的也就是不生成單獨的數據表,這種狀況下使用抽象基類繼承 Abstract base classes
若是你想從現有的model繼承並並讓每一個model都有本身的數據表,那麼使用多重表繼承MUlti-table inheritance.
最後,若是你只想在model中修改python-level級的行爲,而不涉及改變字段改變,代理model (proxy models)適用各類場合.
減小http的請求
使用cdn(cdn內容發佈網絡)是一組分佈在不一樣地理位置的web服務器 ,cdn可能選擇網絡階躍數最小的服務器,或者具備最短期的服務器.
添加Expires頭(頁面初次訪問會進行不少的http請求,可是經過使用一個長久的expires頭,可使這些組件被緩存,下次訪問的時候就能夠減小沒必要要的http請求,從而提升加載速度
壓縮組件從http1.1開始web服務端能夠經過http請求中的accept-Encoding頭表示對壓縮的支持
將腳本放在底部
避免css表達式(css表達式是動態設置css屬性的一種強大而且)
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)
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.
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來源:慕課網