華文網

國慶假期過了,月薪上萬的程式師帶你複習一下Python的基礎知識!

十一小長長長長長長長長假還有一天,

然而,

你不願再沖進擁擠的人潮,

不願再湧向苦等的隊伍,

不願再成為那個躺在床上

觀看別人朋友圈的人。

或許,

我可以將你的焦慮、你的不安、你的無聊,

統統劃掉!並且還將帶給你一大波(python)豪(基)禮(礎),

對,你沒看錯!快來手把手跟我複習Python基礎。

在給大家分享之前呢,我介紹一下我弄的一個學習交流群,有什麼不懂的問題,都可以在群裡踴躍發言,需要啥資料隨時在群檔裡面獲取自己想要的資料。這個python群就是:330637182 小編期待大家一起進群交流討論,講實話還是一個非常適合學習的地方的。各種入門資料啊,進階資料啊,

框架資料啊 爬蟲等等,都是有的,風裡雨裡,小編都在群裡等你。

本文偏理論,想到哪裡就寫到哪裡,沒有頭緒-,- 各位看官將就著看。

一、python是什麼?

Python是一種解釋型語言。這就是說,與C語言和C的衍生語言不同,Python代碼在運行之前不需要編譯。其他解釋型語言還包括PHP和Ruby。

Python是動態類型語言,指的是你在聲明變數時,不需要說明變數的類型。你可以直接編寫類似x=111和x="I'm a string"這樣的代碼,程式不會報錯。

Python非常適合物件導向的程式設計(OOP),因為它支援通過組合(composition)與繼承(inheritance)的方式定義類(class)。Python中沒有訪問說明符(access specifier,類似C++中的public和private),這麼設計的依據是“大家都是成年人了”。

在Python語言中,函數是第一類物件(first-class objects)。這指的是它們可以被指定給變數,函數既能返回函數類型,也可以接受函數作為輸入。

類(class)也是第一類物件。

Python代碼編寫快,但是運行速度比編譯語言通常要慢。好在Python允許加入基於C語言編寫的擴展,因此我們能夠優化代碼,消除瓶頸,這點通常是可以實現的。numpy就是一個很好地例子,它的運行速度真的非常快,因為很多算數運算其實並不是通過Python實現的。

Python用途非常廣泛——網路應用,自動化,科學建模,大資料應用,等等。它也常被用作“膠水語言”,説明其他語言和元件改善運行狀況。

Python讓困難的事情變得容易,因此程式師可以專注于演算法和資料結構的設計,而不用處理底層的細節。

1.python資料結構

Python中常見的資料結構可以統稱為容器(container)。序列(如列表和元組)、映射(如字典)以及集合(set)是三類主要的容器。

2.設計模式

設計模式(Design pattern) 代表了最佳的實踐,通常被有經驗的物件導向的軟體發展人員所採用。設計模式是軟體發展人員在軟體發展過程中面臨的一般問題的解決方案。

1 . 抽象工廠模式 為一個產品族提供了統一的創建介面。當需要這個產品族的某一系列的時候,可以從抽象工廠中選出相應的系列創建一個具體的工廠類。

2 . 工廠方法模式 定義一個介面用於創建物件,但是讓子類決定初始化哪個類。工廠方法把一個類的初始化下放到子類。

3 . 生成器模式 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

4 . 單例模式 確保一個類只有一個實例,並提供對該實例的全域訪問。

5 . 適配器模式 將某個類的介面轉換成用戶端期望的另一個介面表示。適配器模式可以消除由於介面不匹配所造成的類相容性問題。

6 . 觀察者模式 在物件間定義一個一對多的聯繫性,由此當一個物件改變了狀態,所有其他相關的物件會被通知並且自動刷新。

3.棧和佇列

1.什麼是棧

想像一摞被堆起來的書,這就是棧。這堆書的特點是,最後被堆進去的書,永遠在最上面。從這堆書裡面取一本書出來,取哪本書最方便?肯定是最上面那本。棧這種資料結構的特點就是如此:後進先出(Last In First Out - LIFO),即最後被堆進去的資料,最先被拿出來。

