博客地址:ask.hellobi.com/blog/zhiji 歡迎你們來交流學習。前端
本文偏理論,想到哪裏就寫到哪裏,沒有頭緒-,- 各位看官將就着看。十一小長長長長長長長長假還有一天, 然而, 你不肯再衝進擁擠的人潮, 不肯再涌向苦等的隊伍, 不肯再成爲那個躺在牀上 觀看別人朋友圈的人。 或許, 我能夠將你的焦慮、你的不安、你的無聊, 通通劃掉!而且還將帶給你一大波(python)豪(基)禮(礎), 對,你沒看錯!快來手把手跟我複習Python基礎。python
#1、python是什麼?mysql
#1.python數據結構nginx
Python中常見的數據結構能夠統稱爲容器(container)。序列(如列表和元組)、映射(如字典)以及集合(set)是三類主要的容器。程序員
#2.設計模式 設計模式(Design pattern)表明了最佳的實踐,一般被有經驗的面向對象的軟件開發人員所採用。設計模式是軟件開發人員在軟件開發過程當中面臨的通常問題的解決方案。web
1 . 抽象工廠模式 爲一個產品族提供了統一的建立接口。當須要這個產品族的某一系列的時候,能夠從抽象工廠中選出相應的系列建立一個具體的工廠類。redis
2 . 工廠方法模式 定義一個接口用於建立對象,可是讓子類決定初始化哪一個類。工廠方法把一個類的初始化下放到子類。算法
3 . 生成器模式 將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。sql
4 . 單例模式 確保一個類只有一個實例,並提供對該實例的全局訪問。數據庫
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance 複製代碼
5 . 適配器模式 將某個類的接口轉換成客戶端指望的另外一個接口表示。適配器模式能夠消除因爲接口不匹配所形成的類兼容性問題。
6 . 觀察者模式 在對象間定義一個一對多的聯繫性,由此當一個對象改變了狀態,全部其餘相關的對象會被通知而且自動刷新。
#3.棧和隊列 ###1.什麼是棧 想象一摞被堆起來的書,這就是棧。這堆書的特色是,最後被堆進去的書,永遠在最上面。從這堆書裏面取一本書出來,取哪本書最方便?確定是最上面那本。棧這種數據結構的特色就是如此:後進先出(Last In First Out - LIFO),即最後被堆進去的數據,最早被拿出來。 ###2.棧的Python實現
class Stack(object):
# 初始化棧爲空列表
def __init__(self):
self.items = []
# 判斷棧是否爲空,返回布爾值
def is_empty(self):
return self.items == []
# 返回棧頂元素
def peek(self):
return self.items[len(self.items) - 1]
# 返回棧的大小
def size(self):
return len(self.items)
# 把新的元素堆進棧裏面(程序員喜歡把這個過程叫作壓棧,入棧,進棧……)
def push(self, item):
self.items.append(item)
# 把棧頂元素丟出去(程序員喜歡把這個過程叫作出棧……)
def pop(self, item):
return self.items.pop()
複製代碼
Python裏面實現棧,就是把list包裝成一個類,再添加一些方法做爲棧的基本操做。其餘的數據結構在Python中也是以相似的方式實現的。 ###3.隊列Queue() 隊列是一種列表,不一樣的是隊列只能在隊尾插入元素,在隊首刪除元素。隊列用於存儲按順序排列的數據,先進先出,這點和棧不同,在棧中,最後入棧的元素反而被優先處理。 隊列是一種先進先出(First-In-First-Out,FIFO)的數據結構。隊列被用在不少地方,好比提交操做系統執行的一系列進程、打印任務池等,一些仿真系統用隊列來模擬銀行或雜貨店裏排隊的顧客。 隊列的兩種主要操做是:向隊列中插入新元素和刪除隊列中的元素。插入操做也叫作入隊,刪除操做也叫作出隊。入隊操做在隊尾插入新元素,出隊操做刪除隊頭的元素。
#4.python的垃圾回收機制 經過**「引用計數」(reference counting)來跟蹤和回收垃圾。 在引用計數的基礎上,還能夠經過「標記-清除」(mark and sweep)解決容器對象可能產生的循環引用的問題。 經過「分代回收」(generation collection)**以空間換取時間來進一步提升垃圾回收的效率。
#5.組合和繼承? 組合和繼承咱們傾向於選擇組合,繼承體現的是一種專門化的概念而組合則是一種組裝的概念 #6.python代碼中使用try except的優缺點? 優勢: 正常操做代碼的控制流不會和錯誤處理代碼混在一塊兒. 當某種條件發生時, 它也容許控制流跳過多個框架;集中報錯。
缺點: 可能會致使讓人困惑的控制流. 調用庫時容易錯過錯誤狀況。
#7.SOCKET編程
Socket是進程通信的一種方式,即調用這個網絡庫的一些API函數實現分佈在不一樣主機的相關進程之間的數據交換。 適用場合:socket是位於傳輸層的網絡編程了,通常用於須要本身定義應用層的協議的應用程序。
socket的結構:socket的結構很簡單,只有三個元素,協議,端口號,IP地址。Socket=Ip address+ TCP/UDP + port
TCP和UDP的區別:(TCP)傳輸控制協議,是一種提供可靠數據傳輸的通用協議。(UDP)用戶數據報協議,是一個面向無鏈接的協議。採用該協議不須要兩個應用程序先創建鏈接。UDP協議不提供差錯恢復,不能提供數據重傳,所以該協議傳輸數據安全性差。
#8.樂觀鎖和悲觀鎖?
2.服務器端應當爲一個合法的SYN回送一個SYN/ACK。ACK 的確認碼應爲 A+1,SYN/ACK 包自己又有一個隨機序號 B。
3.最後,客戶端再發送一個ACK。當服務端受到這個ACK的時候,就完成了三路握手,並進入了鏈接建立狀態。此時包序號被設定爲收到的確認號 A+1,而響應則爲 B+1。 #10.四次揮手 TCP的鏈接的拆除須要發送四個包,所以稱爲四次揮手(four-way handshake)。客戶端或服務器都可主動發起揮手動做,在socket編程中,任何一方執行close()操做便可產生揮手操做。
(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送。 (2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1。和SYN同樣,一個FIN將佔用一個序號。 (3)服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A。 (4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1。
#11.HTTP和HTTPS HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。 超文本傳輸協議 (HTTP-Hypertext transfer protocol) 是一種詳細規定了瀏覽器和萬維網服務器之間互相通訊的規則,經過因特網傳送萬維網文檔的數據傳送協議。 HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全。
HTTPS和HTTP的區別主要以下: 一、https協議須要到ca申請證書,通常免費證書較少,於是須要必定費用。 二、http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議。 三、http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。 四、http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
#12.Python2和3一些區別 #####1. __future__
模塊 from __future__ import division
若是你但願在Python 2環境下寫的代碼也能夠在Python 3.x中運行,那麼建議使用__future__
模塊。 #####2.print
函數 Python 2中的print語句被Python 3中的print()
函數取代,這意味着在Python 3中必須用括號將須要輸出的對象括起來。 #####3.整數除法 整型除法返回浮點數,要獲得整型結果,在python3中使用// Python2中: 3 / 2 = 1
Python3中:3 / 2 = 1.5 #####4.Unicode Python 3中,終於有了Unicode(utf-8)字符串,以及兩個字節類:bytes和bytearrays。 #####5.Xrange 在Python 3中,range()的實現方式與xrange()函數相同,因此就不存在專用的xrange()(在Python 3中使用xrange()會觸發NameError)。 #####6.異常處理 Python 3中的異常處理也發生了一點變化。在Python 3中必須使用「as」關鍵字。
try:
.......
except NameError as err:
複製代碼
Python2:
try:
.......
except NameError, err:
複製代碼
#####7.Python 3改進了input()函數,這樣該函數就會老是將用戶的輸入存儲爲str對象。在Python 2中,爲了不讀取非字符串類型會發生的一些危險行爲,不得不使用raw_input()代替input()。 #13.GIL 含義、多線程、多線程、 協程區別 ###進程有哪幾種基本狀態?
一、就緒狀態 當進程已分配到除 CPU 之外的全部必要的資源,只要得到 處理機即可當即執行,這時的進程狀態稱爲就緒狀態。
二、執行狀態 當進程已得到處理機,其程序正在處理機上執行,此時的進程狀態稱爲執行狀態。
三、阻塞狀態 正在執行的進程,因爲等待某個事件發生而沒法執行時,便放棄處理機而處於阻塞狀態。引發進程阻塞的事件可有多種,例如,等待 I/O 完成、申請緩衝區不能知足、等待信件(信號)等。
**注意:**GIL 只存在於CPython 中,其餘 PyPy、IronPython、Jython 沒有這個問題。
進程:進程之間不共享任何狀態,進程的調度由操做系統完成,每一個進程都有本身的獨立的內存空間,進程間的通信主要是經過信號傳遞的方式來實現的,實現的方式有多種,信號量,管道,事件等,任何一種方式的通信效率都須要經過內核,致使通信效率比較低。因爲是獨立的內存空間,上下文切換的時候須要先保存調用棧的信息,CPU 各寄存器的信息,虛擬內存,以及打開的相關句柄等信息,因此致使上下文進程間切換開銷很大,通信麻煩。
線程:線程之間共享變量,解決了通信麻煩的問題,但對變量的訪問須要鎖,線程的調度主要也是有操做系統完成,一個進程能夠擁有多個線程,可是其中每一個線程會共享父進程向操做系統申請資源,這個包括虛擬內存,文件等,因爲是共享資源,因此建立線程所須要的系統資源佔用比進程小不少,相應的可建立的線程數量也變得相對多不少。線程時間的通信除了可使用進程之間通信的方式以外還能夠經過共享內存的方式進行通訊,因此這個速度比經過內核要快不少。另外在調度方面也是因爲內存是共享的,因此上下文切換的時候須要保存的東西就相對少一些,這樣一來上下文切換也變得高效
協程:協程的調度徹底由用戶控制,一個線程能夠有多個協程,用戶建立了幾個協程,而後每一個協程都是循環按照指定的任務清單順序完成不一樣的任務,當任務被堵塞的時候執行下一個任務,當恢復的時候再回來執行這個任務,任務之間的切換隻須要保存每一個任務的上下文內容,就像直接操做棧同樣的,這樣就徹底沒有內核
#14.裝飾器、生成器 、迭代器
#2、數據庫 #1.數據庫升序降序 數據庫 中使用order by語句進行排序,其中升序用asc,降序用desc。 如:
select * from t order by 列a asc; -- 這是升序 asc能夠省略不寫
select * from t order by 列a desc; -- 這是降序
複製代碼
#2.Mysql優化
#3.Mysql 的鏈接查詢有哪些
INNER JOIN(內鏈接,或等值鏈接):取得兩個表中存在鏈接匹配關係的記錄。
LEFT JOIN(左鏈接):取得左表(table1)徹底記錄,便是右表(table2)並沒有對應匹配記錄。
RIGHT JOIN(右鏈接):與 LEFT JOIN 相反,取得右表(table2)徹底記錄,便是左表(table1)並沒有匹配對應記錄。
#4.mysql 經常使用的引擎InnoDB(我用的是InnoDB) **優勢:**InnoDB 支持事務,事務是一種高級的處理方式,如在一些列增刪改中只要哪一個出錯還能夠回滾還原;支持外鍵;
**缺點:**清空整個表時,InnoDB 是一行一行的刪除,效率很是慢。
#5.redis 基本類型 **Redis 支持五種數據類型:**string(字符串)、hash(哈希)、list(列表)、set(集合)及 zset(sorted set:有序集合)。 #6.數據庫的隔離級別 (一)可讀取未確認(Read uncommitted)
寫事務阻止其餘寫事務,避免了更新遺失。可是沒有阻止其餘讀事務。 存在的問題:髒讀。即讀取到不正確的數據,由於另外一個事務可能還沒提交最終數據,這個讀事務就讀取了中途的數據,這個數據多是不正確的。 解決辦法就是下面的「可讀取確認」。
(二)可讀取確認(Read committed)
寫事務會阻止其餘讀寫事務。讀事務不會阻止其餘任何事務。 存在的問題:不可重複讀。即在一次事務之間,進行了兩次讀取,可是結果不同,可能第一次id爲1的人叫「李三」,第二次讀id爲1的人就叫了「李四」。由於讀取操做不會阻止其餘事務。 解決辦法就是下面的「可重複讀」。
(三)可重複讀(Repeatable read)
讀事務會阻止其餘寫事務,可是不會阻止其餘讀事務。 存在的問題:幻讀。可重複讀阻止的寫事務包括update和delete(只給存在的表加上了鎖),可是不包括insert(新行不存在,因此沒有辦法加鎖),因此一個事務第一次讀取可能讀取到了10條記錄,可是第二次可能讀取到11條,這就是幻讀。 解決辦法就是下面的「串行化」。
(四)可串行化(Serializable)
讀加共享鎖,寫加排他鎖。這樣讀取事務能夠併發,可是讀寫,寫寫事務之間都是互斥的,基本上就是一個個執行事務,因此叫串行化。 #7.數據庫的ACID ACID,是指在可靠數據庫管理系統(DBMS)中,事務(transaction)所應該具備的四個特性:/原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
#8.同步異步、阻塞非阻塞
同步和異步關注的是消息通訊機制 (synchronous communication/ asynchronous communication)。
舉個通俗的例子: 你打電話問書店老闆有沒有《分佈式系統》這本書,若是是同步通訊機制,書店老闆會說,「你稍等,我查一下」,而後開始查啊查,等查好了(多是 5 秒,也多是一天)告訴你結果(返回結果)。 而異步通訊機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,而後直接掛電話了(不返回結果)。而後查好了,他會主動打電話給你。在這裏老闆經過「回電」這種方式來回調。
CGI程序是一個獨立的程序,它能夠用幾乎全部語言來寫,包括perl,c,lua,python等等。
WSGI, Web Server Gateway Interface,是Python應用程序或框架和Web服務器之間的一種接口,WSGI的其中一個目的就是讓用戶能夠用統一的語言(Python)編寫先後端。
#2.XSRF和XSS
CSRF重點在請求,XSS重點在腳本
#3.Django 的架構 Django 採用 MVT 的架構模式:M 爲 Model 模型層,是對數據庫的數據的抽象與映射;V 爲 View 視圖層,在此層中進行業務邏輯的處理,包括操做 model和爲模版層提供數據;T 爲 Template 模版層,負責前端頁面的展現。
#4.django 對數據查詢結果排序怎麼作,降序怎麼作,查詢大於某個字段怎麼作。
order_by()
,如 Entry.objects.order_by('blog__name', 'headline')
;Entry.objects.order_by('-pub_date')
;Entry.objects.filter(pubdate__gt='2006-01-01')
#5.Django處理request的流程
Middleware(中間件,包括request, view, exception, response),URLConf(url映射關係),Template(模板系統)
#6.Django 的 queryset 使用 在進行數據查詢時,使用 all()、filter()、exclude()
等會返回 Queryset,在對Queryset 進行過濾鏈式操做的時候返回的仍是 Queryset,咱們能夠對返回的Queryset 進行排序、切片、過濾、去重等操做。
#7.Django 與 Tornado 的對比
Django 是一個大而全的框架,其設計初衷是爲了快速開發,因此提供了豐富的套件供開發使用。其框架的全部業務與其內置的 ORM 緊密相關,還提供了自動化的 Admin 管理後臺。
而 Tornado 不只僅是 Web 框架,其還提供了一個高性能的 Web 服務器,其設計初衷就是爲了解決性能瓶頸問題,目的要打造一個高性能的開發框架。 Tornado 做爲 Web 框架要比 Django 輕量的多,沒有提供豐富的套件,好比沒有ORM、管理後臺、表單系統,甚至沒有 session 機制,可是提供了異步機制、 WebSocket 等 Django 沒有的功能,屬於靈活的輕量級框架。
#8.Torando 的優缺點 Tornado 的優勢是利用 epoll 機制實現了高性能,並以此提供了異步機制,能夠達到異步非阻塞;框架輕量靈活;
其缺點是:Tornado 的運行是單進程的,一旦在處理一個請求時出現了阻塞,將影響總體性能,全部在 Tornado 的開發中要避免阻塞,出現阻塞的地方使用異步,而對於接入的第三方庫或 SDK 每每並無提供對 Tornado 框架的異步支持,因此使用第三方接口時須要咱們重複造輪子,本身封裝針對於 Tornado 異步的接口調用庫。
#9.Tornado 的工做原理
**1.**ioloop 是 tornado 運行的核心
**2.**ioloop 封裝了操做管理 epoll 的工做
**3.**當 ioloop 實例啓動時,ioloop 將服務器監聽的 socket 添加到 epoll 容器中,而後循環等待 epoll 返回可處理的 socket
**4.**當有客戶端發起鏈接後,ioloop 從 epoll 容器中拿到了服務器監聽的 socket,並調用服務器實例處理該監聽 socket 的方法,接收鏈接請求,並將新的與客戶端對應的 socket 添加到 epoll 容器中,而後繼續循環等待 epoll 返回可處理的 socket
**5.**當客戶端發送過來請求數據後,ioloop 從 epoll 中拿到了接收數據的 socket,並調用服務器實例處理該傳輸 socket 的方法,從 socket 中讀取出 http 報文數據,解析後調用 Application 的實例,進行路由分發,實例化具體的 RequestHandler,執行其中的具體 http 方法,生成響應數據並打包成 http 報文寫入到緩衝區中。
**6.**當與客戶端對應的 socket 可寫時,ioloop 從 epoll 中拿到了對應可寫的 socket,將緩衝區中對應的響應報文數據寫入到 socket 中傳回給客戶端,完成請求處理。
**7.**epoll 每次只返回給 ioloop 能夠處理的 socket,而後 ioloop 對拿到的 socket 依次進行處理,有效充分地利用了 cpu 時間,進而達到提高支持高併發的能力。 #10.apache和nginx的區別 nginx 相對 apache 的優勢:
apache 相對nginx 的優勢:
#11.SOAP SOAP(原爲Simple Object Access Protocol的首字母縮寫,即簡單對象訪問協議)是交換數據的一種協議規範,使用在計算機網絡Web服務(web service)中,交換帶結構信息。SOAP爲了簡化網頁服務器(Web Server)從XML數據庫中提取數據時,節省去格式化頁面時間,以及不一樣應用程序之間按照HTTP通訊協議,聽從XML格式執行資料互換,使其抽象於語言實現、平臺和硬件。