成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

你真的知道Python的字符串怎么用嗎?

scwang90 / 929人閱讀

摘要:方法可接收兩個(gè)參數(shù),第一個(gè)參數(shù)是分隔符,即用來(lái)分隔字符串的字符,默認(rèn)是所有的空字符,包括空格換行制表符等。拆分過(guò)程會(huì)消耗分隔符,所以拆分結(jié)果中不包含分隔符。

正如《你真的知道Python的字符串是什么嗎?》所寫(xiě),Python 中字符串是由 Uniocde 編碼的字符組成的不可變序列,它具備與其它序列共有的一些操作,例如判斷元素是否存在、拼接序列、切片操作、求長(zhǎng)度、求最值、求元素的索引位置及出現(xiàn)次數(shù)等等。

除此之外,它還有很多特有的操作,值得我們時(shí)常溫故學(xué)習(xí),所以,今天我就跟大家繼續(xù)聊聊字符串。

本文主要介紹 Python 字符串特有的操作方法,比如它的拼接、拆分、替換、查找及字符判斷等使用方法,辨析了一些可能的誤區(qū)。最后,還做了兩個(gè)擴(kuò)展思考:為什么 Python 字符串不具備列表類(lèi)型的某些操作呢,為什么它不具備 Java 字符串的一些操作呢??jī)上啾容^,希望能幫助你透徹地理解——Python 的字符串到底怎么用?

0. 拼接字符串

字符串的拼接操作最常用,我專(zhuān)門(mén)為這個(gè)話題寫(xiě)過(guò)一篇《詳解Python拼接字符串的七種方式》,建議你回看。

在此,簡(jiǎn)單回顧一下:七種拼接方式從實(shí)現(xiàn)原理上劃分為三類(lèi),即格式化類(lèi)(%占位符、format()、template)、拼接類(lèi)(+操作符、類(lèi)元祖方式、join())與插值類(lèi)(f-string),在使用上,我有如下建議——

當(dāng)要處理字符串列表等序列結(jié)構(gòu)時(shí),采用join()方式;拼接長(zhǎng)度不超過(guò)20時(shí),選用+號(hào)操作符方式;長(zhǎng)度超過(guò)20的情況,高版本選用f-string,低版本時(shí)看情況使用format()或join()方式。

不敢說(shuō)字符串就只有這七種拼接方式,但應(yīng)該說(shuō)它們是最常見(jiàn)的了。有小伙伴說(shuō),我寫(xiě)漏了一種,即字符串乘法 ,可以重復(fù)拼接自身。沒(méi)錯(cuò),從結(jié)果上看,這是第八種拼接方式,視為補(bǔ)充吧。

關(guān)于字符串拼接,還得補(bǔ)充一個(gè)建議,即在復(fù)雜場(chǎng)景下,盡量避免使用以上幾類(lèi)原生方法,而應(yīng)該使用外置的強(qiáng)大的處理庫(kù)。比如在拼接 SQL 語(yǔ)句的時(shí)候,經(jīng)常要根據(jù)不同的條件分支,來(lái)組裝不同的查詢(xún)語(yǔ)句,而且還得插入不同的變量值,所以當(dāng)面臨這種復(fù)雜的場(chǎng)景時(shí),傳統(tǒng)拼接方式只會(huì)加劇代碼的復(fù)雜度、降低可讀性和維護(hù)性。使用 SQLAlchemy 模塊,將有效解決這個(gè)問(wèn)題。

1. 拆分字符串

在字符串的幾種拼接方法中,join() 方法可以將列表中的字符串元素,拼接成一個(gè)長(zhǎng)的字符串,與此相反,split() 方法可以將長(zhǎng)字符串拆分成一個(gè)列表。前面已說(shuō)過(guò),字符串是不可變序列,所以字符串拆分過(guò)程是在拷貝的字符串上進(jìn)行,并不會(huì)改變?cè)凶址?/p>