2.棧的Python實現

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.樂觀鎖和悲觀鎖?

悲觀鎖:假定會發生併發衝突,遮罩一切可能違反資料完整性的操作

樂觀鎖:假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性。

9.三次握手

1.用戶端通過向伺服器端發送一個SYN來創建一個主動打開,作為三路握手的一部分。用戶端把這段連接的序號設定為亂數 A。

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的區別主要如下:

1、https協定需要到ca申請證書,一般免費證書較少,因而需要一定費用。

2、http是超文字傳輸協定,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。

3、http和https使用的是完全不同的連接方式,用的埠也不一樣,前者是80,後者是443。

4、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”關鍵字。

7.Python 3改進了input()函數,這樣該函數就會總是將使用者的輸入存儲為str物件。在Python 2中,為了避免讀取非字串類型會發生的一些危險行為,不得不使用raw_input()代替input()。

13.GIL 含義、多執行緒、多執行緒、 協程區別

進程有哪幾種基本狀態?

1、就緒狀態 當進程已分配到除 CPU 以外的所有必要的資源,只要獲得

處理機便可立即執行,這時的進程狀態稱為就緒狀態。

2、執行狀態 當進程已獲得處理機,其程式正在處理機上執行,此時的進程狀態稱為執行狀態。

3、阻塞狀態 正在執行的進程,由於等待某個事件發生而無法執行時,便放棄處理機而處於阻塞狀態。引起進程阻塞的事件可有多種,例如,等待 I/O 完成、申請緩衝區不能滿足、等待信件(信號)等。

GIL,即全域解譯器鎖(Global Interpreter Lock),是電腦程式設計語言解譯器用於同步執行緒的工具,使得任何時刻僅有一個執行緒在執行。CPython 中用

GIL 來控制執行緒的執行,只有拿到 GIL 的執行緒才能執行。在 CPython 的運行中,有些內部資源不是執行緒安全的,所以需要有一個全域鎖來保護。**這就造成了即使在多核CPU中,多執行緒也只是做著分時切換而已。意義只是每條語句宏觀上併發執行,並不能提升效率,只是併發,而沒有並行。

注意:GIL 只存在於CPython 中,其他 PyPy、IronPython、Jython 沒有這個問題。

進程:進程之間不共用任何狀態,進程的調度由作業系統完成,每個進程都有自己的獨立的記憶體空間,進程間的通訊主要是通過信號傳遞的方式來實現的,實現的方式有多種,信號量,管道,事件等,任何一種方式的通訊效率都需要通過內核,導致通訊效率比較低。由於是獨立的記憶體空間,上下文切換的時候需要先保存調用棧的資訊,CPU 各寄存器的資訊,虛擬記憶體,以及打開的相關控制碼等資訊,所以導致上下文進程間切換開銷很大,通訊麻煩。

執行緒:執行緒之間共用變數,解決了通訊麻煩的問題,但對變數的訪問需要鎖,執行緒的調度主要也是有作業系統完成,一個進程可以擁有多個執行緒,但是其中每個執行緒會共用父進程向作業系統申請資源,這個包括虛擬記憶體,檔等,由於是共用資源,所以創建執行緒所需要的系統資源佔用比進程小很多,相應的可創建的執行緒數量也變得相對多很多。執行緒時間的通訊除了可以使用進程之間通訊的方式之外還可以通過共用記憶體的方式進行通信,所以這個速度比通過內核要快很多。另外在調度方面也是由於記憶體是共用的,所以上下文切換的時候需要保存的東西就相對少一些,這樣一來上下文切換也變得高效

協程:協程的調度完全由用戶控制,一個執行緒可以有多個協程,用戶創建了幾個協程,然後每個協程都是迴圈按照指定的任務清單順序完成不同的任務,當任務被堵塞的時候執行下一個任務,當恢復的時候再回來執行這個任務,任務之間的切換只需要保存每個任務的上下文內容,就像直接操作棧一樣的,這樣就完全沒有內核

14.裝飾器、生成器 、反覆運算器

反覆運算器: 反覆運算器是訪問集合元素的一種方式。反覆運算器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。

