讀書筆記:LearningPython第五版 (第七章 字串基礎)
阿新 • • 發佈:2018-12-12
重點
- 對string的多次操作,不如先變成list,再join回去效能更好
- 兩種formatting的大致使用: 表示式方式也可以設定keyword,傳字典; format方式可以引用[]和.
Chap7 字串基礎
Python中字串有3種類型:
str
:處理unicodebytes
:處理二進位制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) |
- Python內
\0
並不會終結字串。事實上,沒有字元會終結字串 - 如果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個步驟的總和:
- 屬性獲取(attributes fetch):
object.member
獲取 member這個屬性 - 呼叫表示式:
function(arguments)
呼叫了這個function的程式碼,並且傳入引數,接收返回值
Python在執行object.method(arguments)
時,會先獲取 object的method方法,然後將object
和arguments
當作引數傳入。
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
來表示二進位制
其他:
- 單一物件可以使用內建函式
format(object , formatspec)
- 自定義物件可以定義
__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改變,而不需要建立新物件