1. 程式人生 > >讀書筆記:LearningPython第五版 (第七章 字串基礎)

讀書筆記:LearningPython第五版 (第七章 字串基礎)

重點

  1. 對string的多次操作,不如先變成list,再join回去效能更好
  2. 兩種formatting的大致使用: 表示式方式也可以設定keyword,傳字典; format方式可以引用[]和.

Chap7 字串基礎

Python中字串有3種類型:

  1. str:處理unicode
  2. bytes:處理二進位制
  3. bytearray:bytes的mutable版本

7.1 String字面值

表示 含義
S = “”"…multiline…""" Triple-quoted block strings
S = r’\temp\spam’ R aw strings (no escapes)
B = b’sp\xc4m’ Byte strings in 2.6, 2.7, and 3.X (Chapter 4, Chapter 37)
U = u’sp\u00c4m’ Unicode strings in 2.X and 3.3+ (Chapter 4, Chapter 37)

7.1.1 python會自動拼接連續字串

>>> title = "Meaning " 'of' " Life" # Implicit concatenation
>>> title
'Meaning of Life'

7.1.2 轉義字元

Escape Meaning
\ newline Ignored (continuation line)
\ Backslash (stores one )
Single quote (stores ')
" Double quote (stores ")
\a Bell
\b Backspace
\f Formfeed
\n Newline (linefeed)
\r Carriage return
\t Horizontal tab
\v Vertical tab
\xhh Character with hex value hh (exactly 2 digits)
\ooo Character with octal value ooo (up to 3 digits)
\0 Null: binary 0 character (doesn’t end string)
\N{ id } Unicode database ID
\uhhhh Unicode character with 16-bit hex value
\Uhhhhhhhh Unicode character with 32-bit hex valuea
\other Not an escape (keeps both \ and other)
  1. Python內 \0並不會終結字串。事實上,沒有字元會終結字串
  2. 如果Python不認識某個轉義字元,那它會直接輸出\和這個字元

7.1.3 raw string

r的字串是raw string, 會關閉\的轉義含義。但是對於 '"\還是會轉義它。

>>> path = r'C:\new\text.dat'
>>> path # Show as Python code
'C:\\new\\text.dat'

Python在Windows內的路徑解析時,也會理解前slash: C:/new/text.dat

7.2 Strings in Action

>>> ord('s')     # 將字串轉換成Unicode的 code point 數字
115      
>>> chr(115)   # 將Unicode 的 code point數字轉換成 字串
's'
表示式 作用
S1+S2 拼接
S1 *3 重複
S[i] 索引
S[i:j] 切片
len(S) 求長度
“a %s parrot” % kind 格式化
“a {0} parrot”.format(kind) 格式化
S.find(‘pa’) 查詢
S.strip() 去掉空
S.replace(‘old’,‘new’) 替換
S.split(’’) 切割
S.isdigit() 判斷數字
S.lower() 轉換小寫
S.endswith(‘spam’) 判斷結尾
‘spam’.join(strlist) 連線
S.encode(‘latin-1’) 編碼
B.decode(‘utf8’) 解碼
‘spam’ in S 判斷存在

負索引實際上是 加上了長度之和

7.3 String的方法

7.3.1 Method Call

object.method(arguments)

方法呼叫實際上是2個步驟的總和:

  1. 屬性獲取(attributes fetch): object.member獲取 member這個屬性
  2. 呼叫表示式:function(arguments)呼叫了這個function的程式碼,並且傳入引數,接收返回值

Python在執行object.method(arguments)時,會先獲取 object的method方法,然後將objectarguments當作引數傳入。

7.3.2 string 的methods

S.replace(old, new [, count])
S.find(sub [, start [, end]])
S.split([sep [,maxsplit]])
S.join(iterable)

如果需要對很長的String做一系列操作,與其每次都生成一個新的string然後返回,不如先將string轉換成list,再做in-place操作,這樣能提高效能。之後將list再join回來,效能也要比拼接多個字串更好

