python學習總結


關於Python的一些總結

希望自己以后在學習Python的過程中可以邊學習邊總結,就自己之前的學習先做以總結,之后將不斷總結更新。

為什么選擇Python

經常會有同學問我為什么選擇Python。我很喜歡這門語言,因為它的簡潔靈活,易學,易讀,可移植並且功能強大。

高級

可以說,每一代編程語言的產生,我們都會達到一個新的高度。從匯編語言,到C Pascal等,伴隨着C語言的誕生,產生了C++、Java這樣的現代編譯語言,之后有了強大的可以進行系統調用的解釋性腳本語言Python、 Perl...
比如Python中就有一些高級的數據結構,列表和字典就是內建於語言本身可以直接使用的,在核心語言中提供這些重要的構建單元,可以縮短開發時間和代碼量,產生可讀性更好的代碼。

面向對象

Python是面向對象編程

內存管理器

C 或者 C++最大的弊病在於內存管理是由開發者負責的。所以哪怕是對於一個很少訪問、修改和管理內存的應用程序,程序員也必須在執行了基本任務之外履行這些職責。這些加諸在開發者身上的沒有必要的負擔和責任常常會分散精力。
在 Python 中,由於內存管理是由 Python 解釋器負責的,所以開發人員就可以從內存事務中解放出來,全神貫注於最直接的目標,僅僅致力於開發計划中首要的應用程序。這會使錯誤更少、程序更健壯、開發周期更短。

解釋性和編譯性

Python 是一種解釋型語言,這意味着開發過程中沒有了編譯這個環節。一般來說,由於不是以本地機器碼運行,純粹的解釋型語言通常比編譯型語言運行的慢。然而,類似於 Java,Python實際上是字節編譯的,其結果就是可以生成一種近似機器語言的中間形式。這不僅改善了 Python的性能,還同時使它保持了解釋型語言的優點。

Python為什么運行速度相較於C語言慢

因為Python等動態語言每一個簡單的操作都需要大量的指令才能完成。Python是動態語言,變量只是對象的引用,比如對於一個簡單的操作:a+b,在C語言中只需要一個機器指令ADD就好,而對於Python而言,變量a和b本身沒有類型,而它們的值有類型,所以在相加之前需要先判斷類型,之后,讀取數值,相加,生成一個新對象,將運算結果存入,返回對象,當然,可能還會考慮內存溢出等問題。

Python基礎

數據類型

python中的數據類型可以分為:字符串、布爾類型、整數、浮點數、數字、列表、元組、字典和日期。

字符串

不可變對象,可使用單引號,雙引號擴起來表示單行字符串,使用三引號表示多行字符串,在三引號可以自由的使用單引號和雙引號。

ASCII碼

字符串比較特殊的是編碼問題 我們知道,計算機是美國人發明的,最初只有127個字母被編碼到計算機中,包括大小寫字母、數字和一些符號,這個編碼表被稱為ASCII碼表。

Unicode

要處理一個中文顯然一個字節是不夠用的,又不能和ASCII碼沖突,因此中國制定了GB2312編碼。而全世界有很多的語言,在多語言混合的文本中,顯示出來的話一定會有亂碼,因此,Unicode應運而生,它將所有語言統一到一套編碼中,就不會有亂碼問題了。ASCII碼用一個字節表示了一個字符,而Unicode用兩個字節表示一個字符。以Unicode表示的字符串用u'...'表示。

UTF-8

經常在.py文件的開頭寫的"#coding:utf-8”是什么意思?我們知道Unicode編碼要比ASCII編碼多一倍的存儲空間,在存儲和傳輸上會十分的不划算,如果寫的文本全是英文的話,使用Unicode編碼就十分浪費。於是UTF-8編碼出現了,UTF-8編碼是把一個Unicode字符根據不同的數字大小編碼成1-6個字節,並且可以將ASCII碼看成是UTF-8的一部分。

編碼解碼

在Python2.7中,操作系統給它什么編碼的字符串,它就接收啥格式的字符串,默認的格式與使用的格式不同,就會出現各種錯誤。
解決方法:
1.知道系統所使用的編碼格式
2.把獲取的頁面先用系統格式解碼,然后在編碼為utf8格式
3.你的腳本中統一使用uft8編碼
4.處理結束,把你的字符串先utf8解碼,然后系統格式編碼。
Python中,通常使用decode()和encode()進行解碼和編碼。

布爾類型

一個布爾值只有True和Flase兩種值

整數

包括整數和負整數。

浮點數

就是小數 整數和浮點數在計算機內部的存儲是不同的 整數的運算永遠是精確的 而浮點運算可能有四舍五入的誤差 

列表List

list是一個是一個可變的有序表,是Python內置的一種數據類型,可以隨時添加、刪除、替換其中的元素。
Python中的列表就是一個迭代器,我們知道Python是使用C編寫的,那么list的內部實現是怎樣的呢?Python中的列表是基於PyListObject實現的,PyListObject是一個變長對象,在內部通過一些方法維護列表的地址,進行內存管理等實現列表的功能。

元組Tuple