split() 方法可接收兩個(gè)參數(shù),第一個(gè)參數(shù)是分隔符,即用來(lái)分隔字符串的字符,默認(rèn)是所有的空字符,包括空格、換行(n)、制表符(t)等。拆分過(guò)程會(huì)消耗分隔符,所以拆分結(jié)果中不包含分隔符。

s = "Hello world"
l = """Hi there , my name is     Python貓
Do you like me ?
"""

# 不傳參數(shù)時(shí),默認(rèn)分隔符為所有空字符
s.split() >>> ["Hello", "world"]
s.split(" ") >>> ["Hello", "world"]
s.split("  ") >>> ["Hello world"] # 不存在兩個(gè)空格符
s.split("world") >>> ["Hello", ""]

# 空字符包括空格、多個(gè)空格、換行符等
l.split() >>> ["Hi", "there", ",", "my", "name", "is", "Python貓", "Do", "you", "like", "me", "?"]

split() 方法的第二個(gè)參數(shù)是一個(gè)數(shù)字,默認(rèn)是缺省,缺省時(shí)全分隔,也可以用 maxsplit 來(lái)指定拆分次數(shù)。

# 按位置傳參
l.split(" ",3)
>>> ["Hi", "there", ",", "my name is     Python 貓
Do you like me ?
"]

# 指定傳參
l.split(maxsplit=3)
>>> ["Hi", "there", ",", "my name is     Python 貓
Do you like me ?
"]

# 錯(cuò)誤用法
l.split(3)
---------------
TypeError  Traceback (most recent call last)
 in ()
----> 1 l.split(3)
TypeError: must be str or None, not int

split() 方法是從左往右遍歷,與之相對(duì),rsplit() 方法是從右往左遍歷,比較少用,但是會(huì)有奇效。

拆分字符串還有一種方法,即 splitlines() ,這個(gè)方法會(huì)按行拆分字符串,它接收一個(gè)參數(shù) True 或 False ,分別決定換行符是否會(huì)被保留,默認(rèn)值 False ,即不保留換行符。

# 默認(rèn)不保留換行符
"ab c

de fg
kl
".splitlines()
>>> ["ab c", "", "de fg", "kl"]

"ab c

de fg
kl
".splitlines(True)
>>> ["ab c
", "
", "de fg
", "kl
"]
2. 替換字符串

替換字符串包括如下場(chǎng)景:大小寫(xiě)替換、特定符號(hào)替換、自定義片段替換......

再次說(shuō)明,字符串是不可變對(duì)象,以下操作并不會(huì)改變?cè)凶址?/p>

以上這些方法都很明了,使用也簡(jiǎn)單,建議你親自試驗(yàn)一下。這里只說(shuō)說(shuō) strip() 方法,它比較常用,可以去除字符串前后的空格,不僅如此,它還可以刪除首末位置的指定的字符。

s = "******Hello world******"
s.strip("*") >>> "Hello world"
3. 查找字符串

查找字符串中是否包含某些內(nèi)容,這是挺常用的操作。Python 中有多種實(shí)現(xiàn)方式,例如內(nèi)置的 find() 方法,但是這個(gè)方法并不常用,因?yàn)樗鼉H僅告訴你所查找內(nèi)容的索引位置,而在通常情況下,這個(gè)位置并不是我們的目的。

find() 方法與 index() 方法的效果一樣,它們的最大的區(qū)別只在于,找不到內(nèi)容時(shí)的返回值不同,一個(gè)返回 -1,一個(gè)拋出異常 :

s = "Hello world"

s.find("cat") >>>  -1

s.index("cat") 
>>> ValueError  Traceback (most recent call last)
 in ()
----> 1 s.index("cat")

ValueError: substring not found

以上兩個(gè)方法,只能用來(lái)滿足最簡(jiǎn)單的查找需求。在實(shí)戰(zhàn)中,我們常常要查找特定模式的內(nèi)容,例如某種格式的日期字符串,這就得借助更強(qiáng)大的查找工具了。正則表達(dá)式和 re 模塊就是這樣的工具,正則表達(dá)式用來(lái)定制匹配規(guī)則,re 模塊則提供了 match() 、find() 及 findall() 等方法,它們組合起來(lái),可以實(shí)現(xiàn)復(fù)雜的查找功能。限于篇幅,今后再對(duì)這兩大工具做詳細(xì)介紹,這里有一個(gè)簡(jiǎn)單的例子:

import re
datepat = re.compile(r"d+/d+/d+")
text = "Today is 11/21/2018. Tomorrow is 11/22/2018."
datepat.findall(text)
>>> ["11/21/2018", "11/22/2018"]
4. 字符判斷

判斷字符串是否(只)包含某些字符內(nèi)容,這類(lèi)使用場(chǎng)景也很常見(jiàn),例如在網(wǎng)站注冊(cè)時(shí),要求用戶名只能包含英文字母和數(shù)字,那么,當(dāng)校驗(yàn)輸入內(nèi)容時(shí),就需要判斷它是否只包含這些字符。其它常用的判斷操作,詳列如下:

5. 字符串不可以做的事

上文內(nèi)容都是 Python 字符串特有的操作方法,相信讀完之后,你更清楚知道 Python 能夠做什么了。

但是,這還不足以回答本文標(biāo)題的問(wèn)題——你真的知道 Python 的字符串怎么用嗎?這些特有的操作方法,再加上之前文章提到的序列共有的操作、字符串讀寫(xiě)文件、字符串打印、字符串Intern機(jī)制等等內(nèi)容,才差不多能夠回答這個(gè)問(wèn)題。

盡管如此,為了體現(xiàn)嚴(yán)謹(jǐn)性,我試著再聊聊“Python 字符串不可以做的事”,從相反的維度來(lái)補(bǔ)充回答這個(gè)問(wèn)題。下面是開(kāi)拓思維,進(jìn)行頭腦風(fēng)暴的時(shí)刻:

(1)受限的序列

與典型的序列類(lèi)型相比,字符串不具備列表的如下操作:append()、clear()、copy()、insert()、pop()、remove(),等等。這是為什么呢?

有幾個(gè)很好理解,即append()、insert()、pop() 和 remove(),它們都是對(duì)單個(gè)元素的操作,但是,字符串中的單個(gè)元素就是單個(gè)字符,通常沒(méi)有任何意義,我們也不會(huì)頻繁對(duì)其做增刪操作,所以,字符串沒(méi)有這幾個(gè)方法也算合理。

列表的 clear() 方法會(huì)清空列表,用來(lái)節(jié)省內(nèi)存空間,其效果等同于 anylist[:] = [] ,但是,奇怪的是,Python 并不支持清空/刪除操作。

首先,字符串沒(méi)有 clear() 方法,其次,它是不可變對(duì)象,不支持這種賦值操作 anystr[:] = "" ,也不支持 del anystr[:] 操作:

s = "Hello world"

s[:] = ""
>>> 報(bào)錯(cuò):TypeError: "str" object does not support item assignment

del s[:]
>>> 報(bào)錯(cuò):TypeError: "str" object does not support item deletion

當(dāng)然,你也別想通過(guò) del s 來(lái)刪除字符串,因?yàn)樽兞棵?s 只是字符串對(duì)象的引用 (挖坑,以后寫(xiě)寫(xiě)這個(gè)話題),只是一個(gè)標(biāo)簽,刪除標(biāo)簽并不會(huì)直接導(dǎo)致對(duì)象實(shí)體的消亡。

