學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

Python的定位非常明確,它是一種簡單易用但又專業嚴謹的語言。或者說叫膠水語言。普通人也很容易入門。Python可以把各個基本程序拼接在一起協同運作。任何一個人只要願意學習,可以在幾天的時間內學會Python的基礎部分。然後做很多很多事情,這種投入產出比是任何其他語言無法具備的。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

打個比方 我們都知道C語言和C++ Java這種語言比較常用,那麼如果我們以造一輛車做比喻,C是從頭開始造。先造發動機,再造擋風玻璃,車門,雨刮,輪胎。甚至連一顆螺絲釘都是完全為這輛車打造的。最後造出來的是一輛獨一無二的車。這個開發週期可能要一到兩年。

而如果使用Python造一輛車,輪子不用自己造,有很多輪子別人已經幫你寫好了。這些輪子可能是拿C語言寫的。你只需要選一個適合你的。同理,底盤,擋風玻璃等都可以選別人造好的。

這樣造車,週期會非常短。可能只需要一個星期就能跑起來。當然,這輛車肯定相對來說沒有C語言造出來的車要好。畢竟人家是定製的。我這個是拼接的。但是如果不合適我可以把輪子直接換一個。非常靈活。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

如果有人說,Python開發的程序沒有C開發的程序跑得快,執行效率低。我想說的是,很多Python的模塊就是拿C寫的。打個比方,Python做的事情就是指揮這些模塊去做事。是個指揮者的角色。我們做的很多時候都是邏輯。而不是方法。

例如,一個數據來了 交給某個Python模塊,這個模塊是拿C寫的,然後返回給你結果,你再拿到這個結果給另一個模塊處理。很少有純Python的程序。執行效率當然沒有純C寫出來的程序高。但是也差不了多少。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

Python的程序分為

模塊 語句 表達式 和對象

程序由模塊組成

模塊包含語句,條件,循環….等等

語句包含表達式

表達式創建和處理對象。

為什麼使用內置對象呢,內置對象是程序自帶的,本身就支持的東西。比方說數字,字符,列表等等。並且可以基於內建對象創建新對象。

那麼內置對象有哪些呢?下面列出了常用的內置對象。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

大部分都是我們熟悉的。接下來看第一個 數字。這個是我們生活中也會用到的。Python中處理的每個東西都是對象。所以這些很關鍵。

Python的安裝就不去說了。Windows版在官網上的都能找到。MacOS和Linux都能在官網上找到。安裝過程網上都有教程。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

首先每個對象我都會用以下這張表來概述特點。這些特點需要牢記。數字類型的特點如下:

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

類型:就是對象的類型 在內置類型裡列出了常用的類型。現在說明的是數字。

分類:或者說特徵,數字類型的特點就是裡面只能放數值。常見的數值有整數,浮點數和虛數等。

可變:對象一旦定義就是不可變的。比方說定義了A=999 那麼除非重新再賦值A=666 不然是沒辦法改變其中的值的。這個可以跟下面要講的字符串做對比。先這麼記著。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

●1234,-24,0,999999 這些都是整數。

●1.23,1.5666,3.1415926 4E210 這些都是浮點數。

●0o177,0x12a,ob1010101011 這些分別是八進制,十六進制和二進制數。

●3+4j,3.0+4j 這些都是複數

●set(‘test’),{1,2,3,4} 這些是集合

●Decimal(‘1.0’),Fraction(1,3) 小數和分數 右邊那個是1313

●bool(X),True,False 布爾和常量 布爾值就像真,假這種。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

表達式操作符

+(加),-(減),*(乘),/(除),**(乘方),>> 移位

這裡要說明一下移位。移位是指將數字往前或者往後移動一位。例如算IP地址的時候經常會記下面的一串數字

64 32 16 8 4 2 1

那麼例如8往後移動2位應該是2

下面來實際操作一下

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

內建數學函數可以理解為Python自帶的數學函數

例如

pow()乘方,abs()求絕對值,round()四捨五入,int, hex,oct,bin等等

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

之前也有說過Python有很多別人寫好的模塊。這裡直接導入別人寫好的模塊 隨機數模塊random。

