python學習中相關問題整理(補充)

2021-10-02 12:11:00 字數 4389 閱讀 8021

25. 資料庫聯接操作,左連線,右鏈結,全鏈結的操作以及區別(手寫 sql 語句)

left join(左聯接) 返回包括左表中的所有記錄和右表中聯結字段相等的記錄 (通俗點講就是,左邊的表是老大,要顯示全部內容,右邊的表是小弟,只有跟老大相同的東西才顯示出來,不相同的就是null);

right join(右聯接) 返回包括右表中的所有記錄和左表中聯結字段相等的記錄(通俗點講就是,右邊的表是老大,要顯示全部內容,左邊的表是小弟,只有跟老大相同的東西才顯示出來,不相同的就是null;

inner join(等值連線|全連線也叫內連線) 只返回兩個表中聯結字段相等的行(左右兩邊勢均力敵,不相上下。兩邊都不想妥協,所以只有共同的東西才顯示出來);26. 資料庫的三大正規化的理解。

經過研究和對使用中問題的總結,對於設計資料庫提出了一些

規範,這些規範被稱為正規化。

• 第一正規化(

1nf)

:列不可拆分

, 即無重複的域。是指資料庫表的每一列都是不可分割的基本資料項。

符合第一正規化的特點就有:有主關鍵字、主鍵不能為空、主鍵不能重複,

欄位不可以再分。 •

第二正規化(

2nf)

:唯一標識 ,即擁有實體的唯一標識

(eg:

身份證、

id號等

)。指每個表必須有且僅有乙個資料元素為主關鍵字

(primary key),

其他資料元素與主關鍵字一一對應。這種關係為函式依賴。

符合第二正規化的特點就有:滿足第一正規化的前提下,消除部分函式依賴。

• 第三正規化(

3nf)

:引用主鍵

,即每列資料都與主鍵直接相關。

符合第三正規化的特點就有:不存在非主屬性對碼的傳遞性依賴以及部分性依賴 。

三大正規化只是一般設計資料庫的基本理念,可以建立冗餘較小、結構合理的資料庫。如果有特殊情況,當然要特殊對待,資料庫設計最重要的是看需求跟效能,需求》效能》

表結構。所以不能一味的去追求正規化建立資料庫。

27.什麼是sql注入?

sql是運算元據庫資料的結構化查詢語言,網頁的應用資料和後台資料庫中的資料進行互動時會採用sql。而sql注入是將web頁面的原url、表單域或資料報輸入的引數,修改拼接成sql語句,傳遞給web伺服器,進而傳給資料庫伺服器以執行資料庫命令。如web應用程式的開發人員對使用者所輸入的資料或cookie等內容不進行過濾或驗證(即存在注入點)就直接傳輸給資料庫,就可能導致拼接的sql被執行,獲取對資料庫的資訊以及提權,發生sql注入攻擊。

其特點如下:

1)、廣泛性

任何乙個基於sql語言的資料庫都可能被攻擊,很多開發人員在編寫web應用程式時未對從輸入引數、web表單、cookie等接受到的值進行規範性驗證和檢測,通常會出現sql注入漏洞。

2)、隱蔽性

sql注入語句一般都嵌入在普通的http請求中,很難與正常語句區分開,所以當前許多防火牆都無法識別予以警告,而且sql注入變種極多,攻擊者可以調整攻擊的引數,所以使用傳統的方法防禦sql注入效果非常不理想。 

3)、危害大

攻擊者通過sql注入獲取到伺服器的庫名、表名、欄位名,從而獲取到整個伺服器中的資料,對**使用者的資料安全有極大的威脅。攻擊者也可以通過獲取到的資料,得到後台管理員的密碼,然後對網頁頁面進行惡意篡改。這樣不僅對資料庫資訊保安造成嚴重威脅,對整個資料庫系統安全也影響重大。

4)、操作方便

網際網路上有很多sql注入工具,簡單易學,攻擊過程簡單,不需要專業知識也能自如運用。

28. python的底層實現,用到的排序函式(手寫冒泡演算法)

答:共有八種

氣泡排序:

氣泡排序是最常見到的排序演算法,也是大學學習時遇到的第一種排序演算法,它的實現思想是:相鄰的兩個元素進行比較,然後把較大的元素放到後面(正向排序),在一輪比較完後最大的元素就放在了最後乙個位置,因為這一點像魚兒在水中吐的氣泡在上公升的過程中不斷變大,所以得名氣泡排序。在該排序演算法中,要遍歷n-1輪,每一輪都要比較陣列中的元素,所以時間複雜度是