特點:

1.訪問者不需要關心反覆運算器內部的結構,僅需通過next()方法不斷去取下一個內容

2.不能隨機訪問集合中的某個值 ,只能從頭到尾依次訪問

3.訪問到一半時不能往回退

4.便於迴圈比較大的資料集合,節省記憶體

生成器: 一個函式呼叫時返回一個反覆運算器,那這個函數就叫做生成器(generator),如果函數中包含yield語法,那這個函數就會變成生成器。

這個yield的主要效果呢,就是可以使函數中斷,並保存中斷狀態,中斷後,代碼可以繼續往下執行,過一段時間還可以再重新調用這個函數,從上次yield的下一句開始執行。

裝飾器: 裝飾器(Decorator)是python中最吸引人的特性,可以讓已有的函數不做任何改動的情況下增加功能。

二、資料庫

1.資料庫昇冪降冪

資料庫 中使用order by語句進行排序,其中昇冪用asc,降冪用desc。

如:

select * from t order by 列a asc; -- 這是昇冪 asc可以省略不寫select * from t order by 列a desc; -- 這是降冪

2.Mysql優化

大部分 MySQL 伺服器都有查詢緩存功能。這是提高性能的最有效的方法之一,這是由資料庫引擎私下處理的。當同一個查詢被多次執行,結果會直接從緩存裡提取,這樣速度就很快。

獲取唯一行時使用 LIMIT 1

有時當你查表時,你已經知道你正在查找的結果只有一行。你可能正在獲取唯一記錄,或者你可能只是查詢是否存在滿足你的 WHERE 子句條件的記錄。

在這種情況下,將 LIMIT 1 添加到查詢準則中可以提高性能。這樣,資料庫引擎將在找到剛剛第一個記錄之後停止掃描記錄,而不是遍歷整個表或索引

避免使用 SELECT *

索引搜索欄位

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.同步非同步、阻塞非阻塞

同步和非同步關注的是消息通信機制 (synchronous communication/ asynchronous communication)。

所謂同步,就是在發出一個 調用 時,在沒有得到結果之前,該 調用 就不返回。

但是一旦調用返回,就得到返回值了。

換句話說,就是由 調用者 主動等待這個 調用 的結果。

而非同步則是相反, 調用 在發出之後,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個非同步程序呼叫發出後,調用者不會立刻得到結果。而是在 調用 發出後, 被調用者通過狀態、通知來通知調用者,或通過回呼函數處理這個調用。

舉個通俗的例子:

你打電話問書店老闆有沒有《分散式系統》這本書,如果是同步通信機制,書店老闆會說,“你稍等,我查一下”,然後開始查啊查,等查好了(可能是 5 秒,也可能是一天)告訴你結果(返回結果)。

而非同步通信機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。然後查好了,他會主動打電話給你。在這裡老闆通過“回電”這種方式來回檔。

阻塞和非阻塞關注的是程式在等待調用結果(消息,返回值)時的狀態.

阻塞調用是指調用結果返回之前,當前執行緒會被掛起。調用執行緒只有在得到結果之後才會返回。

非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前執行緒。

三、Web框架

1.CGI和WSGI

CGI是通用閘道介面,是連接web伺服器和應用程式的介面,使用者通過CGI來獲取動態資料或檔等。

CGI程式是一個獨立的程式,它可以用幾乎所有語言來寫,包括perl,c,lua,python等等。

WSGI, Web Server Gateway Interface,是Python應用程式或框架和Web伺服器之間的一種介面,WSGI的其中一個目的就是讓使用者可以用統一的語言(Python)編寫前後端。

2.XSRF和XSS

CSRF(Cross-site request forgery)跨站請求偽造

XSS(Cross Site Scripting)跨站腳本攻擊

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') ;

查詢欄位大於某個值:使用 filter(欄位名__gt=值),如

Entry.objects.filter(pubdate__gt='2006-01-01')

5.Django處理request的流程

使用者通過流覽器請求一個頁面

請求到達Request Middlewares,中介軟體對request做一些預處理或者直接response請求

URLConf通過urls.py檔和請求的URL找到相應的View