然後我們來看看用隨機數模塊如何快速生成隨機數。這個如果有學過C語言應該知道 讓計算機生成隨機數可以調用rand()函數,但是每次生成的序列是一樣的。而且還要有種子值之類的。寫起來還比較麻煩。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

其中用[]框起來的是列表 後面我們會提到。總之python實現排序是如此簡單,別人已經跟你寫好了。你只需要告訴他需要幹嘛就行了。非常好用。不需要了解實現方法。python有很多很多模塊,都是已經寫好了的。你只需要關心 把什麼東西傳進去,把得到的東西再給什麼模塊處理就行了,不需要關心他到底是怎麼找的。這就是python在寫起來很快的原因。當然,前提條件是你要知道有這麼個東西。比方說數學模塊其實有很多東西的。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

前提是你要很懂數學 才能很好的去利用這些工具和模塊。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

字符串的特點如下:

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

字符串應該是用的比較多的。待會兒解釋一下什麼叫序列類型。以及不可變是什麼概念。

字符串是可以單引號,雙引號和三引號框起來。反過來說,用這些符號框起來的就代表裡面的是字符串。先體驗一下吧。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

那麼除了我們常用的英文字母,數字,中文等字符串,還有一些特殊的東西我們要了解。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

我們都知道單引號有特殊的意義 用於把字符串引起來,但是如果我想要輸出正常的單引號又該怎麼辦呢?這個時候就需要使用轉意符號,告訴程序這裡的單引號沒有特殊意義。就是一個普通的字符。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

如果這麼去做會直接報錯。那麼現在在Python和Cisco之間的單引號前面加一個轉意符號\。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

除了上述這種情況,其實很多時候我們會碰到\t \r\n這種特殊符號。這個\t代表一個tab \r代表回車\n代表換行。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

你會發現中間空了一塊出來,這就是製表符(table)的效果。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

\n就是回車。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

\r為換行。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33)的機械打字機,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符。要是在這0.2秒裡面,又有新的字符傳過來,那麼這個字符將丟失。

於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字符。一個叫做“回車”,告訴打字機把打印頭定位在左邊界,不捲動滾筒;另一個叫做“換行”,告訴打字機把滾筒卷一格,不改變水平位置。

這就是“換行”和“回車”的由來。

後來,計算機發明瞭,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認為在每行結尾加兩個字符太浪費了,加一個就可以。於是,就出現了分歧。

回車 \r 本義是光標重新回到本行開頭,r的英文return,控制字符可以寫成CR,即Carriage Return。

換行 \n 本義是光標往下一行(不一定到下一行行首),n的英文newline,控制字符可以寫成LF,即Line Feed。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

\n 10 換行NL

\r 13 回車CR

在不同的操作系統這幾個字符表現不同,比如在WIN系統下,這兩個字符就是表現的本義,在UNIX類系統,換行\n就表現為光標下一行並回到行首,在MAC上,\r就表現為回到本行開頭並往下一行,至於ENTER鍵的定義是與操作系統有關的。通常用的Enter是兩個加起來。

不同操作系統下的含義:

\n: UNIX 系統行末結束符

\r\n: window 系統行末結束符

\r: MAC OS 系統行末結束符

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

如果我們想輸出一個Windows裡的路徑例如

D:\World of Warcraft\test\WoW64.exe

這裡面會有多個斜槓。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

你會發現這邊\test由於出現了\t,程序會認為這是一個製表符。我們也不能保證Windows裡的路徑一定不出現這種特殊的東西。有兩種辦法解決。第一種是在每個斜槓前面加上\轉意,來表示後面的斜槓沒有特殊意義。這樣比較麻煩。另一種辦法就是使用r 原始字符串,代表後面的所有內容均是普通字符串,沒有任何其他意義。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

之前提到了字符串是一種有序的類型,什麼叫有序呢?就是字符串裡的每個字符都有對應的位置。可以通過索引的辦法提取出來。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

計算機數數都是從0開始的。所以Playstation4對應的位置就是:

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

剛才提到了序列,接下來談談可變。字符串的類型是不可變,也就是說你不能更改字符串裡的某一個字的值。要想更改,只能重新整個賦值。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

