成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入理解Python字符串的用法

開發(fā) 后端
本文主要介紹 Python 字符串特有的操作方法,比如它的拼接、拆分、替換、查找及字符判斷等使用方法,辨析了一些可能的誤區(qū)。

[[251119]]

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

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

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

0. 拼接字符串

字符串的拼接操作最常用,我專門為這個(gè)話題寫過一篇《Python拼接字符串的七種方式》,建議你回看。

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

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

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

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

1. 拆分字符串

在字符串的幾種拼接方法中,join() 方法可以將列表中的字符串元素,拼接成一個(gè)長的字符串,與此相反,split() 方法可以將長字符串拆分成一個(gè)列表。前面已說過,字符串是不可變序列,所以字符串拆分過程是在拷貝的字符串上進(jìn)行,并不會改變原有字符串。

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

  1. s = 'Hello world'  
  2. l = '''Hi there , my name is     Python貓  
  3. Do you like me ?  
  4. '''  
  5. # 不傳參數(shù)時(shí),默認(rèn)分隔符為所有空字符  
  6. s.split() >>> ['Hello', 'world']  
  7. s.split(' ') >>> ['Hello', 'world']  
  8. s.split('  ') >>> ['Hello world'] # 不存在兩個(gè)空格符  
  9. s.split('world') >>> ['Hello', '']  
  10. # 空字符包括空格、多個(gè)空格、換行符等  
  11. l.split() >>> ['Hi', 'there', ',', 'my', 'name', 'is', 'Python貓', 'Do', 'you', 'like', 'me', '?'] 

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

  1. # 按位置傳參  
  2. l.split(' ',3)  
  3. >>> ['Hi', 'there', ',', 'my name is     Python 貓  
  4. Do you like me ?  
  5. ']  
  6. # 指定傳參  
  7. l.split(maxsplit=3 
  8. >>> ['Hi', 'there', ',', 'my name is     Python 貓  
  9. Do you like me ?  
  10. ']  
  11. # 錯(cuò)誤用法  
  12. l.split(3)  
  13. ---------------  
  14. TypeError  Traceback (most recent call last)  
  15. <ipython-input-42-6c16d1a50bca> in <module>()  
  16. ----> 1 l.split(3)  
  17. TypeError: must be str or None, not int 

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

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

  1. # 默認(rèn)不保留換行符  
  2. 'ab c  
  3. de fg  
  4. kl  
  5. '.splitlines()  
  6. >>> ['ab c', '', 'de fg', 'kl']  
  7. 'ab c  
  8. de fg  
  9. kl  
  10. '.splitlines(True)  
  11. >>> ['ab c  
  12. ', '  
  13. ', 'de fg  
  14. ', 'kl  
  15. '] 

2. 替換字符串

替換字符串包括如下場景:大小寫替換、特定符號替換、自定義片段替換……

再次說明,字符串是不可變對象,以下操作并不會改變原有字符串。

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

  1. s = '******Hello world******'  
  2. 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è)拋出異常 : 

  1. s = 'Hello world'  
  2. s.find('cat') >>>  -1  
  3. s.index('cat')   
  4. >>> ValueError  Traceback (most recent call last)  
  5. <ipython-input-55-442007c50b6f> in <module>()  
  6. ----> 1 s.index('cat')  
  7. ValueError: substring not found 

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

  1. import re  
  2. datepat = re.compile(r'd+/d+/d+')  
  3. text = 'Today is 11/21/2018. Tomorrow is 11/22/2018.'  
  4. datepat.findall(text)  
  5. >>> ['11/21/2018', '11/22/2018'] 

4. 字符判斷

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

5. 字符串不可以做的事

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

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

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

(1)受限的序列

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

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

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

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

  1. s = 'Hello world'  
  2. s[:] = ''  
  3. >>> 報(bào)錯(cuò):TypeError: 'str' object does not support item assignment  
  4. del s[:]  
  5. >>> 報(bào)錯(cuò):TypeError: 'str' object does not support item deletion 

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

如此看來,想要手動清空/刪除 Python 字符串,似乎是無解。

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

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

(2)比就比,誰怕誰

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

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

Python 字符串沒有這兩個(gè)單獨(dú)的方法,但要實(shí)現(xiàn)類似的功能卻很簡便。 先看例子: 

  1. myName = "Python貓"  
  2. cmpName = "world"  
  3. newName = myName  
  4. # 直接用比較符號進(jìn)行compare  
  5. myName > cmpName    
  6. >>> False  
  7. myName == newName  
  8. >>> True  
  9. cmpName != newName  
  10. >>> True  
  11. # 比較是否同一對象  
  12. myName is cmpName  
  13. >>> False  
  14. myName is newName  
  15. >>> True 

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

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

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

  1. import operator  
  2. operator.eq('hello', 'name')  
  3. >>> False  
  4. operator.eq('hello', 'hello')  
  5. >>> True  
  6. operator.gt('hello', 'name')  
  7. >>> False  
  8. operator.lt('hello', 'name')  
  9. >>> True 

(3)墻上的門

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

Python 字符串依然沒有這個(gè)單獨(dú)的方法,但要實(shí)現(xiàn)相同的功能卻很簡便。對Python來說,不同的數(shù)據(jù)類型轉(zhuǎn)換成字符串,那是小菜一碟,例如: 

  1. str(123) >>> '123'  
  2. str(True) >>> 'True'  
  3. str(1.22) >>> '1.22'  
  4. str([1,2]) >>> '[1, 2]'  
  5. str({'name':'python', 'sex':'male'})  
  6. >>> "{'name': 'python', 'sex': 'male'}" 

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

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

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

6. 總結(jié)

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

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

責(zé)任編輯:龐桂玉 來源: Python中文社區(qū)
相關(guān)推薦

2009-11-18 12:38:04

PHP字符串函數(shù)

2024-03-04 15:05:37

2023-03-28 09:56:47

TypeScripJavaScrip

2018-01-22 17:02:48

Python字符編碼ASCII

2010-06-01 15:25:27

JavaCLASSPATH

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2020-07-21 08:26:08

SpringSecurity過濾器

2012-11-22 10:11:16

LispLisp教程

2020-09-23 10:00:26

Redis數(shù)據(jù)庫命令

2019-06-25 10:32:19

UDP編程通信

2017-01-10 08:48:21

2024-02-21 21:14:20

編程語言開發(fā)Golang

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-08-15 13:05:58

Serverless架構(gòu)開發(fā)運(yùn)維

2025-06-05 05:51:33

2023-10-19 11:12:15

Netty代碼

2021-02-17 11:25:33

前端JavaScriptthis

2009-09-25 09:14:35

Hibernate日志

2013-09-22 14:57:19

AtWood

2016-08-31 15:50:50

PythonThreadLocal變量
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 成人激情免费视频 | 久久男人 | 超碰免费在线 | 老头搡老女人毛片视频在线看 | 天天操操 | 999久久久 | 亚洲国产中文字幕 | 日韩精品成人在线 | 日日天天 | 欧美激情精品久久久久久 | 日韩一级免费电影 | 亚洲www啪成人一区二区 | 欧美区在线 | 亚洲国产成人精品女人久久久 | 欧美极品一区二区 | 在线观看国产视频 | 一区二区三区回区在观看免费视频 | 国产乱码一二三区精品 | 色综合一区二区三区 | 久久久久久久久91 | 久久精品视频一区二区三区 | 亚洲视频在线免费观看 | 中文字幕在线播放第一页 | 日韩美av | 久久久久久久久久影视 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 欧美在线成人影院 | 先锋av资源在线 | 狠狠综合久久av一区二区小说 | 国产探花在线精品一区二区 | 久久最新| h片在线免费观看 | 欧美日韩在线视频一区 | 日韩精品一区二区三区在线播放 | 日本精品一区二区三区四区 | 国产精品久久久久久久久久久久久 | 欧美日韩最新 | 免费在线看黄视频 | 亚洲精品欧洲 | av色站| 欧美激情在线精品一区二区三区 |