View Middlewares被訪問,它同樣可以對request做一些處理或者直接返回response

調用View中的函數

View中的方法可以選擇性的通過Models訪問底層的資料

所有的Model-to-DB的交互都是通過manager完成的

如果需要,Views可以使用一個特殊的Context

Context被傳給Template用來生成頁面

Template使用Filters和Tags去渲染輸出

輸出被返回到View

HTTPResponse被發送到Response Middlewares

任何Response Middlewares都可以豐富response或者返回一個完全不同的response

Response返回到流覽器,呈現給用戶

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 的優點:

羽量級,同樣起web 服務,比apache 佔用更少的記憶體及資源

抗併發,nginx 處理請求是非同步非阻塞的,支援更多的併發連接,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能

配置簡潔

高度模組化的設計,編寫模組相對簡單

社區活躍

apache 相對nginx 的優點:

rewrite ,比nginx 的rewrite 強大

模組超多,基本想到的都可以找到

少bug ,nginx 的bug 相對較多

超穩定

11.SOAP

SOAP(原為Simple Object Access Protocol的首字母縮寫,即簡單物件訪問協定)是交換資料的一種協定規範,使用在電腦網路Web服務(web service)中,交換帶結構資訊。SOAP為了簡化網頁伺服器(Web Server)從XML資料庫中提取資料時,節省去格式化頁面時間,以及不同應用程式之間按照HTTP通信協定,遵從XML格式執行資料互換,使其抽象於語言實現、平臺和硬體。

謝謝大家閱讀,好文章就要和大家分享,本文轉載簡書,

原文連結

如有侵權,聯繫小編刪除!

4 . 單例模式 確保一個類只有一個實例,並提供對該實例的全域訪問。

5 . 適配器模式 將某個類的介面轉換成用戶端期望的另一個介面表示。適配器模式可以消除由於介面不匹配所造成的類相容性問題。

6 . 觀察者模式 在物件間定義一個一對多的聯繫性,由此當一個物件改變了狀態,所有其他相關的物件會被通知並且自動刷新。

3.棧和佇列

1.什麼是棧

想像一摞被堆起來的書,這就是棧。這堆書的特點是,最後被堆進去的書,永遠在最上面。從這堆書裡面取一本書出來,取哪本書最方便?肯定是最上面那本。棧這種資料結構的特點就是如此:後進先出(Last In First Out - LIFO),即最後被堆進去的資料,最先被拿出來。

2.棧的Python實現

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.樂觀鎖和悲觀鎖?

悲觀鎖:假定會發生併發衝突,遮罩一切可能違反資料完整性的操作

樂觀鎖:假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性。

9.三次握手

1.用戶端通過向伺服器端發送一個SYN來創建一個主動打開,作為三路握手的一部分。用戶端把這段連接的序號設定為亂數 A。

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的區別主要如下:

1、https協定需要到ca申請證書,一般免費證書較少,因而需要一定費用。

2、http是超文字傳輸協定,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。

3、http和https使用的是完全不同的連接方式,用的埠也不一樣,前者是80,後者是443。

4、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”關鍵字。

7.Python 3改進了input()函數,這樣該函數就會總是將使用者的輸入存儲為str物件。在Python 2中,為了避免讀取非字串類型會發生的一些危險行為,不得不使用raw_input()代替input()。

13.GIL 含義、多執行緒、多執行緒、 協程區別

進程有哪幾種基本狀態?

1、就緒狀態 當進程已分配到除 CPU 以外的所有必要的資源,只要獲得

處理機便可立即執行,這時的進程狀態稱為就緒狀態。

2、執行狀態 當進程已獲得處理機,其程式正在處理機上執行,此時的進程狀態稱為執行狀態。

3、阻塞狀態 正在執行的進程,由於等待某個事件發生而無法執行時,便放棄處理機而處於阻塞狀態。引起進程阻塞的事件可有多種,例如,等待 I/O 完成、申請緩衝區不能滿足、等待信件(信號)等。