o(n2)。氣泡排序具體實現的**如下:

def bubble_sort(alist):

length = len(alist)

for i in range(length - 1):

# i表示比較多少輪

for j in range(length - i - 1):

# j表示每輪比較的元素的範圍,因為每比較一輪就會排序好乙個元素的位置,

# 所以在下一輪比較的時候就少比較了乙個元素,所以要減去i

if alist[j] > alist[j + 1]:

alist[j], alist[j + 1] = alist[j + 1], alist[j]

9. 解釋一下 python 中的 gil 是什麼

1. gil是什麼:全域性解析器鎖

2. gil的作用:單核的情況下可以實現多工(併發)

3. gil的解決方案:

多程序vs多執行緒:最流行的方法是應用多程序方法,在這個方法中你使用多個程序而不是多個執行緒。每乙個python程序都有自己的python直譯器和記憶體空間,因此gil不會成為問題。

30. gil是單執行緒的,那麼python中多執行緒的實現有什麼用。

程序之間不能共享記憶體,但執行緒之間共享記憶體非常容易。

作業系統在建立程序時,需要為該程序重新分配系統資源,但建立執行緒的代價則小得多。因此,使用多執行緒來實現多工併發執行比使用多程序的效率高。

python 語言內建了多執行緒功能支援,而不是單純地作為底層作業系統的排程方式,從而簡化了 python 的多執行緒程式設計。

31. 對於多執行緒,我是怎麼去使用的,如果要我去設計乙個執行緒池,我該怎麼去設計。

方法一:使用threadpool模組,這是個python的第三方模組,支援python2和python3.

方法二:使用concurrent.futures模組,這個模組是python3中自帶的模組,但是,python2.7以上版本也可以安裝使用

方法3:重寫threadpool或者future的函式;

方法4:自己構建乙個執行緒池

32. python協程實現乙個生產者消費者模型。(手寫**)

def consumer(name):

print('%s開始準備吃包子了' % name)

while true:

baozi = yield

print('[%s]包子來了,被[%s]吃了' % (baozi, name))

def product(name):

print('%s開始做包子了' % name)

c = consumer('張三') # 生成器

c1 = consumer('李四')

c.__next__()

c1.__next__()

****:

執行結果:

老闆開始做包子了

張三開始準備吃包子了

李四開始準備吃包子了

做好了2個包子

[0]包子來了,被[張三]吃了

[0]包子來了,被[李四]吃了

做好了2個包子

[1]包子來了,被[張三]吃了

[1]包子來了,被[李四]吃了

做好了2個包子

[2]包子來了,被[張三]吃了

[2]包子來了,被[李四]吃了

做好了2個包子

[3]包子來了,被[張三]吃了

[3]包子來了,被[李四]吃了

做好了2個包子

[4]包子來了,被[張三]吃了

[4]包子來了,被[李四]吃了

做好了2個包子

[5]包子來了,被[張三]吃了

[5]包子來了,被[李四]吃了

做好了2個包子

[6]包子來了,被[張三]吃了

[6]包子來了,被[李四]吃了

做好了2個包子

[7]包子來了,被[張三]吃了

[7]包子來了,被[李四]吃了

做好了2個包子

[8]包子來了,被[張三]吃了

[8]包子來了,被[李四]吃了

做好了2個包子

[9]包子來了,被[張三]吃了

[9]包子來了,被[李四]吃了

process finished with exit code 0

u center相關學習筆記和問題整理

1.資訊 現error txbuf alloc的錯誤資訊內容。解決方案 可能是之前配置了錯誤的內容,可以恢復預設設定,在ubx cfg中選擇revert to default configuration,應該就可以恢復正常。參考 2.nmea資訊表示的內容 gprmc 推薦定位資訊 gpgga gp...

集合相關問題整理

1.集合的型別為什麼不能指定為基本資料型別?如 listlist new arraylist 答 集合中存放的可都是物件的引用,實際內容都在堆上面或者方法區裡面,但是基本資料型別是在棧上分配空間的,隨時就被收回的。但是通過自動包裝類就可以把基本型別轉為物件型別,存放引用就解決了這個問題。2.集合中存...

opencv相關問題整理(1)

1.如何將mat 轉換成iplimage,或者iplimage轉換成mat?iplimage cvgetimage const cvarr arr,iplimage image header cvmat cvgetmat const cvarr arr,cvmat header,int coi nu...