如此看來(lái),想要手動(dòng)清空/刪除 Python 字符串,似乎是無(wú)解。

最后還有一個(gè) copy() 方法,這就是拷貝嘛,可是字符串也沒(méi)有這個(gè)方法。為什么呢?難道拷貝字符串的場(chǎng)景不多么?在這點(diǎn)上,我也沒(méi)想出個(gè)所以然來(lái),擱置疑問(wèn)。

通過(guò)以上幾個(gè)常用列表操作的比較,我們可以看出字符串這種序列是挺受限的。列表可以看成多節(jié)車(chē)廂鏈接成的火車(chē),而字符串感覺(jué)就只像多個(gè)座椅聯(lián)排成的長(zhǎng)車(chē)廂,真是同源不同相啊。

(2)比就比,誰(shuí)怕誰(shuí)

接下來(lái),又到了 Python 字符串與 Java 字符串 PK 的時(shí)刻。在上一篇文章《你真的知道Python的字符串是什么嗎?》中,它們已經(jīng)在對(duì)象定義的角度切磋了兩回合,勝利的天平倒向了 Python,這次看看會(huì)比出個(gè)啥結(jié)果吧。

Java 中有 比較字符串 的方法,即 compareTo() 方法與 equals() 方法,前一個(gè)方法逐一比較兩個(gè)字符串的字符編碼,返回一個(gè)整型的差值,后一個(gè)方法在整體上比較兩個(gè)字符串的內(nèi)容是否相等。

