AI 學習之路——輕鬆初探 Python 篇(三)

喜歡小之的文章的能夠關注公衆號「WeaponZhi」持續關注動態 python

這是「AI 學習之路」的第 3 篇,「Python 學習」的第 3 篇設計模式

Python 字符串使用和 C 語言比較相似,但還有一些咱們值得注意的地方須要關注,用這篇文章來幫助你們掌握 Python 的字符串吧!架構

編碼

不論什麼語言,咱們都須要考慮一下這個語言的編碼問題。「ASCII」編碼是咱們最熟悉的編碼,但它只有 127 個字符被編碼到計算機裏面了,顯然,像中日韓這類國家,語言文字比較特殊,就須要本身來指定編碼格式。學習

好比,中國本身就制定了「GB2312」編碼,韓文則是「EUC_KR」,俄語是「KOI8-R」,顯然,若是每個國家都須要製做一個適配的編碼,那咱們的計算機世界就要亂套了,不一樣國家之間信息的傳輸將變的步履維艱。若是電腦裏沒有某個語言的編碼,那就會產生亂碼衝突,這是至關麻煩的。字體

因此,你們商量了一下,就作出了「Unicode」這麼個編碼格式,它乾脆把全部的編碼都統一了,只要你用 Unicode 它就能保證沒有亂碼問題。編碼

但 Unicode 也有缺點。好比若是一個文件是純英文來寫的,那全部的字符實際上均可以用過 ASCII 的 8 位二進制來表示。咱們知道 Unicode 是經過補 0 來表示一些低位數的字符的,這樣,爲了保持兼容性,你實際上白白浪費了兩倍的空間。spa

UTF-8 就是爲了解決這樣一個問題而出現的。它是一個**「可變長編碼」**,你不是嫌空間浪費嗎,那麼如今只要你用了 UTF-8,今後之後英文字母咱就能夠用 1 個字節來存儲了,若是遇到像中文這種「高大上」但又比較複雜的字體,咱們靈活對待,用三個字節來表示,實在有某些更加變態而複雜的字體,那最多能夠拓展到用 6 個字節來存儲。總之,這樣下去,既解決了兼容性問題,又能夠節約資源,資源問題迎刃而解了。設計

Python 中的字符串是用 Unicode 編碼的,因此 Python 能夠支持多語言,當咱們保存的時候,咱們須要把 Unicode 轉換爲 UTF-8,使用的時候,再從文件中轉換 UTF-8 到 Unicode 到內存中。3d

經過編碼的這種演進過程,咱們是否是會有所啓發呢?code

**你會發現,一切技術的產生和發展,都是爲了解決問題而出現的。**你們若是細細的思考一下,不管是語言、技術、設計模式、架構,實際上他們的發展過程並非一個憑空的技術升級行爲,而是爲了解決某種問題而誕生的。

「GB2312」是爲了解決 ASCII 沒有中文而才創造出來的,「Unicode」是由於各國語言不兼容而創造出來的。而 Unicode 對於資源的浪費又促成了 UTF-8 的產生。最典型的問題驅動技術,就是設計模式了,設計模式的產生實際上就是各類爲解決某些特定問題而總結出來的方案。

因此在技術上,遇到問題並不可怕,問題偏偏是最能幫助本身提高的,問題是創造力的源頭之一。咱們同時在平時看書的時候,也要抱着解決問題的角度來學習,若是你單純的去讀一本技術書,這本書又只有理論和代碼,你會以爲很枯燥。若是書裏能夠結合一些案例和問題,從這裏展開講解,而後再介紹一些解決方案和代碼,這種教學方式效果就會特別好。好比我以前看過的一本書「Android 源碼設計模式」,它就是用這種方式來進行展開的說明設計模式的場景,看完了這本書後,之後面對某種場景,我就特別容易回想起以前書中寫過的一些場景,從而產生記憶聯想。

不只如此,若是想的再深一點,你就會忽然醒悟,實際上人類社會好像也是以這種形式來發展的...

是否是有點扯遠了?咱們仍是來看看字符串吧。

字符串

Python 的字符串和 C 語言有些相似。咱們簡單的把經常使用的用法介紹一下便可,平時只要多寫幾回,就能比較熟練的掌握了(此節引用廖雪峯教程示例,做了簡化)。

ord() 和 chr()

使用 ord() 獲取字符的整數表示,chr() 則是把編碼轉化爲字符:

>>> ord('A')
65
>>> ord('中')
20013
>>> chr(66)
'B'
>>> chr(25991)
'文'
複製代碼

bytes

用帶「b」前綴的單引號或者雙引號字符來表示「bytes」類型的數據,很是方便

x = b'ABC'
encode() 和 decode()
複製代碼

開發的時候,常常要把 str 和 bytes 進行相互轉換, str 經過 encode() 轉化爲 bytes,bytes 經過 decode() 轉化爲 str

>>> 'ABC'.encode('ascii')
b'ABC'

>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'

>>> '中文'.encode('ascii')
Trace back (most recent call last):
    File "<stdin>", line 1, in<module>
UnicodeEncodeError


>>> b'ABC'.decode('ascii')
'ABC'

>>> b'\xe4\xb8\xad\xe6\x96\x87'
'中文'

>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Tradeback(most recent call last):
    ...
UnicodeDecodeError
複製代碼

這裏要注意容錯,encode 不能轉化超過參數編碼範圍的字符,而若是 bytes 中包含編碼格式沒法解析的字符,decode() 也會報錯。

len()

經過 len 計算字符串的字符數或者 bytes 的字節數

>>> len('ABC')
3
>>> len('中文')
2
>>> len(b'ABC')
3
>>> len(b'\xe4\xb8\xad\xe6\x87')
6
>>> len('中文'.encode('utf-8'))
6
複製代碼

從輸出結果發現,中文佔 3 個字節,英文佔 1 個字節

聲明編碼格式

若是但願 Python 解釋器能夠按 UTF-8 編碼來讀取 .py 文件,須要在文件中聲明

#1 /usr/bin/env python3
# -*- coding: utf-8 -*-
複製代碼

第一行只對 Linux/OS X 有效,它告訴系統這是一個 Python 可執行程序。第二行則告訴 Python 解釋器,這個文件要按照 UTF-8 編碼。若是不這樣寫,中文輸出會有亂碼。

字符串格式化

格式化和 C 有點像,用「%」實現

>>> 'Hello,%s' % 'world'
'Hello , world'

>>> '你好%s,你有 ¥%d 嗎' % ('小之',50)
'你好小之,你有 ¥50 嗎'
複製代碼

佔位符中,%d 表明整數,%f 表明浮點數,%s 表明字符串,%x 表明十六進制整數,佔位符要和 % 號後面的變量或者值一一對應,若是隻有一個佔位符,% 號後不須要括號。

佔位符還能夠控制空格、小數點和補 0 的位數。好比:

>>> print('%2d-%02d' % (5,1))
  5-01

>>> print('%.2f' % 3.1415)
3.14
複製代碼

注意,「5-01」中,5 的前面是有兩個空格的。

若是你須要使用 % 這個字符顯示在字符串中,那麼就須要轉義了,%% 表示一個 %

>>> '小之公衆號的點贊率居然超過了 %d%%' % 50
'小之公衆號的點贊率居然超過了 50%'
複製代碼

歡迎關注個人公衆號

相關文章
相關標籤/搜索