GIL,即全域解譯器鎖(Global Interpreter Lock),是電腦程式設計語言解譯器用於同步執行緒的工具,使得任何時刻僅有一個執行緒在執行。CPython 中用

GIL 來控制執行緒的執行,只有拿到 GIL 的執行緒才能執行。在 CPython 的運行中,有些內部資源不是執行緒安全的,所以需要有一個全域鎖來保護。**這就造成了即使在多核CPU中,多執行緒也只是做著分時切換而已。意義只是每條語句宏觀上併發執行,並不能提升效率,只是併發,而沒有並行。

注意:GIL 只存在於CPython 中,其他 PyPy、IronPython、Jython 沒有這個問題。

進程:進程之間不共用任何狀態,進程的調度由作業系統完成,每個進程都有自己的獨立的記憶體空間,進程間的通訊主要是通過信號傳遞的方式來實現的,實現的方式有多種,信號量,管道,事件等,任何一種方式的通訊效率都需要通過內核,導致通訊效率比較低。由於是獨立的記憶體空間,上下文切換的時候需要先保存調用棧的資訊,CPU 各寄存器的資訊,虛擬記憶體,以及打開的相關控制碼等資訊,所以導致上下文進程間切換開銷很大,通訊麻煩。

執行緒:執行緒之間共用變數,解決了通訊麻煩的問題,但對變數的訪問需要鎖,執行緒的調度主要也是有作業系統完成,一個進程可以擁有多個執行緒,但是其中每個執行緒會共用父進程向作業系統申請資源,這個包括虛擬記憶體,檔等,由於是共用資源,所以創建執行緒所需要的系統資源佔用比進程小很多,相應的可創建的執行緒數量也變得相對多很多。執行緒時間的通訊除了可以使用進程之間通訊的方式之外還可以通過共用記憶體的方式進行通信,所以這個速度比通過內核要快很多。另外在調度方面也是由於記憶體是共用的,所以上下文切換的時候需要保存的東西就相對少一些,這樣一來上下文切換也變得高效

協程:協程的調度完全由用戶控制,一個執行緒可以有多個協程,用戶創建了幾個協程,然後每個協程都是迴圈按照指定的任務清單順序完成不同的任務,當任務被堵塞的時候執行下一個任務,當恢復的時候再回來執行這個任務,任務之間的切換只需要保存每個任務的上下文內容,就像直接操作棧一樣的,這樣就完全沒有內核

14.裝飾器、生成器 、反覆運算器

反覆運算器: 反覆運算器是訪問集合元素的一種方式。反覆運算器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。

特點:

1.訪問者不需要關心反覆運算器內部的結構,僅需通過next()方法不斷去取下一個內容

2.不能隨機訪問集合中的某個值 ,只能從頭到尾依次訪問

3.訪問到一半時不能往回退

4.便於迴圈比較大的資料集合,節省記憶體

生成器: 一個函式呼叫時返回一個反覆運算器,那這個函數就叫做生成器(generator),如果函數中包含yield語法,那這個函數就會變成生成器。

這個yield的主要效果呢,就是可以使函數中斷,並保存中斷狀態,中斷後,代碼可以繼續往下執行,過一段時間還可以再重新調用這個函數,從上次yield的下一句開始執行。

裝飾器: 裝飾器(Decorator)是python中最吸引人的特性,可以讓已有的函數不做任何改動的情況下增加功能。

二、資料庫

1.資料庫昇冪降冪

資料庫 中使用order by語句進行排序,其中昇冪用asc,降冪用desc。

如:

select * from t order by 列a asc; -- 這是昇冪 asc可以省略不寫select * from t order by 列a desc; -- 這是降冪

2.Mysql優化

大部分 MySQL 伺服器都有查詢緩存功能。這是提高性能的最有效的方法之一,這是由資料庫引擎私下處理的。當同一個查詢被多次執行,結果會直接從緩存裡提取,這樣速度就很快。

獲取唯一行時使用 LIMIT 1

有時當你查表時,你已經知道你正在查找的結果只有一行。你可能正在獲取唯一記錄,或者你可能只是查詢是否存在滿足你的 WHERE 子句條件的記錄。