這邊報錯了 。代表字符串確實是不可變的,後面在講列表的時候這種操作就是可以被執行的。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

python的多態說法非常多。這邊直接拿實際操作舉例吧!

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

上面代碼的意思是 打印- 後面*10代表 -乘10。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

如果是C語言這種 直接拿字符串乘一個數字是肯定會報錯的。但是python這種語言的多態特性就可以做到這種事情。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

只要是序列類型 都可以用For循環進行迭代處理。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

第一次循環會迭代str裡的第一個值C 然後打印出來 回車,第二次會迭代第二個值 i 打印出來 然後回車。以此類推。 每次循環迭代出的內容就會賦值給x。for循環可以對序列類型對象進行迭代。把每次迭代的結果進行輸出。如果輸出的時候不想要自動換行。可以這樣。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

其中end=’’代表每次迭代以空為結束。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

所有的序列類型都可以索引和切片

拿字符串Playstation4來說。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

這是提取String字符串中3號位置的示例。

[3]代表3號位置 這種方式叫索引。

也可以倒過來提取。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

除了索引,我們還可以進行切片:

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

對比上面的位置 我們會發現處於7號位置的’t’並沒有出現。1號位的’l’出現了。

這種切片方式,左邊的叫下邊緣,右邊的叫上邊緣。默認上邊緣是不要的。也就是輸出了不包含上邊緣

其他的切片方式如下:

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

例如我們想把字符串拼一起

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

字符串之間的拼接是沒問題的。

如果再來一個4呢?

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

你會發現報錯 並且提示字符串不能和數字相加。這個時候需要做轉換:

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

str(4)代表將括號裡的內容轉換成字符串。這樣就可以拼接了。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

在輸出字符串的時候我們希望能夠把字符串做格式化,顯示出來乾淨整齊,格式統一。這就是字符串格式表達式的目的。

字符串格式化有兩種方法。第一種是傳統表達式方法,第二種是新方法。來體驗一下。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

String formatting expressions:

‘…%s…’(values)

%左邊是一個格式化的字符串,包含一個或多個嵌套的轉換目標,每個目標用%開始。

%右邊提供一個或者多個對象(多個對象需要放在元組中),這些對象用來替換%左邊的轉換對象

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

能夠看到。整個語句用%分隔開,分成左邊和右邊。左邊是已經格式化了的字符串,右邊是用來替換%d和%s的內容。

其中%d這個地方要替換的是整數

%s代表這個地方要替換的是字符串。

要替換的值放在元組裡,元組在後面會介紹。其實就是用小括號括起來的東西。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

%d—-整數

%s—-字符串

%f—-浮點

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