最早的string方法是使用string模組內的函式呼叫,然後在Python3內已經移除了,但是string模組內還有其他的string工具

7.4 String Formatting Expression

7.4.1 格式

# String formatting expressions: 
'...%s...' % (values)
%[(keyname)][flags][width][.precision]typecode
  • flag: +代表符號; -代表左對齊; 0 代表用0填充前
Code Meaning
s String (or any object’s str(X) string)
r Same as s, but uses repr, not str
c Character (int or str)
d Decimal (base-10 integer)
i Integer
u Same as d (obsolete: no longer unsigned)
o Octal integer (base 8)
x Hex integer (base 16)
X Same as x, but with uppercase letters
e Floating point with exponent, lowercase
E Same as e, but uses uppercase letters
f Floating-point decimal
F Same as f, but uses uppercase letters
g Floating-point e or f
G Floating-point E or F
% Literal % (coded as %%)

7.4.2 使用

a. 給tuple

#注: width和precision都可以寫成*,然後在後面傳入引數
>>> '%f, %.2f, %.*f' % (1/3.0, 1/3.0, 4, 1/3.0)
'0.333333, 0.33, 0.3333'

>>> '%s is a %s'%(name, animal)
>>> 'Jason is a man'

b. 傳字典

>>> '%(qty)d more %(food)s' % {'qty': 1, 'food': 'spam'}
'1 more spam'
# var() 內建函式,能將當前環境存在的變數,以字典的方式返回:
>>> food = 'spam'
>>> qty = 10
>>> vars()
{'food': 'spam', 'qty': 10, ...plus built-in names set by Python... }

>>> '%(qty)d more %(food)s' % vars()

var內建函式

7.5 String Formatting Method Call

Python3出來的,來自.NET{}內可以寫:{1},{name},{}

#String formatting method calls: 
'...{}...'.format(values)

7.5.1 使用

a.混合 {0} {name}

>>> template = '{motto}, {0} and {food}' # By both
>>> template.format('ham', motto='spam', food='eggs')
'spam, ham and eggs'

b. 使用內部的成員

>>> 'My {1[kind]} runs {0.platform}'.format(sys, {'kind': 'laptop'})
'My laptop runs win32'
>>> 'My {map[kind]} runs {sys.platform}'.format(sys=sys, map={'kind': 'laptop'})
'My laptop runs win32'

7.5.2 高階使用

{fieldname component !conversionflag :formatspec}

  • fieldname: 可選的,就是之前的 {0} 或者 {name} 來表示具體引數位置
  • component:就是上面 “.name” or “[index]”來獲取成員
  • conversionflag:以!開頭,後面接r, s or a來呼叫repr, str, ascii 內建函式
  • formatspec:以:開頭,用來表示格式化方式,比如field width, alignment, padding, decimal precision, and so on

format的具體格式: [[fill]align][sign][#][0][width][,][.precision][typecode]

  • fill can be any fill character other than { or };
  • align may be <, >, =, or ^, for left alignment, right alignment, padding after a sign character, or centered alignment, respectively;
  • sign may be +, −, or space;
  • and the , (comma) option requests a comma for a thousands separator as of Python 2.7 and 3.1.
  • width and precision are much as in the % expression, and the formatspec may also contain nested {} format strings with field names only, to take values from the arguments list dynamically
  • typecode:基本和之前的 %d… 一樣,但是多了一個 %b來表示二進位制

其他

  1. 單一物件可以使用內建函式format(object , formatspec)
  2. 自定義物件可以定義__format__

7.6 General Type Categories

Python內三個大型別:

Numbers (integer, floating-point, decimal, fraction, others)
Support addition, multiplication, etc.
Sequences (strings, lists, tuples)
Support indexing, slicing, concatenation, etc.
Mappings (dictionaries)
Support indexing by key, etc

根據是否可變:

Immutables (numbers, strings, tuples, frozensets)
不支援in-place 改變,只能通過操作來建立一個新的物件並返回
Mutables (lists, dictionaries, sets, bytearray)
可以in-place改變,而不需要建立新物件