在這種情況下,將 LIMIT 1 添加到查詢準則中可以提高性能。這樣,資料庫引擎將在找到剛剛第一個記錄之後停止掃描記錄,而不是遍歷整個表或索引

避免使用 SELECT *

索引搜索欄位

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.同步非同步、阻塞非阻塞

同步和非同步關注的是消息通信機制 (synchronous communication/ asynchronous communication)。

所謂同步,就是在發出一個 調用 時,在沒有得到結果之前,該 調用 就不返回。

但是一旦調用返回,就得到返回值了。

換句話說,就是由 調用者 主動等待這個 調用 的結果。

而非同步則是相反, 調用 在發出之後,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個非同步程序呼叫發出後,調用者不會立刻得到結果。而是在 調用 發出後, 被調用者通過狀態、通知來通知調用者,或通過回呼函數處理這個調用。

舉個通俗的例子:

你打電話問書店老闆有沒有《分散式系統》這本書,如果是同步通信機制,書店老闆會說,“你稍等,我查一下”,然後開始查啊查,等查好了(可能是 5 秒,也可能是一天)告訴你結果(返回結果)。

而非同步通信機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。然後查好了,他會主動打電話給你。在這裡老闆通過“回電”這種方式來回檔。

阻塞和非阻塞關注的是程式在等待調用結果(消息,返回值)時的狀態.

阻塞調用是指調用結果返回之前,當前執行緒會被掛起。調用執行緒只有在得到結果之後才會返回。

非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前執行緒。

三、Web框架

1.CGI和WSGI

CGI是通用閘道介面,是連接web伺服器和應用程式的介面,使用者通過CGI來獲取動態資料或檔等。

CGI程式是一個獨立的程式,它可以用幾乎所有語言來寫,包括perl,c,lua,python等等。

WSGI, Web Server Gateway Interface,是Python應用程式或框架和Web伺服器之間的一種介面,WSGI的其中一個目的就是讓使用者可以用統一的語言(Python)編寫前後端。

2.XSRF和XSS

CSRF(Cross-site request forgery)跨站請求偽造

XSS(Cross Site Scripting)跨站腳本攻擊

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') ;

查詢欄位大於某個值:使用 filter(欄位名__gt=值),如

Entry.objects.filter(pubdate__gt='2006-01-01')

5.Django處理request的流程

使用者通過流覽器請求一個頁面

請求到達Request Middlewares,中介軟體對request做一些預處理或者直接response請求

URLConf通過urls.py檔和請求的URL找到相應的View

View Middlewares被訪問,它同樣可以對request做一些處理或者直接返回response

調用View中的函數

View中的方法可以選擇性的通過Models訪問底層的資料

所有的Model-to-DB的交互都是通過manager完成的

如果需要,Views可以使用一個特殊的Context

Context被傳給Template用來生成頁面

Template使用Filters和Tags去渲染輸出

輸出被返回到View

HTTPResponse被發送到Response Middlewares

任何Response Middlewares都可以豐富response或者返回一個完全不同的response

Response返回到流覽器,呈現給用戶

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 的優點:

羽量級,同樣起web 服務,比apache 佔用更少的記憶體及資源

抗併發,nginx 處理請求是非同步非阻塞的,支援更多的併發連接,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能

配置簡潔

高度模組化的設計,編寫模組相對簡單

社區活躍

apache 相對nginx 的優點:

rewrite ,比nginx 的rewrite 強大

模組超多,基本想到的都可以找到

少bug ,nginx 的bug 相對較多

超穩定

11.SOAP

SOAP(原為Simple Object Access Protocol的首字母縮寫,即簡單物件訪問協定)是交換資料的一種協定規範,使用在電腦網路Web服務(web service)中,交換帶結構資訊。SOAP為了簡化網頁伺服器(Web Server)從XML資料庫中提取資料時,節省去格式化頁面時間,以及不同應用程式之間按照HTTP通信協定,遵從XML格式執行資料互換,使其抽象於語言實現、平臺和硬體。

謝謝大家閱讀,好文章就要和大家分享,本文轉載簡書,

原文連結

如有侵權,聯繫小編刪除!