Python 字符串沒(méi)有這兩個(gè)多帶帶的方法,但要實(shí)現(xiàn)類(lèi)似的功能卻很簡(jiǎn)便。 先看例子:

myName = "Python貓"
cmpName = "world"
newName = myName

# 直接用比較符號(hào)進(jìn)行compare
myName > cmpName  
>>> False
myName == newName
>>> True
cmpName != newName
>>> True

# 比較是否同一對(duì)象
myName is cmpName
>>> False
myName is newName
>>> True

上例中,如果把賦值的字符串換成列表或者其它對(duì)象,這些比較操作也是可以進(jìn)行的。也就是說(shuō),作比較的能力 是 Python 公民們的一項(xiàng)基本能力,并不會(huì)因?yàn)槟闶亲址徒o你設(shè)限,或者給你開(kāi)特權(quán)。

與此類(lèi)似,Python 公民們自帶求自身長(zhǎng)度的能力 ,len() 方法是內(nèi)置方法,可以直接傳入任意序列參數(shù),求解長(zhǎng)度。Java 中則要求不同的序列對(duì)象,只能調(diào)用各自的 length() 方法。說(shuō)個(gè)形象的比喻,Python 中共用一把秤,三教九流之輩都能拿它稱(chēng)重,而Java 中有多把秤,你稱(chēng)你的,我稱(chēng)我的,大家“井水不犯河水”。

Python 中曾經(jīng)有 cmp() 方法和 __cmp__() 魔術(shù)方法,但官方嫌棄它們雞肋,所以在Python 3 中移除掉了。雖然在 operator 模塊中還為它留下了一脈香火,但保不定哪天就會(huì)徹底廢棄。

import operator
operator.eq("hello", "name")
>>> False
operator.eq("hello", "hello")
>>> True
operator.gt("hello", "name")
>>> False
operator.lt("hello", "name")
>>> True

(3)墻上的門(mén)

在 Java 中,字符串還有一個(gè)強(qiáng)大的 valueOf() 方法,它可以接收多種類(lèi)型的參數(shù),如boolean、char、char數(shù)組、double、float、int等等,然后返回這些參數(shù)的字符串類(lèi)型。 例如,要把 int 轉(zhuǎn)為字符串,可以用 String.valueOf(anynum) 。

Python 字符串依然沒(méi)有這個(gè)多帶帶的方法,但要實(shí)現(xiàn)相同的功能卻很簡(jiǎn)便。對(duì)Python來(lái)說(shuō),不同的數(shù)據(jù)類(lèi)型轉(zhuǎn)換成字符串,那是小菜一碟,例如:

str(123) >>> "123"
str(True) >>> "True"
str(1.22) >>> "1.22"
str([1,2]) >>> "[1, 2]"
str({"name":"python", "sex":"male"})
>>> "{"name": "python", "sex": "male"}"

而從字符串轉(zhuǎn)換為其它類(lèi)型,也不難,例如,int("123") 即可由字符串"123" 得到數(shù)字 123。對(duì)比 Java,這個(gè)操作要寫(xiě)成 Integer.parseInt("123")

