python 任何基礎知識,包括語法等

*)根據結果返回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]是取最後一位,那麼在上面的代碼中,爲負值的話是從後面開始數。正好跟上面的結果相吻合

  

*)爲方法添加提示即選中方法的時候旁邊有提示:如(方法必須寫在

  if __name__=='__main__':  外面

  須要在定義方法的時候使用多行註釋添加語句

 

*)刪除列表中多個元素,連續的:

>>> 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=[]
相關文章
相關標籤/搜索