字符串是字符的序列
使用方括號運算符逐一訪問每個字符。方括號裏的表達式稱爲索引。
>>> fruit = 'banana'
>>> letter = fruit[1]
在Python中, 索引是從字符串頭部算起的一個偏移量, 第一個字母的
偏移量爲0。
另一種方法是使用負索引, 從字符串結尾倒過來計算。 表達式fruit[-1]表示最後一個字母, fruit[-2]是倒數第二個字母。
通過循環遍歷字符串
遍歷的一種寫法是使用while循環:
index = 0
while index < len(fruit):
letter = fruit[index]
print letter
index = index + 1
遍歷的另一種寫法是用for循環:
for char in fruit:
print char
字符串分割
字符串的一個片段稱爲切片
>>> s = 'Monty Python'
>>> print s[0:5]
Monty
>>> print s[6:12]
Python
運算符[n:m] 返回字符串從第n到第m之間的字符, 包括第一個字符, 但不包括最後一個字符。
如果忽略第一個索引值(冒號之前), 切片就從字符串第一個字符開始計算。 如果忽略第二個索引值, 切片就計算到最後一個
>>> fruit = 'banana'
>>> fruit[:3]
'ban'
>>> fruit[3:]
'ana'
如果第一個索引值大於第二個索引值導致空字符串, 只會輸出兩個引號:
>>> fruit = 'banana'
>>> fruit[3:3]
"
fruit是一個字符串, 那麼fruit[:]表示:
>>> fruit=""
>>> fruit[:]
''
>>> fruit="ewsr"
>>> fruit[:]
'ewsr'
字符串是不可變的
在賦值語句的左邊使用[]運算符, 嘗試改變字符串中的字符。 舉例如下:
>>> greeting = 'Hello, world!'
>>> greeting[0] = 'J'
TypeError: object does not support item assignment
你不能改變已經存在的字符串。 最好的辦法是在原字符串基礎上新建一個字符串。
>>> greeting = 'Hello, world!'
>>> new_greeting = 'J' + greeting[1:]
>>> print new_greeting
Jello, world!
這個例子將新的首字母與greeting的切片連接在一起。 這不會對原先的字符串造成影響。
循環與統計
下面的程序統計了字母a在字符串中出現的次數:
word = 'banana'
count = 0
for letter in word:
if letter == 'a':
count = count + 1
print count
in運算符
單詞in是一個布爾運算符, 對兩個字符串進行比較, 如果第一個字符串是第二個字符串的子串, 則返回True。
>>> 'a' in 'banana'
True
>>> 'seed' in 'banana'
False
字符串比較
所有的大寫字母都在小寫字母之前
字符串方法
字符串是一種Python對象。 一個對象包括數據( 即字符串本身) 和方法。 這些方法是內置在對象中的有效函數, 可以作用於對象的任一實例。
Python有一個dir函數, 它可以列出對象所有可用的方法。
當dir函數列出這些方法, 你就可以用help獲取關於這些方法的文檔。 有關字符串方法比較全面的文檔詳見
http://docs.python.org/library/string.html。
調用方法與調用函數類似, 但語法不同。 調用方法的語法是, 使用句點作爲分隔, 在變量名後面跟上方法名。
例如, upper方法接收一個字符串, 返回一個全部是大寫字母的新字符串:
這次不使用upper(word)函數, 換做word.upper()方法。
>>> word = 'banana'
>>> new_word = word.upper()
>>> print new_word
BANANA
字符串方法find, 找到字符串中字符的所在位置:
>>> word = 'banana'
>>> index = word.find('a')
>>> print index
1
find方法不僅適用字符, 還可以用於尋找子串:
>>> word.find('na')
2
find方法還可以設置第二個參數, 從哪個索引位置開始查找:
>>> word.find('na', 3)
4
利用strip方法移除字符串首尾的空白( 包括空格、 製表符和換行符) 。
>>> line = ' Here we go '
>>> line.strip()
'Here we go'
startswith方法:返回布爾值。
>>> line = 'Please have a nice day'
>>> line.startswith('Please')
True
>>> line.startswith('p')
startswith方法對大小寫敏感, 在檢查之前, 使用lower方法將其全部轉換爲小寫字母。
>>> line = 'Please have a nice day'
>>> line.startswith('p')
False
>>> line.lower()
'please have a nice day'
>>> line.lower().startswith('p')
True
字符串解析
我們想要在一個字符串中尋找它的子串。 如下是一行結構化的字符串:
From stephen.marquard@ uct.ac.za Sat Jan 5 09:14:16 2008
我們只想抽出電子郵件的第二部分( 即uct.ac.za) , 可以通過find方法和字符串切片來實現。
首先, 在字符串中找到@符號的位置。 其次, 找到@符號之後第一個空格所在的位置。 最後, 再用字符串切片來提取字符串中我們需要的部分。
>>> data = 'From [email protected] Sat Jan 5 09:14:16 2008'
>>> atpos = data.find('@')
>>> print atpos
21
>>> sppos = data.find(' ',atpos)
>>> print sppos
31
>>> host = data[atpos+1:sppos]
>>> print host
uct.ac.za
>>>
這裏使用的是find方法的一種用法, 讓我們能指定find方法從何處開始尋找。
格式操作符%
與C語言中的prinf(“%d”,n)使用方法類似。
格式操作符%可以構建字符串, 使用變量中存儲的數據來替代字符串的一部分。 對整數而言, %是模運算符。 如果第一個操作對象是字符串, 那麼%就是格式操作符。
第一個操作對象是格式字符串, 它包含一個或多個格式化序列, 用來指定第二個操作對象的格式。 最終處理結果是字符串。
>>> camels = 42
>>> 'I have spotted %d camels.' % camels
'I have spotted 42 camels.'
如果字符串中存在多個格式序列, 那麼第二個參數必須是元組。
‘%d’格式化整數, ‘%g’格式化浮點數( 不要問爲什麼) , ‘%s’格式化字符串:
>>> 'In %d years I have spotted %g %s.' % (3, 0.1, 'camels')
調試
針對空字符串出錯問題:
輸入空行之前代碼運行正常。 由於沒有第0位字符, 我們得到了異常信息反饋。 兩種方法可以解決這個問題, 即使這一行爲空, 仍然能保證“安全”運行。
一種方法是使用startswith方法, 如果字符串爲空就返回False。
另一種方法是使用守護模式, 通過一條if語句進行控制, 保證第二個邏輯表達式只有在字符串中至少有一個字符時進行判斷。
if len(line) > 0 and line[0] == '#' :