在Java 的不同數(shù)據(jù)類(lèi)型之間,那道分隔之墻矗立得很高,仿佛需要借助一座更高的吊橋才能溝通兩邊,而在靈活的 Python 里,你可以很方便地打開(kāi)墻上的那扇門(mén),來(lái)往穿越。

小結(jié)一下,跟 Java 相比,Python 字符串確實(shí)沒(méi)有幾項(xiàng)方法,但是事出有因,它們的天賦能力可不弱,所有這些操作都能簡(jiǎn)明地實(shí)現(xiàn)。一方面,Python 字符串做不到某些事,但是另一方面,Python 可以出色地做成這些事,孰優(yōu)孰劣,高下立判。

6. 總結(jié)

寫(xiě)文章貴在善始善終,現(xiàn)在給大家總結(jié)一下:本文主要介紹 Python 字符串特有的操作方法,比如它的拼接、拆分、替換、查找及字符判斷等使用方法,從正向回答,Python 字符串能做什么?最后,我們還從反向來(lái)回答了 Python 字符串不能做什么?有些不能做,實(shí)際上是 不為,是為了在其它地方更好地作為,歸根到底,應(yīng)該有的功能,Python 字符串全都有了。

本文中依然將 Python 與 Java 做了比較,有幾項(xiàng)小小的差異,背后反映的其實(shí)是,兩套語(yǔ)言系統(tǒng)在世界觀上的差異。古人云,以銅為鏡,可以正衣冠。那么,在編程語(yǔ)言的世界里,以另一種語(yǔ)言為鏡,也更能看清這種語(yǔ)言的面貌。希望這種跨語(yǔ)言的思維碰撞,能為你擦出智慧的火花。

最后是福利時(shí)刻:本公眾號(hào)(Python貓)由清華大學(xué)出版社贊助,將抽獎(jiǎng)送出兩本新書(shū)《深入淺出Python機(jī)器學(xué)習(xí)》,截止時(shí)間到11月29日18:18,點(diǎn)擊 這個(gè)鏈接,馬上參與吧。

-----------------

本文原創(chuàng)并首發(fā)于微信公眾號(hào)【Python貓】,后臺(tái)回復(fù)“愛(ài)學(xué)習(xí)”,免費(fèi)獲得20+本精選電子書(shū)。

擴(kuò)展閱讀:

《詳解Python拼接字符串的七種方式》

《你真的知道Python的字符串是什么嗎?》

Java字符串比較方法:

https://blog.csdn.net/barryha...

Python3為何取消cmp方法:

https://www.zhihu.com/questio...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72378.html

相關(guān)文章

  • 知道Python符串怎么用嗎?

    摘要:方法可接收兩個(gè)參數(shù),第一個(gè)參數(shù)是分隔符,即用來(lái)分隔字符串的字符,默認(rèn)是所有的空字符,包括空格換行制表符等。拆分過(guò)程會(huì)消耗分隔符,所以拆分結(jié)果中不包含分隔符。 正如《你真的知道Python的字符串是什么嗎?》所寫(xiě),Python 中字符串是由 Uniocde 編碼的字符組成的不可變序列,它具備與其它序列共有的一些操作,例如判斷元素是否存在、拼接序列、切片操作、求長(zhǎng)度、求最值、求元素的索引位...

    jifei 評(píng)論0 收藏0
  • 關(guān)于c++namespace,了解嗎?會(huì)用嗎?

    摘要:據(jù)我了解,很多學(xué)校在學(xué)習(xí)的時(shí)候,老師會(huì)讓學(xué)生死記一條語(yǔ)句,那就是那么你真的了解它嗎命名空間是一個(gè)命名空間。如果我們真的想使用的話,的命名空間遍給了我們解決方法使用命名空間。 據(jù)我了解,很多學(xué)校在學(xué)習(xí)c++的時(shí)候,老師會(huì)讓學(xué)生死記一條語(yǔ)句,那就是 using?namespace?std; 那么...

    Lionad-Morotar 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<