python基础应用_【复习】mysql+python基础应用(20190815)
一、mysql:
1.1深入淺出:
數(shù)據(jù)分析的典型四步驟:確定問題(心智模型 )→分解問題→評(píng)估數(shù)據(jù)→做出決策
(CRISP-DM(cross-industry standard process for data mining) 模型:商業(yè)理解→數(shù)據(jù)理解→數(shù)據(jù)準(zhǔn)備→建立模型→模型評(píng)估→發(fā)布模型)
貝葉斯統(tǒng)計(jì),在自己被診斷為陽性的情況下,患陽的概率。
實(shí)際就是recall和precision的問題,我想知道precision,預(yù)測的精度是90%(100個(gè)有90個(gè)是準(zhǔn)的),那我就有90%的概率是陽性咯。但實(shí)際只知道recall,即陽性患者,能被診斷出來的概率為95%(100個(gè)陽性,模型能診斷出來95個(gè)),所以需要貝葉斯轉(zhuǎn)換啊。
主觀概率,講的有點(diǎn)是皮爾遜相似度的問題,就是說兩個(gè)人意見相差很大(比如對(duì)電影的評(píng)價(jià)),但實(shí)際上很有可能是因?yàn)閮扇说臉?biāo)準(zhǔn)偏差很大,A對(duì)電影整體就是比較寬容,B對(duì)電影整體就是比較嚴(yán)苛。用主觀概率,就能比較直觀地比較。
1.2 必知必會(huì):
順序是賓 where 狀groupby 然后是orderby 最后才是主(最后主語選出來的哪怕沒有orderby的關(guān)鍵字,也是會(huì)先經(jīng)過排序再顯示)。
ps:有join聯(lián)結(jié)的時(shí)候,where統(tǒng)一放在on的后面,不然會(huì)報(bào)錯(cuò)
主:檢索列/行的基本用法;處理:concat、as、算數(shù)計(jì)算和函數(shù)計(jì)算、日期計(jì)算(常用select day(...)/year(...)/date(...))、文本處理(常用 select Ltrim(...) /upper(...))
賓:where的基本用法:and or組合邏輯、in/not in篩選邏輯、控制檢查null、剩下過濾的問題:
a. 通配符like,完全匹配“where prod_name like 'jet'、限定匹配“where prod_name like 'jet_'、任意匹配“where prod_name like 'jet%'.
..............................
b.正則表達(dá)式regexp,首先說明一點(diǎn),like的話是必須完全匹配才會(huì)返回,regexp是列名中含有表達(dá)式則返回,如果要完全匹配的話,要配合定位符使用(加一個(gè)首定位符和尾定位符就可以了)。完全匹配“where prod_name regexp 'jet'、限定匹配“where prod_name like 'jet.'(正則里面變成了.)、任意匹配可以用.* 的方法,實(shí)際上正則比通配符優(yōu)勢的地方就在于他對(duì)任意匹配的控制到了隨意的地步:
匹配范圍:or匹配:“where prod_name regexp 'jet[0-9]'或者“where prod_name regexp 'jet[1|2|3|4|5|6|7|8|9]'或者“where prod_name regexp 'jet[:digit:]';特殊字符匹配“where prod_name regexp 'jet\.'(匹配jet.)以及其他的符號(hào)匹配(比如什么換行符 制表符)
匹配限定:個(gè)數(shù):*任意個(gè)數(shù)、+至少1個(gè)、? 0或者1個(gè)、{n} 制定n個(gè)數(shù)目匹配,{n,}至少n個(gè),{n,m}n~m個(gè); 位置限定^ 開始(放在[]里面表示否定,比如[^1-9]表示不匹配1-9),$結(jié)尾
..............................
c.全文本搜索match against:首先是要建表的時(shí)候采用myisam引擎開啟fulltext才可以建立索引并搜索(或者用布爾搜索進(jìn)行強(qiáng)行搜索)
create table .....(....., fulltext(note_text))engine=myisam。
采用match against進(jìn)行匹配 where match(note_text) against('jet')等同于where note_text like '%jet%'。如果只是match against的話,相比正則表達(dá)式,會(huì)更智能,因?yàn)闀?huì)按一定順序返回,排名方式是按照匹配到的目標(biāo)的多少。真正厲害的方法是采用布爾搜索模式where match(note_text) against('jet' in boolean mode),可以支持查詢擴(kuò)展(根據(jù)關(guān)鍵詞引申查詢其他相關(guān)項(xiàng))以及除了匹配,還可以直接限定非匹配,等等功能。
狀:group by :group by +having的組合
最后:orderby:desc asc
其他細(xì)則:
聯(lián)結(jié)概念,除了where聯(lián)結(jié)、join聯(lián)結(jié),還可以用union聯(lián)結(jié),在很復(fù)雜的表達(dá)力,union聯(lián)結(jié)可能會(huì)更簡單,因?yàn)椴挥每紤]邏輯。
..............................
便捷功能:
視圖(就是打包的select語句):create view xxx as xxx。。。
存儲(chǔ)(就是def 函數(shù),允許輸入輸出參數(shù)):create procedure xxx() begin... end; 要執(zhí)行的時(shí)候用call: call xxx();
游標(biāo)(指向一個(gè)select語句,一般是配合存儲(chǔ)過程使用的,而且會(huì)用repeate來反復(fù)select):declare XXXX cursor for select.....。執(zhí)行游標(biāo)就用open...fetch...close 。配合repeate有固定套路。
觸發(fā)器:就是delete insert update語句,在指定時(shí)候觸發(fā):create trigger XXX after XXXX for XXXXX。
事務(wù)管理transaction:回退rollback、提交commit、保留點(diǎn)savepoint。
1.3 經(jīng)典50題
sum+case的用法:
image.png
排序問題:
a. 允許rank()over函數(shù):
a.1 有相同排名,則名次要空缺,不連續(xù)編號(hào):
select sc.sid,rank()over(order by sc.score desc)rank01 from sc where sc.cid='01')
..............................
a.2 有相同排名,也連續(xù)編號(hào)(dense_rank):
select sc.sid,dense_rank()over(order by sc.score desc)rank01 from sc where sc.cid='01')
..............................
a.3 組內(nèi)排名:
select sc.sid,rank()over(partition by sc.cid order by sc.score desc)rank01 from sc where sc.cid='01')
..............................
..............................
b. 不允許rank()over函數(shù):
b.0 無相同排名:
select sid,score,(@a:=@a+1) rank01 from (select * from sc where cid=01 order by score desc)scc,(select @a:=0) a;
上面這種寫法,實(shí)際上只適用于無相同排名
b.1 有相同排名,則名次要空缺,不連續(xù)編號(hào):(一旦有相同排名,就用聯(lián)結(jié)的方式更簡單)
思路:先按無相同排名排名,再groupby取排名最小值,再聯(lián)立
select sid,sc.score,rank01 from sc,(select score, min(rank01) rank01 from (select score,(@a:=@a+1) rank01 from (select * from sc where cid=01 order by score desc)scc,(select @a:=0) a)c group by score)d where sc.cid=01 and sc.score=d.score order by rank01 asc;
image.png
感覺寫的有點(diǎn)復(fù)雜,思考了一下,如果用兩表聯(lián)立的方法,來找比自己高的數(shù)目(或者低的數(shù)目)來排名,更簡單,但要小心有兩個(gè)第一名的情況,比如說如果有兩個(gè)第一名,那么大于等于自身分?jǐn)?shù)的會(huì)有兩個(gè)值,rank自動(dòng)會(huì)是2:
select a.sid,(count(*))rank01 from sc a,sc b where a.cid=01 and b.cid=01 and a.score<=b.score group by a.sid;
這種情況你怎么都不好調(diào)整,因?yàn)槟阒挥械谝幻呐琶清e(cuò)誤的,后面的排名都是對(duì)的。。。
image.png
用left join也不能完美解決這個(gè)問題(我真的試過了)
用自聯(lián)結(jié)+sum case是很通用的方法:
select a.sid,(sum(case when a.score
image.png
..............................
b.2 有相同排名,也連續(xù)編號(hào)(dense_rank):
思路:先distinct分?jǐn)?shù)排名,再聯(lián)結(jié)
..............................
b.3 組內(nèi)排名:
思路1:先分組,再排序,再union一起;
思路2:自聯(lián)結(jié)+left join/sum case+groupby
總結(jié)下排序問題:在允許rank()over的情況下就盡情使用,不允許的話:1、@a:=@a+1方法比較粗暴,但是寫起來有點(diǎn)復(fù)雜;2、如果沒有兩個(gè)第一名,用聯(lián)結(jié)+count()的方法是最簡單的方法;3、如果有兩個(gè)第一名,用聯(lián)結(jié)+sum case是通用的方法,也是最不會(huì)錯(cuò)的方法。
1.4 leecode
ifnull函數(shù)
聚集函數(shù)不能用in匹配
delete from person where id not in (select min(id) id from person group by email);
是錯(cuò)誤的,因?yàn)閙in(id)是聚集函數(shù),外面還得再包一層select * from
善用case+when else end的組合(基本上難題都是靠這個(gè)解決)
排序,能用limit(offset)就用limit,不然就是自連接(比sum case簡單),不行再用sum case
二、python
2.1 python菜鳥+應(yīng)用
看多少遍都不為過,要經(jīng)常復(fù)習(xí)
tips:多行注釋用ctrl+/,或者打三引號(hào)
2.1.1 7大類型(6+1)
number,string,tuple是不可變類型
list,set,dictionary是可變類。
number
兩點(diǎn):
a.分為int,float,bool,complex,并且可以互相轉(zhuǎn)換
b.number必然會(huì)涉及運(yùn)算,傳統(tǒng)的運(yùn)算是在math模塊里面,但是現(xiàn)在直接用 numpy就可以涵蓋全了。
字符串
四點(diǎn):
a.轉(zhuǎn)義字符的使用\n(順便說一句,用\n可以實(shí)現(xiàn)字符串換行,但是格式上并不簡潔,可以用三引號(hào)的方式,在里面直接換行)
b.常用運(yùn)算符:+ 、*、[]切片
c.字符串格式化s%,如果是數(shù)值格式化,常用%d和%f
image.png
d.其他常用函數(shù):upper、capitalize、lstrip(mysql是ltrim ,一個(gè)是trim,一個(gè)是strip)、全局函數(shù)len和del(基本上所有類型都可以用的)...
list
兩點(diǎn)
a.list和str的區(qū)別在于list是可變的,所以除了str具備的基本特征(+、*預(yù)算符等),還有一些自建函數(shù)和全局函數(shù)進(jìn)行數(shù)據(jù)更新,常用:list.count(obj)、list.sort( reverse=False)以及增刪查改等等。
b.因?yàn)閘ist可變同時(shí)可索引,因此應(yīng)用是最廣泛的,經(jīng)常當(dāng)堆棧使用(append和pop),還有自己具有強(qiáng)大而又漸變的列表推導(dǎo)式功能:
image.png
tuple
和列表的區(qū)別在于,不允許更改,所以是沒有更改數(shù)據(jù)的自建函數(shù)的,可以用全局函數(shù)進(jìn)行運(yùn)算。
set集合
兩點(diǎn):
a.set有兩種生成方式,一種是直接生成,一種是利用str或者tuple轉(zhuǎn)化,參見以下三種區(qū)別:
image.png
b.集合的增刪查改
字典dict
兩點(diǎn):
a.沒有順序之說,只有key和value的鏈接
b.增刪查改的幾個(gè)函數(shù)都比較重要
其他
NoneType:a=None (mysql是null)
bytes:a=b'sdfsdf' (就是采用ASCII編碼的str!)
增刪查改看這個(gè)表
image.png
2.1.2 運(yùn)算符
7種運(yùn)算符類型:
image.png
需要注意的是,兩個(gè)數(shù)值的時(shí)候 &、|是位運(yùn)算,如果是邏輯變量,&、|可以當(dāng)邏輯運(yùn)算符,而且實(shí)際應(yīng)用其實(shí)更廣泛,尤其是在dataframe的時(shí)候,很多時(shí)候都只能用這種邏輯運(yùn)算,不能用and和or。
2.1.3 控制與循環(huán)
循環(huán)語句
主要是三點(diǎn):
a.if else循環(huán);
b.while else循環(huán);
c.for else循環(huán)(用得很少,基本上是用來判定for循環(huán)的內(nèi)容里面有沒有想要的內(nèi)容,沒有的話就break跳出,不執(zhí)行else,有的話就順帶執(zhí)行下else語句,表明有想要的內(nèi)容)
迭代器和生成器
通常都是用range來進(jìn)行迭代了,iter迭代器和yield生成器暫時(shí)都用不著,有簡單的方法干嘛用復(fù)雜的呢。
2.1.4 函數(shù)
2.1.4.1 基礎(chǔ)問題
可變對(duì)象和不可變對(duì)象的參數(shù)傳遞問題
image.png
總結(jié)起來就是,不可變對(duì)象number、string、tuple傳入函數(shù),只是把值傳進(jìn)去,無論函數(shù)內(nèi)部怎么操作,元數(shù)據(jù)都不會(huì)受到影響。
幾種傳入?yún)?shù)
分別是必須參數(shù)/關(guān)鍵字參數(shù)、默認(rèn)參數(shù)、不定長參數(shù)(一個(gè) * 以tuple存儲(chǔ),兩個(gè) * 以dict儲(chǔ)存)
匿名函數(shù)
summ=lambda a,b:a+b (就是不要搞忘就行了)
2.1.4.2 內(nèi)置常用函數(shù)
(這個(gè)很重要,其實(shí)介紹完幾個(gè)類型之后,就應(yīng)該介紹這個(gè)的,這幾個(gè)基本上都是適用于list的,因?yàn)閘ist迭代和索引起來都最方便)
取整求余
求余:x%2 →→mysql是mod(x,2)
四舍五入:round(x) →→mysql一樣
向下取整:int(x) 或者math.floor(x) →→mysql是:floor(x)
向上取整:int(x)+1或者math.ceil(x) →→mysql一樣
enumerate
配合list使用,成為迭代器(相當(dāng)于range,或者iter),但他會(huì)返回兩個(gè)值,一個(gè)是list的索引,一個(gè)是值:
image.png
sorted
跟list.sort類似
reversed
跟list.reverse類似
zip
配合list使用,很好用。比起zip()的用法,更好用的是zip(*)的用法,可以方便地處理多維矩陣:
image.png
map(很方便!)
配合list使用!
image.png
2.1.5 模塊
就三點(diǎn):
模塊的導(dǎo)入方式
最常見的sys模塊,含有模塊搜索路徑
dir()查看模塊所有定義(目前基本上用不到),name的用法(用于判定是引用的模塊,還是自身函數(shù)):
image.png
2.1.6 輸入輸出
格式美化問題,str.format()是新的格式方式,%是舊的格式方式(額。。)
讀寫文件問題
open→read/write→close
image.png
常用的幾種模式:
r→只讀
w→只寫,原有內(nèi)容會(huì)被刪除
r+→讀寫
w+→讀寫,原有內(nèi)容會(huì)被刪除
2.1.7 其他
錯(cuò)誤和異常:try +except+else+raise語句;清理行為,一種是在最后使用finally語句保證完成清理,一種是有些模塊有標(biāo)準(zhǔn)清理行為,用with使用(比如open模塊有close的清理行為,避免打開文件后忘記關(guān)閉)
面向?qū)ο?/p>
三點(diǎn):
a.面向?qū)ο蟮木柙谟诳梢岳^承,子類繼承父類,甚至可以更改父類;
b.類化和實(shí)例化的區(qū)別,x = MyClass(2)就是實(shí)例化,(把需要的參數(shù)都輸入進(jìn)去了,不就是實(shí)例么,參數(shù)也可以是空),x = MyClass就是類化。class定義里面肯定有一個(gè)init,是對(duì)參數(shù)進(jìn)行傳遞:
image.png
上面,def init(self,n,a,w)就是將具體參數(shù)如的參數(shù)n賦值給name,a賦值給age,w賦值給__weight,具體利用這些參數(shù)怎么用,則需要進(jìn)一步定義,比如下面的def speak(self)。(思路總算是清晰一點(diǎn)了,要先用init將所有參數(shù)賦值,再針對(duì)各種參數(shù)進(jìn)行函數(shù)定義)
常用模塊:
math模塊,datetime模塊,smtplib模塊,sys模塊...
2.2 pandas
2.2.1 基本操作
文件讀取
df1=pd.read_csv('/desktop/xxx.csv')
兩種數(shù)據(jù)結(jié)構(gòu) dataframe和series
dataframe和series的主要區(qū)別在于一個(gè)是多維,一個(gè)是一維(當(dāng)然dataframe也可以是一維,比如series自帶的to_frame函數(shù)轉(zhuǎn)化成dataframe);次要區(qū)別在于series有一些自己的函數(shù),比如series.map(....),map就只能對(duì)一維使用,多維的話就只能用apply吧。
a.讀取的文件會(huì)被自動(dòng)轉(zhuǎn)化為dataframe
b.用df=pd.DataFrame()或者df=pd.Series()創(chuàng)建結(jié)構(gòu)的話,要注意index和column的制定(這個(gè)稍微查看下用法就知道了,避免自己忘了)
c.一般將字典轉(zhuǎn)化為DataFrame比較多,因?yàn)椴挥弥贫╟olumns;另外一種就是將多維數(shù)組array或者多維列表list轉(zhuǎn)化為DataFrame,但此時(shí)需要額外制定列名;
基本屬性查看
df.columns/index/dtypes/shape/size/head/tail/describe
series.value_counts()
ps,dtype顯示的類型一般有int/float/bool/時(shí)間類型/object類型以及其他擴(kuò)展類型,所以如果是數(shù)值類型他會(huì)明確顯示(int/float/bool,因?yàn)閜andas是基于numpy開發(fā)的誒),其他的一般會(huì)顯示為object
索引(索引就是index,一般都是指針對(duì)行的哈)
https://www.cnblogs.com/jiaxin359/p/8995133.html
a.常規(guī)索引,弄清楚df[0]和df[0:5]的區(qū)別,df[0]相當(dāng)于df.0,df[0:5]相當(dāng)于df.iloc[0:5]
b.loc索引,以行的名字進(jìn)行索引,不存在切片操作,允許范圍操作,比如df.loc[10:15],會(huì)返回index為10,11,12,13,14的數(shù)據(jù)
c.iloc索引,以行數(shù)進(jìn)行索引,允許切片操作。
ps,經(jīng)常會(huì)用df.set_index進(jìn)行(多重)索引設(shè)置,不過建議用pivot_table來設(shè)置。。。
常規(guī)數(shù)據(jù)清洗(增刪查改)操作
先說大宗旨:axis=1為列操作,最后以行形式展示,axis=0為對(duì)行操作,最后以列形式展示,在pandas中一般會(huì)默認(rèn)為axis=0操作最后展示位列(符合csv表的數(shù)據(jù)處理習(xí)慣)
a.增:
兩種主要思路
直接新增df['new column']=;多表聯(lián)結(jié)的方式
b.刪:
常規(guī)刪除:del df或者df.drop
刪除重復(fù)行:df.drop_duplicates()或者df.drop([df.duplicated],axis=0)
這里的duplicate都是對(duì)行數(shù)據(jù)而言的。(如果要?jiǎng)h除列,用drop可以完成,但如果是刪除重復(fù)列,考慮先轉(zhuǎn)置,再刪除,再還原)
刪除缺失值:df.dropna(),或者先用df.isnull檢測再刪除
c.查
索引方法
d.改
常規(guī)更改:用索引的方法更改列或者行
填充:用df.fillna()填充缺失值(有很多填充方法)
函數(shù)計(jì)算
下面講的是針對(duì)groupby后的函數(shù)計(jì)算,但實(shí)際上很多計(jì)算是可以單獨(dú)使用的哈。
a.groupby的基本使用和基本計(jì)算:
df.groupby(by='A').sum()
b.groupby后的復(fù)雜函數(shù)使用(各種復(fù)雜函數(shù)也是可以單獨(dú)使用的):
https://blog.csdn.net/zwhooo/article/details/79696558
df.groupby().agg(),agg里面接的是內(nèi)置函數(shù)
df.groupby().tansform(),series的單列計(jì)算,允許匿名函數(shù)
df.groupby().apply(),多列計(jì)算,允許匿名函數(shù)
df.groupby().map(),series單個(gè)元素計(jì)算(本質(zhì)就跟內(nèi)置map一樣的),允許匿名函數(shù)
df.groupby().applymap(),多列所有元素計(jì)算,允許匿名函數(shù)
文本處理
這個(gè)其實(shí)是針對(duì)series的,用到的很少,series本身的字符串方法和python內(nèi)置方法也差不多,比如series.str.split和' '.split()是一個(gè)用法。
比較常用的就是join、split、lstrip、rstrip之類的
https://blog.csdn.net/qq_28219759/article/details/52919233
2.2.2 實(shí)際應(yīng)用中常用的函數(shù)
利用pivot_table進(jìn)行透視
透視其實(shí)就是表的重建,利用pivot_table特別方便可以構(gòu)造復(fù)合index和columns(以后要構(gòu)建復(fù)合index和columnes可以優(yōu)先考慮透視方法)
image.png
stack和unstack
看似和pivot_table一樣,其實(shí)還是很不一樣,pivot_table無論怎么透視,都是dataframe,相當(dāng)于改變分組方式;stack是將dataframe完全展開為series。
另外還有一個(gè)series.to_frame()的方法,把series轉(zhuǎn)化為dataframe:
image.png
所以如果要進(jìn)行表的透視,pivot_table是最方便的,但用stack+to_frame的方法也能夠取得類似的效果,就是不夠方便;
如果只是想dataframe變?yōu)閟eries的話,stack就方便多了;
isnull函數(shù)查看有多少空值
df.isnull().sum()
isin函數(shù)
媽呀,竟然還有這個(gè)函數(shù),相當(dāng)于sql的 where xxx in xxx
df.['columns'].isin(xxx)
2.3 numpy(數(shù)據(jù)分析用的很少,可能在數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)才會(huì)多)
創(chuàng)建
a.用list轉(zhuǎn)化:arr=np.array(list)
b.自行創(chuàng)建:arr=np.zeros()。。。x=np.linspace()等等就看你想創(chuàng)建什么形式的。(np.linspace()在畫圖的時(shí)候用的很多,用于生成x軸數(shù)據(jù))
ps:常用隨機(jī)數(shù)創(chuàng)建
image.png
常用屬性和基本方法
a.屬性查看:size/shape/len
b.shape改變方法:鋪平flatten/ravel,reshape,T
ps,看到數(shù)組的鋪平想起list的鋪平,list是沒有內(nèi)置函數(shù)提供直接的鋪平方式的,不過可以用循環(huán)語句依次鋪平,或者就把list轉(zhuǎn)化為array再鋪平
基本數(shù)值運(yùn)算
umm...就那些吧
sum/mean/std/max/min
以及數(shù)組間運(yùn)算,不過現(xiàn)在都還沒遇到
索引
跟dataframe一樣的
2.4 可視化
最基本屬性
a.導(dǎo)入模塊指令:import matplotlib.pyplot as plt
b.在線現(xiàn)實(shí)圖像指令:%matplotlib inline
c.全局性參數(shù)plt.rcParams里面,通常要進(jìn)行設(shè)置的有:
image.png
圖表類型
image.png
畫布屬性控制
分圖:plt.subplot()配合axes坐標(biāo)軸參數(shù)畫圖
標(biāo)題:plt.title()
坐標(biāo)軸范圍:plt.xlim() 和plt.ylim()
坐標(biāo)軸刻度:plt.xticks()和plt.yticks()
注釋:plt.text() 和plt.annotate()(這個(gè)是指向性注釋)
圖像內(nèi)置屬性控制(有的有,有的沒有)
color:c、width寬度、alpha透明度、s面積
pandas api
兩種方法畫圖
a. df.plot.scatter()/bar()/hist()用屬性的方法畫圖
b. df.plot(kind='box')用通用的方法畫圖
seaborn api
import seaborn as sns導(dǎo)入模塊
a.圖像類型:
image.png
b.利用seaborn做簡單回歸分析
image.png
image.png
三、常用排序算法
二分查找
list已經(jīng)完成正序排序,從中間找起+遞歸函數(shù)
線性查找
挨個(gè)找,簡單粗暴
插入排序
挨個(gè)把list中的數(shù)據(jù)排好,新的list數(shù)據(jù),從后往前對(duì)比,每對(duì)比一個(gè),原來的數(shù)據(jù)往后挪一個(gè)。
快速排序
選定基準(zhǔn)值→小于基準(zhǔn)值的放在左邊的list,大于基準(zhǔn)值的放在右邊的list→反復(fù)遞歸
選擇排序
最簡單粗暴的一種,把最小的放在第一位,把次小的放在第二位。。。
冒泡排序
冒泡的本質(zhì)是,小的數(shù)不斷往上冒,最大的數(shù)會(huì)沉在最下面。。。(所以其實(shí)我會(huì)理解為下沉排序)
1號(hào)2號(hào)比較,把更大值放到2號(hào),2號(hào)再與3號(hào)比較。。。第一輪沉完→反復(fù)遞歸完畢
歸并排序
先比較2個(gè),再比較2個(gè),再組合起來比較這4個(gè)→再和另外4個(gè)組合起來比較8個(gè)(另外4個(gè)也要先比較2個(gè)2個(gè))。。。umm。。。
堆排序(二叉樹排序)
原理是:先排一個(gè)無序堆→再從倒數(shù)第二層子節(jié)點(diǎn)開始調(diào)整(把大的往上調(diào)),如果調(diào)整了一個(gè)子節(jié)點(diǎn),要對(duì)下面的非底層子節(jié)點(diǎn)進(jìn)行遞歸判定和調(diào)整→第一輪排完之后父節(jié)點(diǎn)就是最大值,將其放到list最后一位,把底層子節(jié)點(diǎn)的最后一位拿到父節(jié)點(diǎn)來,再進(jìn)行判定
所以理論上有三個(gè)步驟:
a.創(chuàng)建原始堆的函數(shù),這個(gè)不用管嘛,就是list本身的索引位置;
b.從倒數(shù)第二層開始調(diào)整,確定第一個(gè)父節(jié)點(diǎn);
c.可以反復(fù)遞歸的從上而下調(diào)整的函數(shù)heapify(父節(jié)點(diǎn)要調(diào)整的話,還要檢查調(diào)整后的子節(jié)點(diǎn)下面是否還需要調(diào)整)。
b步驟,實(shí)際也可以用heapify函數(shù),只用依次從底層把小堆用heapify調(diào)整好,再對(duì)上一層節(jié)點(diǎn)用heapify,直到到達(dá)頂層為止。
所以關(guān)鍵就在于heapify函數(shù)。。
計(jì)數(shù)排序
犧牲空間換時(shí)間,額外建立兩個(gè)數(shù)組,一個(gè)數(shù)組生成一組固定數(shù)據(jù)(已經(jīng)排序號(hào)),一個(gè)數(shù)組用來記錄原始list在固定數(shù)據(jù)組中出現(xiàn)的次數(shù)(所以肯定會(huì)有些是0),最后再釋放出來
希爾排序
插入排序的改進(jìn)版本,但是不穩(wěn)定,有可能會(huì)比排序算法花費(fèi)時(shí)間更多。
第一次以lenth/2為間隔,對(duì)所有數(shù)據(jù)進(jìn)行分組調(diào)序(一共lenth/2組)→第二次以lenth/4為間隔,對(duì)所有數(shù)據(jù)分組判斷,當(dāng)需要調(diào)序時(shí),需要以lenth/4為間隔往前傳遞直到不再調(diào)序位置(因?yàn)榍胺叫蛄幸呀?jīng)是對(duì)的,所以到某一處不用再調(diào)序,也就不用往前推了)→第三次以lenth/8為間隔。。。→最后以1位間隔依次分組判斷,以及往前傳遞。最后排序完成。 需要注意,每次如果有兩個(gè)數(shù)進(jìn)行了調(diào)序,那么要繼續(xù)往前回推看前面的數(shù)需不需要調(diào)序(就跟堆排序的父節(jié)點(diǎn)發(fā)生改變,要檢查子節(jié)點(diǎn)一樣)
拓?fù)渑判?/p>
暫時(shí)不管了吧,圖排序方法
四、兩個(gè)案例分析
構(gòu)建NaN值的方法
float('NaN')/float('nan'),所以這好像是唯一構(gòu)建Nan值的方法
image.png
五、python和mysql的時(shí)間函數(shù)及字符串函數(shù)比較
5.1 時(shí)間函數(shù)
返回當(dāng)前日期
mysql:select curdate(),current_date();
image.png
python:datetime庫,或者time庫
image.png
返回當(dāng)前時(shí)間
mysql:select curtime,current_time()
image.png
python:同上
時(shí)間增加
mysql:函數(shù)date_add(date,interval int keyword)或者函數(shù)adddate(date,interval int keyword)
image.png
image.png
pthon:函數(shù)timedelta
image.png
時(shí)間減少
mysql:函數(shù)date_sub(date,interval int keyword)或者函數(shù)adddate(date,interval int keyword),int為負(fù)就行
python:函數(shù)timedelta
時(shí)間日期的標(biāo)準(zhǔn)格式化
mysql:select date_formate(date,'%Y-%m-%d %H-%i-%s')
image.png
python:datetime和time模塊都有函數(shù)strftime
image.png
返回日期函數(shù)的年、月、日等
mysql:select year(now()), month(now()), day(now()), hour(now()), minute(now()), quarter(now());
image.png
python:
image.png
5.2 字符串函數(shù)
返回字符串長度
mysql:select lenth()
python:len()
連接字符串
mysql:select concat('a','b')
python:
image.png
替換字符
mysql:INSERT(str,x,y,instr):將字符串str從第x位置開始,y個(gè)字符長的子串替換為字符串instr,返回結(jié)果;REPLACE(str,str1,str2):在字符串str中用str2替換掉str1
image.png
image.png
python:
image.png
顛倒字符串
mysql:select reverse('SQL');
python:
image.png
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的python基础应用_【复习】mysql+python基础应用(20190815)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3000 美元的苹果混合现实头显能否打开
- 下一篇: 微软调整 Win12 升级门槛:处理器和