除了元組以外的另一種有序表稱為元組tuple,但是tuple一旦初始化便不能修改,在定義時,tuple的元素就被確定了。為什么要引入tuple呢?因為tuple不可變,所以代碼更為安全,能用tuple代替list的情況就盡量使用tuple。
由於元組是不可變的,因此修改元素操作是非法的,但是可通過對元素進行連接組合,比如:tuple3 = tuple1 + tuple2。
使用del語句可刪除整個元組。

字典Dict

Python內置了字典,使用key-value存儲,具有極快的查找速度。和list相比,查找速度要高很多。
為什么dict查找速度這么快?因為dict的實現原理和查字典是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往后翻,直到找到我們想要的字為止,這種方法就是在list中查找元素的方法,list越大,查找越慢。第二種方法是先在字典的索引表里(比如部首表)查這個字對應的頁碼,然后直接翻到該頁,找到這個字,無論找哪個字,這種查找速度都非常快,不會隨着字典大小的增加而變慢。
dict的初始化如下:

a = {}
a['A'] = 1

Dict和List的區別:Dict的查找速度和插入速度都是極快的,不會隨着key的增加而增加;但dict要占用大量的內存,內存浪費多。
Dict是不可變對象,因為使用key來計算value的存儲位置,為了保證結果的正確性,作為key的對象不能變,可使用字符串、整數等不可變的對象作為dict中的key。

結合Set

set和dict類似,也是一組key的集合,但是不同的是在set中沒有重復的key。

可變和不可變

綜上所述,Python中的不可變對象有:字符串、整數、元組;可變對象有:列表,集合,字典。
對於可變對象,比如list,對list進行操作,list內部的內容是會變化的,而對於不可變對象,比如str,使用replace()方法,雖然可以更改值,但是變量的值並不會發生改變,為什么呢?
比如:

#coding:utf-8

a = 'abc'
b = a.replace('a','A')
print b
print a

a是變量,而'abc'才是字符串對象,為什么a的值在執行完上述代碼之后還是'abc',是因為a本身是一個變量,指向的對象是'abc',調用方法replace是作用在字符串對象'abc'上的,但並沒有改變'abc‘的內容,只是新創建了一個對象並賦值給b變量。
對於不可變對象,調用自身的任意方法,並不會改變對象自身的內容,這些方法會創建新的對象並返回,保證了不可變對象本身是永遠不可變的。

傳值還是傳引用

Python在參數傳遞時遇到的一個有趣的問題是:函數的傳參是傳值還是傳引用?
對於不可變對象作為函數參數,相當於C系語言的值傳遞;
對於可變對象作為函數參數,相當於C系語言的引用傳遞。

高級特性

迭代器

Python中的迭代器是什么呢?
迭代器是訪問集合元素的一種方式,迭代器的對象是從集合的第一個元素開始訪問,直到所有的元素訪問完結束,迭代器只能前進而不能后退。
對於遍歷支持隨機訪問的數據結構(tuple,list),迭代器相比於for循環並無優勢,因為迭代器丟失了索引值。但對於無法隨機訪問的數據結構,迭代器是唯一的訪問元素的方式。
迭代器不要求事先准備好整個迭代過程中的所有元素,迭代器僅在迭代到某個元素時才計算該元素,迭代器僅僅在迭代到某個元素時才計算該元素,在這之前或之后,元素可以不存在或者被銷毀,這個特點使得迭代器特別適合用於遍歷一些巨大的或是無限的集合。
迭代器中有兩個基本的方法:
next方法:返回迭代器的下一個元素
__iter__方法:返回迭代器對象本身。

生成器

帶有yield的函數在Python中被稱為生成器。yield就是將函數變成了一個生成器,函數執行過程中使用yield就好像是用yield將執行中斷多次,每次中斷都會通過yield返回當前的迭代值。
當數據量較大時,使用生成器的效率更高。

裝飾器

函數是一個對象,函數對象也可以被賦值給變量,所以,通過變量也能調用該函數。在代碼運行期間動態增加功能的方式,稱為裝飾器。使用Python的@語法,把裝飾器置於函數的定義處。

元類

類是用來描述如何生成一個對象的代碼段,在Python中,類同樣是一個對象,只要使用class關鍵字,Python解釋器在執行的時候就會創建一個對象。這個對象自身擁有創建對象的能力,所以它是一個類,但它本身還是一個對象,因此,可以實現以下操作:可以將它賦值給一個變量、可以拷貝它、可以為它增加屬性、可以將它作為函數參數進行傳遞。
這也是動態語言和靜態語言最大的不同,函數和類的定義,不是編譯時定義的,而是運行時動態創建的。也就是在Python中,可以動態的創建類,類也是對象,這就是使用關鍵字class時Python在幕后做的事情,這些都是通過元類實現的。
那么到底什么是元類呢?
元類就是用來創建類的東西,創建類就是為了創建類的實例對象,但是我們知道類就是對象,元類就是用來創建這些類(對象)的,所以元類就是類的類。
元類是創建類這種對象的東西,可以將元類稱為類工廠。
元類的主要用途是創建API。

閉包

Python中的閉包是什么?
如果在一個內部函數里,對在外部作用域的變量進行引用,那么內部函數就被認為是閉包。用Python的語言介紹就是,調用一個函數A,這個函數A返回了一個函數B給你,這個返回的函數B就叫做閉包。
裝飾器就是一個閉包。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM