*)根據結果返回True或者False的返回語句能夠這樣寫:html
if md5.hexdigest()==db[user]: return True else: return False #改成 return md5.hexdigest()==db[user]
*)python字符串倒置的幾個方法node
參考連接:https://www.runoob.com/python3/python-string-reverse.htmlpython
*)isinstance( )git
>>> help(isinstance) Help on built-in function isinstance in module builtins: isinstance(obj, class_or_tuple, /) Return whether an object is an instance of a class or of a subclass thereof. A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target to check against. This is equivalent to ``isinstance(x, A) or isinstance(x, B) or ...`` etc. #例子 >>> isinstance(2,(int,float))#檢查2是否爲 int或者float類型 True
*)pass 語句express
*)math.exp(X)返回結果是e^x編程
>>> math.exp(100) 2.6881171418161356e+43 >>> pow(math.e,100) 2.6881171418161212e+43
*)inputwindows
input(prompt=None, /) 從標準輸入中讀取字符串,而且刪去尾隨的換行符 prompt 字符串若是存在,將會在要讀取的輸入前被標準化輸出,而且不帶尾隨的換行符
*)if語句有個特色,他是從上到下判讀,若是某個分支的條件爲True,那麼相應的分支執行事後,就忽略掉剩下的elif和else了數組
*) break和continue的區別:閉包
break:跳出循環,執行for循環下面的語句。app
continue:跳出本次循環,執行下次循環。
這兩個語句一般都須要if配合使用,須要注意的是,不能濫用break和continue語句,由於會形成代碼邏輯分支過多,容易出錯,並且continue和break語句能經過改寫循環條件或者修改循環邏輯來去掉。
*) 要注意不一樣函數對全局變量操做時,要肯定操做的都是全局變量。或者說是要同步,想讓一個變量被另外一個只對全局變量處理的函數處理,就要保證他是全局函數
import random checked=[] ring_s2e=[] def find_or_del_ring(ring_start,current_node,find=True):#這個對G操做,其實應該把G傳進來的。但我設成了全局變量。那麼就要注意這個函數的操做對象時全局變量 abuments=[] for i in range(len(G)): if current_node in G[i]: abuments.append(i) if not abuments: return for node in abuments: if node in G[ring_start]: if find: ring_s2e.append('環:%d-%d'%(ring_start,node)) else: G[ring_start].remove(node) elif "%d-%d"%(ring_start,node) not in checked: checked.append("%d-%d"%(ring_start,node)) find_or_del_ring(G,ring_start,node,find) def creat_DAG(node_size=10): --snip-- result=[] for i in range(node_size): find_or_del_ring(i,i,False)#問題出在這裏了,這個函數是在find_or_del_ring()處理後,將reslut賦值給G的,但忘了find__()方法的操做對象是全局G,等於說這裏調用方法起不到做用,但我沒有想到這些。 --snip-- def check_if_DAG(G): for i in range(len(G)): find_or_del_ring(i,i,True) --snip-- def print_line(para,prefix=''): --snip-- G=[] if __name__ == "__main__": G=creat_DAG(10) checked=[] check_if_DAG(G)
*)return 可看成函數的退出語句
*)tuple 單元素的寫法
a=(1,)#這是正確的單元素的寫法 #若是不加逗號,就和數學小括號混淆了
*)if __name__=="__main__":中定義的也是全局變量
def test(): print(global_variable) if __name__=="__main__": global_variable=111 test() #輸出:111
*)2e3
#不導入numpy也是能夠這樣用的
>>> import numpy as np >>> print(+2e3) 2000.0 >>> print(+2e4) 20000.0 >>>
*)lambda表達式
參考連接:http://www.javashuo.com/article/p-gfpeijpn-mc.html
flage=[False for i in range(len(algorithm_list))] if (reduce(lambda x,y:x and y,flage)):
應用:
*)lambda還能夠看成函數對象儲存
>>> a.append(lambda x:x*5) >>> a [5, 5, 5, <function <lambda> at 0x000001776C874BF8>] >>>
1)在map、reduce、filter、sorted中
2)在閉包中
def get_y(a,b): return lambda x:ax+b y1 = get_y(1,1) y1(1) # 結果爲2 #常規函數 def get_y(a,b): def func(x): return ax+b return func y1 = get_y(1,1) y1(1) # 結果爲2
Python之禪中有這麼一句話:Explicit is better than implicit(明瞭勝於晦澀),就是說那種方式更清晰就用哪種方式,不要盲目的都使用lambda表達式。
*)縮進的壞處就是「複製-粘貼」功能失效了,這是最坑爹的地方。當你重構代碼時,粘貼過去的代碼必須從新檢查縮進是否正確。此外,IDE很難像格式化Java代碼那樣格式化Python代碼。
*)能夠這樣寫
time_template='time=%ds' #使用 time_text.set_text(time_template%frameno)
*)向字典dict中添加鍵值對直接寫就行了
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} dict['Age'] = 8 # 更新 dict['School'] = "RUNOOB" # 添加
*)for 循環中不要寫return語句
*)for 循環中使用遞歸經過return 會讓for 循環不能完全執行(for 循環能被return終止)
def find_ring(current_node,ring_terminal): abutment=[]#存放current_node的鄰接點 for abutment_list_index in range(len(G)): if current_node in G[abutment_list_index]: abutment.append(abutment_list_index) if not abutment: # checked.append('%d-%d'%(current_node,ring_terminal)) return 0 for i in abutment: if '%d-%d'%(i,ring_terminal) in checked: continue elif i in G[ring_terminal]: ring_s2e.append('環%d--%d'%(i,ring_terminal)) continue else: checked.append('%d-%d'%(current_node,ring_terminal)) #return find_ring(i,ring_terminal)#假如for循環第一遍是進入這個遞歸,執行一次就會退出for 你信不信,由於for循環能被retrun終止
find_ring(i,ring_terminal)#應該這樣
*)在定義函數的參數時,若是定義了默認參數(默認參數能夠位置參數的形式寫),則在調用的時候,」位置參數「必須出如今關鍵字參數以前:
#定義: def creat_data(type='random',data_start=-1000,data_end=1000,size=1000): ----snip---- #調用: collection=creat_data('random',-1000,1000,size=1000)#正確的調用 collection=creat_data(type='random',-1000,1000,size=1000)#錯誤的調用
*)寫桶排序的過程當中遇到一個頗有意思的事情,在爲元素分桶的時候,沒有考慮負數,根據商向下取整的原理將分桶代碼寫爲:
bucket_count=(max_value-min_value)//default_bucket_size+1 bucket[i//(default_bucket_size+1)]=insertion2bucket(bucket[i//(default_bucket_size+1)],i)
正數分時沒問題,但遇到負數時會出現:
>>> -88//5 -18
原覺得這樣會形成溢出,最後運行了一遍發現並無:
未排序以前: [-449, 875, 554, 999, 322, -903, 756, -766, 270, -189] 排序後:[270, 322, 554, 756, 875, 999, -903, -766, -449, -189]
只是出現了先有正數,後有負數的狀況,這讓我想到了list[-1]是取最後一位,那麼在上面的代碼中,爲負值的話是從後面開始數。正好跟上面的結果相吻合
*)爲方法添加提示即選中方法的時候旁邊有提示:如(方法必須寫在
須要在定義方法的時候使用多行註釋添加語句
*)刪除列表中多個元素,連續的:
>>> del(a[0]) >>> a [2, 3, 4, 5] >>> del(a[2:]) >>> a [2, 3] >>>
*)元組中的值不能夠單個修改
參考連接:https://www.cnblogs.com/duwenxing/p/7348561.html
*)num(list)能夠求和
*)還能夠這樣用列表給多個用戶賦值
a, b, c, d, e, f, g, h = range(8)
*)對錯誤沒有思考,誤解了錯誤,而且沒有驗證
bucket[(10-(collection[j]//i)%10)%10].append(collection[j])#最後又%10是避免出現-20%10=10的狀況
*)重複使用的變量應該在使用後及時初始化,特別是結合循環的時候
# bucket=[[] for i in range(10)]#重複使用的變量應該清空 --snip-- for i in divisor: bucket=[[] for i in range(10)]#應該放在循環裏
*)請謹記除非if中有return等中斷的語句,不然請務必加else流程
if collection[j]//i>0:#這樣切割數據 bucket[(collection[j]//i)%10].append(collection[j])#考慮餘數,直接將餘數當成下標 #不然就說明已經完成了#這裏就忘記加else了,致使下面這裏每次都執行 completed.append(collection.pop(j))
*)遍歷一維數組和二維數組的混合數組
for i in a: ... if type(i)==type(a): ... b.extend(i) ... else: ... b.append(i)
*)能夠這樣製造特定元素個數的空數組
>>> a=[None for i in range(5)] >>> a [None, None, None, None, None] >>> a[0].append(5) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'NoneType' object has no attribute 'append' >>> a=[[] for i in range(5)] >>> a [[], [], [], [], []] >>>
*)python中沒有null 只有None,None就是null的意思
*)一種轉換數據類型的方式
difference.append(float('%.6f'%(time1-time2)))
*)使用for in 遍歷列表,列表中的元素將會是str(錯誤的,是由於格式化時沒寫正確,正確的寫法已經修改成)
difference=[] difference.append(float('%.6f'%(time1-time2)))#正確的是
#這是錯誤的difference.append('%.6f'%(time1=time2)) for i in difference: advanceTime+=i Traceback (most recent call last): File "some_sort.py", line 675, in <module> advanceTime+=i TypeError: unsupported operand type(s) for +=: 'int' and 'str'
*)將一個列表a複製給b,對b進行pop(),a的元素也會少,可使用deepcopy()來避免
>>> a=[5,6,7] >>> b=a >>> b.pop() 7 >>> b [5, 6] >>> a [5, 6]
*)python平方
參考連接:https://blog.csdn.net/islotus/article/details/61858300
>>> pow(2,0) 1
*)python 求log
參考連接:https://www.runoob.com/python/func-number-log.html
>>> math.log(5,2) 2.321928094887362 >>> int(math.log(5,2)) 2 >>> math.ceil(math.log(5,2)) 3 >>>
*)python保留兩位小數
參考連接:https://www.cnblogs.com/Raymon-Geng/p/5784290.html
>>>a = 5.026 >>>round(a,2) >>> 5.03
>>>float('%.2f' % a)
>>>5.03
*)Python中if 語法糖不能對變量賦值,那樣會出錯
a,b,c=2,3,4 print('a') if b<c else print('b') #結果 λ python forTest.py a a,b,c=2,3,4 a=4 if b<c else a=1 # print(a) #結果 a=4 if b<c else a=1 ^ SyntaxError: can't assign to conditional expression
*)字符串格式化是佔位符必須在當前字符串結束以後緊跟
logging.info('--bidirectional_bubble_sort()--message:當前待排序元素:'+' '*40+'length=%d %s'%(length-2*i,collection[i:length-i-1])) logging.info('--bidirectional_bubble_sort()--message:當前待排序元素:length=%d '+' '*40+'%s'%(length-2*i,collection[i:length-i-1])) #這個會顯示錯誤: TypeError: not all arguments converted during string formatting
*)python中 四捨五入 向上取整(注意是向上(座標軸正方向)或者向下,特別注意ceil(-1.5)爲-1)與向下取整
>>> import math >>> math.ceil(1.1) 2 >>> math.floor(1.1) 1 >>>
*)python中不能這樣一塊兒賦值:
i,j=0 i=0,j=0
*)返回參數
def XX(): --snip-- return plt,anim plt,_=draw_chart(od)#這樣接受返回參數
*)copy()和deepcopy()
參考連接:https://blog.csdn.net/qq_32907349/article/details/52190796
*)OPP面向對象編程
*)接受輸入input()
>>> print(input('plese enter ')) plese enter 2 2 >>>
*)num[-1]是指最後一位元素
*)Python中函數在代碼中的先後順序並不影響在調用關係:
def test(i,collection): sum=0 for s in collection: sum=sum+Multifly(s)#仍然能夠調用Multifly print(i,sum) def Multifly(num):
*)import 的正確方式:
from matplotlib import animation#正確方式 import matplotlib.animation#錯誤方式 import matplotlib.animation as ani#可能正確,由於plt就是這樣的 #使用 anim=animation.FuncAnimation(fig,animate,frames=200,interval=60,blit=True)
*)關於可變參數使用
def modify(*password1,id,name,email):#想讓password1變成可變參數,參考https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888裏「若是函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就再也不須要一個特殊分隔符了:」 # check_admin(request) logging.info('*'*30+'id參數爲'+id) logging.info('*'*30+'name參數爲'+name) logging.info('*'*30+'email參數爲'+email) logging.info('*'*30+'password參數爲'+password1) #結果 INFO:root:使用這些參數調用: {'id': '001556249218238f1b1ed77562c4add92ba541eaabd1edb000', 'name': '我是管理員', 'email': '11111@qq.com'} INFO:root:******************************id參數爲001556249218238f1b1ed77562c4add92ba541eaabd1edb000 INFO:root:******************************name參數爲我是管理員 INFO:root:******************************email參數爲11111@qq.com INFO:root:******************************password參數爲() #必需要改爲這樣 def modify(*,password1,id,name,email): *
這個問題從修改密碼開始,當我點擊重置密碼後,使用重置的密碼卻登陸不上去,一開始我在後臺比較登陸和修改時的加密邏輯,甚至到了把登陸裏的加密邏輯放到修改模塊裏的地步,儘管他們看起來如出一轍,最後我終於確認了不是邏輯的問題,我就以爲多是參數的問題,其實這時候我應該去比較登陸和修改裏的參數的,可是我沒有,我直接用上面的輸出來進行驗證,最後終於發現了是參數類型的順序寫錯了,雖然這個問題解決了,可是又引出了新的問題,到底應該怎樣拼寫不一樣類型參數的順序呢?
*)進入其餘盤的命令
#不是這樣 C:\Users\Administrator.SC-201605202132 λ cd D: D:\cmder\vendor\git-for-windows #是這樣 C:\Users\Administrator.SC-201605202132 λ D: D:\cmder\vendor\git-for-windows λ
*)python 數組(沒有總結徹底)
參考連接:https://www.cnblogs.com/ifantastic/p/3811145.html
python中的數組名也是指向數組存放的地址
a=[1,2,4] b=a #咱們並無複製a所指引的列表。咱們只是建立了一個新的標籤b,而後將其指向a所指向的列表。
內建函數id()能夠返回對象的惟一id。該id是對象的內存地址。
>>> a = [1, 2, 3] >>> b = a >>> a.append(4) >>> print a [1, 2, 3, 4] >>> print b [1, 2, 3, 4]
這樣複製
new = old[:]#表示切片 b = a[:] #切片
*)在函數中使用全局變量
參考連接:https://www.cnblogs.com/phoebus0501/archive/2011/01/18/1938728.html
先在函數中用global聲明一下就能夠了,不須要也不能(?)用一次聲明一次
全局變量不須要在方法外先聲明
def test(): global AAAA#注意這一句,而且全局變量通常都爲大寫 AAAA=2 return def test2(): global AAAA#別的函數中使用也必須先聲明 AAAA=3 if __name__=='__main__': test() test2() print(AAAA)
def model_choose(str,model): #jieba_cut=functools.partial(jieba.cut,cut_all=True) global result #使用result if model==1:#標誌着是全模式 result.append('全模式')#不能將行代碼包括下面的都寫成global result... jieba.cut(str,cut_all=True) elif model==2:#標誌着精確模式 result.append('精確模式') return jieba.cut(str,cut_all=False) else:#搜索硬性模式 result.append('搜索引擎模式') return jieba.cut_for_search(str) str ='可使用相似今天看那個偏函數' model=2 result=[]