%[(keyname)][flags][width[.precision]typecode

keyname代表%後面其實還可以放一個字典的鍵值,由於字典還沒有涉及到,這邊先放著;

flags可以指明字符串是左對齊(-)還是右對齊還是用0補齊,默認右對齊。

width代表整體寬度;

如果是小數還可以用,後面跟數字來表示小數點位數 例如.2f表示保留小數點後2位的浮點。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

第一個%d代表直接輸出

第二個%-10d代表左對齊輸出,寬度10

第三個%10d代表右對齊輸出,寬度10

%010d代表右對齊輸出,寬度10,不足的位置用0補齊

得出的結果就如上所示了。

接下來看看關於浮點數的輸出

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

第一個%f啥也不做

第二個%.2f代表保留小數點後2位

第三個%010.3f代表右對齊,長度10位,不夠的用0補齊

第四個%5.2f代表右對齊,保留小數點後2位並且佔5位長度

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

String formatting method calls:’…{}…’.format(values)

剛才講的是傳統的方法。現在來看一下新方法。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

{fieldname component !conversionflag :formatspec}

Filename是指定參數的關鍵字或數字,後面跟可選的’.name’(屬性)或者’[index]’(鍵值)成分引用

conversionflag可以是r,s或者a分別是該值上對repr,str,ascii內置函數的一次調用

formatspec指定如何表示該值,包括寬度,對齊方式,補零,小數點精確度等。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

這是基於位置的方法,意思是0號位置是playstation,1號位置是nintendo,2號位置是microsoft。還有基於名字的。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

這就相當於有Playstation位,Switch位和XboxOne位。

當然 這兩種方法可以混合起來用。

剛才提到了老方法可以控制寬度,小數點位數等。新方法當然也可以。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

跟老方法一樣,:10代表寬度。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

^代表居中。

>代表右對齊

關於小數的操作方法和老方法一樣,就不再贅述了。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

正則表達式較為複雜。我參考了

這裡和這裡來寫。

正則表達式可以用來匹配一些特定的字符串。其實在BGP就有用到正則表達式。BGP的AS-PATH就是使用正則表達式來匹配AS號。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

在Python中想使用正則表達式需要引入re模塊。使用import re來引入。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

最簡單的使用方法就像上面這樣。

re.match代表使用re模塊裡面的match動作,括號中左邊的就是正則表達式,用逗號隔開之後右邊就是要匹配的東西。如果有匹配上,程序就會返回值。這邊能看到確實匹配上了,匹配上的內容是0到12位。如果匹配不上就不會返回任何值。

這邊能匹配上可能會有問題。我匹配的條件是explorer.exe給他匹配的東西是explorereexe。但是還是匹配上了。明明有個點不一樣,為什麼還是能匹配上?這邊就需要了解正則表達式中符號的特殊意義。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

所以難怪上面能匹配上了。點可以匹配除了換行以外的任意字符。

那如果只想匹配explorer.exe怎麼辦?這邊就需要用到轉意符。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

使用方括號[]擴起來一些字符,能夠匹配其中的任意一個字符;用[^]擴起來一些字符,能夠匹配除了其中這些字符之外的任意字符。只能匹配其中的一個或者除開其中的一個,不能是多個。下面看一些例子。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

前面章節中講到的表達式,無論是隻能匹配一種字符的表達式,還是可以匹配多種字符其中任意一個的表達式,都只能匹配一次。如果使用表達式再加上修飾匹配次數的特殊符號,那麼不用重複書寫表達式就可以重複匹配。

使用方法是:”次數修飾”放在”被修飾的表達式”後邊。比如:”[bcd][bcd]” 可以寫成 “[bcd]{2}”。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

可以用上述的表達式匹配IPv4地址。

IPv4的地址每8位都用點來分隔,數字的範圍是0到9則用[0-9]匹配。 出現至少一次,最多三次,就用{1,3}匹配。小數點本身需要有\.來匹配。當然 這樣寫非常長。也不太好看。有沒有簡單方法呢。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

來看兩組例子:

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

第一個例子是將上面的匹配IPv4地址進行了簡化。用括號將[0-9]{1,3}\.擴起來。然後後面跟上{3}代表出現3次。後面再單獨寫[0-9]{1,3} 代表不帶點 在單獨出現一次。這樣一來就能匹配到完整的IPv4地址

後面的則是^aaa,代表字符串必須以aaa開頭。至於後面是什麼不管。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

一看到序列類型,我們就知道,一定可以根據索引提取內容,可以切片。可以改的。字符串我們體會過,根據某個位置去改值 是不行的。但是列表就可以。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

任意對象的有序集合

通過偏移讀取

可變長度,異構以及任意嵌套

屬於可變序列的分類

對象引用數組

什麼叫任意對象?就是說列表裡放字符,數字,甚至再放列表都是可以的。有序就是可以通過索引的方式提取。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

又或者把0號位置的cisco改成大寫的CISCO;

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

如果想要提取列表中的列表,則可以這樣

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

列表也可以直接用+號連接在一起。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

len

使用len()可以提取列表的長度

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

這裡顯示list這個列表有4個元素。分別是CISCO 123 一個列表和 Playstation。計算長度是從1開始算的。

in

也可以用 in 來判斷

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

以及所有序列類型都可以用for循環。這裡不再贅述。

append

我們可以通過append方法來往列表後面追加;

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

insert

插入操作。可以在列表中指定位置去插入。例如上面的list。在1位置插入。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

remove

remove 可以移除列表中的某個元素。只能填具體的值。

學好Python,走遍天下都不怕|說說Python那些你不知道的事兒

字典是映射類型,是通過“鍵”來提取“值”。所以不能通過索引提取值。由於不是序列,所以也不能切片了。


分享到:


相關文章: