python字符串解释_Python学习:字符串的简单解释,深入浅出
字符串是python很常見的一種數(shù)據(jù)類型,比如日志的打印,程序中函數(shù)的注釋,數(shù)據(jù)庫的訪問,變量的操作都需要用到字符串。
一、字符串基礎(chǔ)
字符串是由獨立字符組成的一個序列,通常包含在單引號(’’)雙引號("")或者三引號之中(’’’ ‘’'或""" “”",兩者一樣),比如下面幾種寫法。
name = 'jason'
city = 'beijing'
text = "welcome to jike shijian"
Python 中單引號、雙引號和三引號的字符串是一模一樣的,沒有區(qū)別。
s1 = 'hello'
s2 = "hello"
s3 = """hello"""
s1 == s2 == s3
True
Python 同時支持這三種表達(dá)方式,很重要的一個原因就是,這樣方便你在字符串中,內(nèi)嵌帶引號的字符串。
Python 的三引號字符串,則主要應(yīng)用于多行字符串的情境,比如函數(shù)的注釋等等。
同時,Python 也支持轉(zhuǎn)義字符。所謂的轉(zhuǎn)義字符,就是用反斜杠開頭的字符串,來表示一些特定意義的字符。
在轉(zhuǎn)義字符的應(yīng)用中,最常見的就是換行符’\n’的使用。比如文件讀取,如果我們一行行地讀取,那么每一行字符串的末尾,都會包含換行符’\n’。而最后做數(shù)據(jù)處理時,我們往往會丟掉每一行的換行符。
二、字符串的常用操作
可以把字符串想象成一個由單個字符組成的數(shù)組,所以,Python 的字符串同樣支持索引,切片和遍歷等等操作。
name = 'jason'
name[0]
'j'
name[1:3]
'as'
和其他數(shù)據(jù)結(jié)構(gòu),如列表、元組一樣,字符串的索引同樣從 0 開始,index=0 表示第一個元素(字符),[index:index+2] 則表示第 index 個元素到 index+1 個元素組成的子字符串。
遍歷字符串同樣很簡單,相當(dāng)于遍歷字符串中的每個字符。
for char in name:
print(char)
j
a
s
o
n
要注意,Python 的字符串是不可變的(immutable)。因此,用下面的操作,來改變一個字符串內(nèi)部的字符是錯誤的,不允許的。
s = 'hello'
s[0] = 'H'
Traceback (most recent call last):
File "", line 1, in
TypeError: 'str' object does not support item assignment
Python 中字符串的改變,通常只能通過創(chuàng)建新的字符串來完成。比如上述例子中,想把’hello’的第一個字符’h’,改為大寫的’H’,我們可以采用下面的做法:
s = 'H' + s[1:]
s = s.replace('h', 'H')
第一種方法,是直接用大寫的’H’,通過加號’+'操作符,與原字符串切片操作的子字符串拼接而成新的字符串。
第二種方法,是直接掃描原字符串,把小寫的’h’替換成大寫的’H’,得到新的字符串。
在其他語言中,如 Java,有可變的字符串類型,比如 StringBuilder,每次添加、改變或刪除字符(串),無需創(chuàng)建新的字符串,時間復(fù)雜度僅為 O(1)。這樣就大大提高了程序的運行效率。
但可惜的是,Python 中并沒有相關(guān)的數(shù)據(jù)類型,我們還是得老老實實創(chuàng)建新的字符串。因此,每次想要改變字符串,往往需要 O(n) 的時間復(fù)雜度,其中,n 為新字符串的長度。
但也有一個例外,打破了字符串不可變的特性。就是使用加法操作符’+='的字符串拼接方法。
str1 += str2 # 表示 str1 = str1 + str2
看下面的例子的時間復(fù)雜度
s = ''
for n in range(0, 100000):
s += str(n)
每次循環(huán),似乎都得創(chuàng)建一個新的字符串;而每次創(chuàng)建一個新的字符串,都需要 O(n) 的時間復(fù)雜度。因此,總的時間復(fù)雜度就為 O(1) + O(2) + … + O(n) = O(n^2)。
但這只適用于老版本的python,自從 Python2.5 開始,每次處理字符串的拼接操作時(str1 += str2),Python 首先會檢測 str1 還有沒有其他的引用。如果沒有的話,就會嘗試原地擴(kuò)充字符串 buffer 的大小,而不是重新分配一塊內(nèi)存來創(chuàng)建新的字符串并拷貝。這樣的話,上述例子中的時間復(fù)雜度就僅為 O(n) 了。
另外,對于字符串拼接問題,除了使用加法操作符,我們還可以使用字符串內(nèi)置的 join 函數(shù)。string.join(iterable),表示把每個元素都按照指定的格式連接起來。
l = []
for n in range(0, 100000):
l.append(str(n))
l = ' '.join(l)
由于列表的 append 操作是 O(1) 復(fù)雜度,字符串同理。因此,這個含有 for 循環(huán)例子的時間復(fù)雜度為 n*O(1)=O(n)。
字符串的分割函數(shù) split()。string.split(separator),表示把字符串按照 separator 分割成子字符串,并返回一個分割后子字符串組合的列表。它常常應(yīng)用于對數(shù)據(jù)的解析處理,比如我們讀取了某個文件的路徑,想要調(diào)用數(shù)據(jù)庫的 API,去讀取對應(yīng)的數(shù)據(jù),我們通常會寫成下面這樣:
def query_data(namespace, table):
"""
given namespace and table, query database to get corresponding
data
"""
path = 'hive://ads/training_table'
namespace = path.split('//')[1].split('/')[0] # 返回'ads'
table = path.split('//')[1].split('/')[1] # 返回 'training_table'
data = query_data(namespace, table)
此外,常見的函數(shù)還有:
string.strip(str),表示去掉首尾的 str 字符串;
string.lstrip(str),表示只去掉開頭的 str 字符串;
string.rstrip(str),表示只去掉尾部的 str 字符串。
這些在數(shù)據(jù)的解析處理中同樣很常見。比如很多時候,從文件讀進(jìn)來的字符串中,開頭和結(jié)尾都含有空字符,我們需要去掉它們,就可以用 strip() 函數(shù):
s = ' my name is jason '
s.strip()
'my name is jason'
Python 中字符串還有很多常用操作,比如,string.find(sub, start, end),表示從 start 到 end 查找字符串中子字符串 sub 的位置等等。更多的字符串操作自行查閱文檔。
三、字符串格式化
通常,我們使用一個字符串作為模板,模板中會有格式符。這些格式符為后續(xù)真實值預(yù)留位置,以呈現(xiàn)出真實值應(yīng)該呈現(xiàn)的格式。字符串的格式化,通常會用在程序的輸出、logging 等場景。
舉一個常見的例子。比如我們有一個任務(wù),給定一個用戶的 userid,要去數(shù)據(jù)庫中查詢該用戶的一些信息,并返回。而如果數(shù)據(jù)庫中沒有此人的信息,我們通常會記錄下來,這樣有利于往后的日志分析,或者是線上 bug 的調(diào)試等等。
print('no data available for person with id: {}, name: {}'.format(id, name))
其中的
string.format()
,就是所謂的格式化函數(shù);而大括號{}就是所謂的格式符,用來為后面的真實值——變量 name 預(yù)留位置。如果id = ‘123’、name=‘jason’,那么輸出便是:
'no data available for person with id: 123, name: jason'
不過要注意,string.format() 是最新的字符串格式函數(shù)與規(guī)范。自然,我們還有其他的表示方法,比如在 Python 之前版本中,字符串格式化通常用 % 來表示,那么上述的例子,就可以寫成下面這樣:
print('no data available for person with id: %s, name: %s' % (id, name))
當(dāng)然,新的版本提出來
格式化字符串f-string
,亦稱為格式化字符串常量(formatted string literals),是Python3.6新引入的一種字符串格式化方法,主要目的是使格式化字符串的操作更加簡便。f-string在形式上是以 f 或 F 修飾符引領(lǐng)的字符串(f’xxx’ 或 F’xxx’),以大括號 {} 標(biāo)明被替換的字段。
f-string在功能方面不遜于傳統(tǒng)的%-formatting語句和str.format()函數(shù),同時性能又優(yōu)于二者,且使用起來也更加簡潔明了,因此對于Python3.6及以后的版本,推薦使用f-string進(jìn)行字符串格式化。
簡單使用
f-string用大括號 {} 表示被替換字段,其中直接填入替換內(nèi)容:
>>> name = 'Eric'
>>> f'Hello, my name is {name}'
'Hello, my name is Eric'
>>> number = 7
>>> f'My lucky number is {number}'
'My lucky number is 7'
>>> price = 19.99
>>> f'The price of this book is {price}'
'The price of this book is 19.99'
表達(dá)式求值與函數(shù)調(diào)用
f-string的大括號 {} 可以填入表達(dá)式或調(diào)用函數(shù),Python會求出其結(jié)果并填入返回的字符串內(nèi):
>>> f'A total number of {24 * 8 + 4}'
'A total number of 196'
>>> f'Complex number {(2 + 2j) / (2 - 3j)}'
'Complex number (-0.15384615384615388+0.7692307692307692j)'
>>> name = 'ERIC'
>>> f'My name is {name.lower()}'
'My name is eric'
>>> import math
>>> f'The answer is {math.log(math.pi)}'
'The answer is 1.1447298858494002'
引號、大括號與反斜杠
f-string大括號內(nèi)所用的引號不能和大括號外的引號定界符沖突,可根據(jù)情況靈活切換 ’ 和 ":
>>> f'I am {"Eric"}'
'I am Eric'
>>> f'I am {'Eric'}'
File "", line 1
f'I am {'Eric'}'
^
SyntaxError: invalid syntax
lambda表達(dá)式
f-string大括號內(nèi)也可填入lambda表達(dá)式,但lambda表達(dá)式的 : 會被f-string誤認(rèn)為是表達(dá)式與格式描述符之間的分隔符,為避免歧義,需要將lambda表達(dá)式置于括號 () 內(nèi):
>>> f'result is {lambda x: x ** 2 + 1 (2)}'
File "", line 1
(lambda x)
^
SyntaxError: unexpected EOF while parsing
>>> f'result is {(lambda x: x ** 2 + 1) (2)}'
'result is 5'
>>> f'result is {(lambda x: x ** 2 + 1) (2):
'result is +5.00 '
總結(jié)
主要是Python 字符串的一些基本知識和常用操作。
需要注意的是:
Python 中字符串使用單引號、雙引號或三引號表示,三者意義相同,并沒有什么區(qū)別。其中,三引號的字符串通常用在多行字符串的場景。
Python 中字符串是不可變的(前面所講的新版本 Python 中拼接操作’+='是個例外)。因此,隨意改變字符串中字符的值,是不被允許的。
Python 新版本(2.5+)中,字符串的拼接變得比以前高效了許多,你可以放心使用。
Python 中字符串的格式化(string.format)常常用在輸出、日志的記錄等場景。同時還有最新的f-string格式化字符串。
參考:
《Python核心技術(shù)與實踐》
《f-string的使用》
總結(jié)
以上是生活随笔為你收集整理的python字符串解释_Python学习:字符串的简单解释,深入浅出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: MySQL通过两表避免回表_mysql利
 - 下一篇: ajax连mysql数据库_AJAX调用