數據結構是經過某種方式組織在一塊兒的數據元素的集合,這些元素能夠是數字或字符。python
如:字典是一種經過名字引用值的數據結構。數據結構
python最基本的數據機構是序列。函數
python包含了6中內建序列:spa
列表、元組、字符串、Unicode字符串、buffer對象、xrange對象操作系統
python中惟一內建的映射類型是字典指針
函數是組織好的、可重複使用的,用來實現單一或相關聯功能的代碼塊。調試
函數的兩種參數:code
形參、實參對象
形參的幾種參數類型:遞歸
必須參數、關鍵字參數、默認參數、可變參數、組合參數
參數的傳遞方式:
按位置傳參(位置傳參)
遞歸函數要理解其定義:
一個函數 在它本身的內部 調用自身 就被稱爲遞歸函數。
函數的調用是經過棧這種數據結構實現的。
在遞歸函數中,每進入一次函數調用,棧就會加一層棧幀,每返回一次就會減一層棧幀。
棧
什麼是棧,它是你的電腦內存的一個特別區域,它用來存儲被每個函數(包括mian()方法)建立的臨時變量。棧是FILO,就是先進後出原則的結構體,它密切的被CPU管理和充分利用。每次函數聲明一個新的變量,它就會被「推」到棧中。而後每次一個function退出時,全部關於這個函數中定義的變量都會被釋放(換句話說就是刪除)。一旦棧中的變量釋放,這塊區域就會變成可用的,提供給其餘棧中的變量。
用棧存儲變量的好處是,內存是被你管理的。你不用手動的建立內存,不用當你不在須要它的時候手動釋放內存。另外,因爲CPU組織棧內存很高效。讀出和寫入棧變量是很快的。
理解棧的關鍵是理解概念,當一個function退出時,全部它的變量都會從棧中彈出,之後都會永遠消失。所以棧中的變量本質是局部的。這和咱們原來理解爲變量做用域或者本地或者全局變量是相關的。在C中,一個公共的bug 是從你程序中的一個function外嘗試訪問一個在棧中的這個function的變量(在該function已經退出後)。
關於棧的另外一個特色咱們應該記住,就是存儲再棧中的變量的大小有限制。而堆上建立變量不用考慮。
總結棧:
a、棧的生長和伸縮就是函數壓入或者推出局部變量。
b、咱們不用本身去管理內存,變量建立和釋放都是自動的。
c、棧中的變量只有在函數建立運行時存在。
堆
堆也是咱們的計算機內存中的一個區域,可是他不是自動管理的。並且也不是被CPU密切的管理着。它是一片更加自由的內存區域(很大)。要想在堆上建立內存,咱們必須使用malloc() 或者calloc(),他們都是C語言編譯的。一旦你在堆上分配內存,當你不在須要的時候你必須用free()去銷燬。若是你不銷燬或者銷燬失敗,你的程序就會有內存泄露。換句話說就是堆內存會一直在,其餘進程沒法使用。咱們將會再調試部分看到,那裏有一個叫作Valgrind的東西,它能夠幫助你發現內存泄露。
不像棧,堆沒有變量大小的限制(除了你電腦的物理限制條件外)。堆內存讀出和寫入都比較慢,由於它必須使用指針圖訪問堆內存。咱們將會下面講解指針。
棧和堆的優缺點
棧:
a、快速訪問。
b、沒有必要明確的建立分類變量,由於它是自動管理的。
c、空間被CPU高效地管理着,內存不會變成碎片。
d、只有局部變量
e、受限於棧大小(取決於操做系統)
f、變量不能調整大小。
堆:
a、變量能夠被全局訪問
b、沒有內存大小限制
c、(相對)訪問比較慢
d、沒有高效地使用空間,隨着塊內存的建立和銷燬,內存可能會變成碎片。
e、你必須管理內存(變量的建立和銷燬你必需要負責)
f、變量大小能夠用realloc( )調整
隊列特色:先進先出、後進後出
堆棧特色:先進後出、後進先出
棧幀也叫過程活動記錄,是編譯器用來實現過程/函數調用的一種數據結構。 從邏輯上講,棧幀就是一個函數執行的環境:函數參數、函數的局部變量、函數執行完後返回到哪裏等等。