鍍金池/ 教程/ Python/ 字符串(1)
標(biāo)準(zhǔn)庫(kù) (4)
如何成為 Python 高手
標(biāo)準(zhǔn)庫(kù) (6)
標(biāo)準(zhǔn)庫(kù) (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習(xí)
列表(3)
從小工到專家
除法
錯(cuò)誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準(zhǔn)備
函數(shù)練習(xí)
標(biāo)準(zhǔn)庫(kù) (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個(gè)簡(jiǎn)單的程序
將數(shù)據(jù)存入文件
語(yǔ)句(5)
SQLite 數(shù)據(jù)庫(kù)
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語(yǔ)句(4)
錯(cuò)誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標(biāo)準(zhǔn)庫(kù) (1)
生成器
mysql 數(shù)據(jù)庫(kù) (1)
第三方庫(kù)
實(shí)戰(zhàn)
運(yùn)算符
類(3)
字典(2)
語(yǔ)句(1)
數(shù)和四則運(yùn)算
語(yǔ)句(2)
文件(2)
MySQL 數(shù)據(jù)庫(kù) (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫(kù) (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標(biāo)準(zhǔn)庫(kù) (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學(xué)函數(shù)和運(yùn)算優(yōu)先級(jí)
字符串(3)
為計(jì)算做準(zhǔn)備
多態(tài)和封裝
類(4)
迭代
語(yǔ)句(3)
錯(cuò)誤和異常 (3)
分析 Hello
Python 安裝
標(biāo)準(zhǔn)庫(kù) (2)
列表(2)
元組

字符串(1)

如果對(duì)自然語(yǔ)言分類,有很多中分法,比如英語(yǔ)、法語(yǔ)、漢語(yǔ)等,這種分法是最常見的。在語(yǔ)言學(xué)里面,也有對(duì)語(yǔ)言的分類方法,比如什么什么語(yǔ)系之類的。我這里提出一種分法,這種分法尚未得到廣大人民群眾和研究者的廣泛認(rèn)同,但是,我相信那句“真理是掌握在少數(shù)人的手里”,至少在這里可以用來給自己壯壯膽。

我的分法:一種是語(yǔ)言中的兩個(gè)元素(比如兩個(gè)字)拼接在一起,出來一個(gè)新的元素(比如新的字);另外一種是兩個(gè)元素拼接在一起,只是得到這兩個(gè)元素的并列顯示。比如“好”和“人”,兩個(gè)元素拼接在一起是“好人”,而 3 和 5 拼接(就是整數(shù)求和)在一起是 8,如果你認(rèn)為是 35,那就屬于第二類了。

把我的這種分法抽象一下:

  • 一種是:△ + □ = ○
  • 另外一種是:△ + □ = △ □

我們的語(yǔ)言中,離不開以上兩類,不是第一類就是第二類。

太天才了。請(qǐng)鼓掌。

字符串

在我洋洋自得的時(shí)候,我 google 了一下,才發(fā)現(xiàn),自己沒那么高明,看維基百科的字符串詞條是這么說的:

字符串(String),是由零個(gè)或多個(gè)字符組成的有限串行。一般記為 s=a[1]a[2]...a[n]。

看到維基百科的偉大了吧,它已經(jīng)把我所設(shè)想的一種情況取了一個(gè)形象的名稱,叫做字符串,本質(zhì)上就是一串字符。

根據(jù)這個(gè)定義,在前面兩次讓一個(gè)程序員感到偉大的"Hello,World",就是一個(gè)字符串?;蛘哒f不管用英文還是中文還是別的某種文,寫出來的文字都可以做為字符串對(duì)待,當(dāng)然,里面的特殊符號(hào),也是可以做為字符串的,比如空格等。

嚴(yán)格地說,在 Python 中的字符串是一種對(duì)象類型,這種類型用 str 表示,通常單引號(hào)''或者雙引號(hào)""包裹起來。

字符串和前面講過的數(shù)字一樣,都是對(duì)象的類型,或者說都是值。當(dāng)然,表示方式還是有區(qū)別的。

"I love Python." 'I love Python.' 'I LOVE PYTHON.' 'I LOVE PYTHON.'

從這兩個(gè)例子中可以看出來,不論使用單引號(hào)還是雙引號(hào),結(jié)果都是一樣的。

>>> 250
250
>>> type(250)
<type 'int'>

>>> "250"
'250'
>>> type("250")
<type 'str'>

仔細(xì)觀察上面的區(qū)別,同樣是 250,一個(gè)沒有放在引號(hào)里面,一個(gè)放在了引號(hào)里面,用 type()函數(shù)來檢驗(yàn)一下,發(fā)現(xiàn)它們居然是兩種不同的對(duì)象類型,前者是 int 類型,后者則是 str 類型,即字符串類型。所以,請(qǐng)大家務(wù)必注意,不是所有數(shù)字都是 int(or float),必須要看看,它在什么地方,如果在引號(hào)里面,就是字符串了。如果搞不清楚是什么類型,就讓 type()來幫忙搞定。

操練一下字符串吧。

>>> print "good good study, day day up"
good good study, day day up
>>> print "----good---study---day----up"
----good---study---day----up

在 print 后面,打印的都是字符串。注意,是雙引號(hào)里面的,引號(hào)不是字符串的組成部分。它是在告訴計(jì)算機(jī),它里面包裹著的是一個(gè)字符串。

愛思考的看官肯定發(fā)現(xiàn)上面這句話有問題了。如果我要把下面這句話看做一個(gè)字符串,應(yīng)該怎么做?

What's your name?

這個(gè)問題非常好,因?yàn)樵谶@句話中有一個(gè)單引號(hào),如果直接在交互模式中像上面那樣輸入,就會(huì)這樣:

>>> 'What's your name?'
File "<stdin>", line 1
 'What's your name?'
      ^
SyntaxError: invalid syntax

出現(xiàn)了 SyntaxError(語(yǔ)法錯(cuò)誤)引導(dǎo)的提示,這是在告訴我們這里存在錯(cuò)誤,錯(cuò)誤的類型就是 SyntaxError,后面是對(duì)這種錯(cuò)誤的解釋“invalid syntax”(無效的語(yǔ)法)。特別注意,錯(cuò)誤提示的上面,有一個(gè) ^ 符號(hào),直接只著一個(gè)單引號(hào),不用多說,你也能猜測(cè)出,大概在告訴我們,可能是這里出現(xiàn)錯(cuò)誤了。

在 python 中,這一點(diǎn)是非常友好的,如果語(yǔ)句存在錯(cuò)誤,就會(huì)將錯(cuò)誤輸出來,供程序員改正參考。當(dāng)然,錯(cuò)誤來源有時(shí)候比較復(fù)雜,需要根據(jù)經(jīng)驗(yàn)和知識(shí)進(jìn)行修改。還有一種修改錯(cuò)誤的好辦法,就是講錯(cuò)誤提示放到 google 中搜索。

上面那個(gè)值的錯(cuò)誤原因是什么呢?仔細(xì)觀察,發(fā)現(xiàn)那句話中事實(shí)上有三個(gè)單引號(hào),本來一對(duì)單引號(hào)之間包裹的是一個(gè)字符串,現(xiàn)在出現(xiàn)了三個(gè)(一對(duì)半)單引號(hào),computer 姑娘迷茫了,她不知道單引號(hào)包裹的到底是誰。于是報(bào)錯(cuò)。

解決方法一:雙引號(hào)包裹單引號(hào)

>>> "What's your name?"
"What's your name?"

用雙引號(hào)來包裹,雙引號(hào)里面允許出現(xiàn)單引號(hào)。其實(shí),反過來,單引號(hào)里面也可以包裹雙引號(hào)。這個(gè)可以籠統(tǒng)地成為二者的嵌套。

解決方法二:使用轉(zhuǎn)義符

所謂轉(zhuǎn)義,就是讓某個(gè)符號(hào)不在表示某個(gè)含義,而是表示另外一個(gè)含義。轉(zhuǎn)義符的作用就是它能夠轉(zhuǎn)變符號(hào)的含義。在 Python 中,用 \ 作為轉(zhuǎn)義符(其實(shí)很多語(yǔ)言,只要有轉(zhuǎn)義符的,都是用這個(gè)符號(hào))。

>>> 'What\'s your name?'
"What's your name?"

是不是看到轉(zhuǎn)義符 \ 的作用了。

本來單引號(hào)表示包括字符串,它不是字符串一部分,但是如果前面有轉(zhuǎn)義符,那么它就失去了原來的含義,轉(zhuǎn)化為字符串的一部分,相當(dāng)于一個(gè)特殊字符了。

變量和字符串

前面講過變量無類型,對(duì)象有類型了,比如在數(shù)字中:

>>> a = 5
>>> a
5

其本質(zhì)含義是變量 a 相當(dāng)于一個(gè)標(biāo)簽,貼在了對(duì)象 5 上面。并且我們把這個(gè)語(yǔ)句叫做賦值語(yǔ)句。

同樣,在對(duì)字符串類型的對(duì)象,也是這樣,能夠通過賦值語(yǔ)句,將對(duì)象與某個(gè)標(biāo)簽(變量)關(guān)聯(lián)起來。

>>> b = "hello,world"
>>> b
'hello,world'
>>> print b
hello,world

還記得我們?cè)?jīng)用過一個(gè) type 命令嗎?現(xiàn)在它還有用,就是檢驗(yàn)一個(gè)變量,到底跟什么類型聯(lián)系著,是字符串還是數(shù)字?

>>> type(a)
<type 'int'>
>>> type(b)
<type 'str'>

有時(shí)候,你會(huì)聽到一種說法:把a(bǔ)稱之為數(shù)字型變量,把 b 叫做字符(串)型變量。這種說法,在某些語(yǔ)言中是成立的。某些語(yǔ)言,需要提前聲明變量,然后變量就成為了一個(gè)筐,將值裝到這個(gè)筐里面。但是,Python 不是這樣的。要注意區(qū)別。

拼接字符串

還記得我在本節(jié)開篇提出的那個(gè)偉大發(fā)現(xiàn)嗎?就是將兩個(gè)東西拼接起來。

對(duì)數(shù)字,如果拼接,就是對(duì)兩個(gè)數(shù)字求和。如:3+5,就計(jì)算出為 8。那么對(duì)字符串都能進(jìn)行什么樣的操作呢?試試吧:

>>> "Py" + "thon"
'Python'

跟我那個(gè)不為大多數(shù)人認(rèn)可的發(fā)現(xiàn)是一樣的,你還不認(rèn)可嗎??jī)蓚€(gè)字符串相加,就相當(dāng)于把兩個(gè)字符串連接起來。(別的運(yùn)算就別嘗試了,沒什么意義,肯定報(bào)錯(cuò),不信就試試)

>>> "Py" - "thon"     # 這么做的人,是腦袋進(jìn)水泥了吧?
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'str'

+ 號(hào)實(shí)現(xiàn)連接,的確比較簡(jiǎn)單,不過,有時(shí)候你會(huì)遇到這樣的問題:

>>> a = 1989
>>> b = "free"
>>> print b+a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

這里引入了一個(gè)指令:print,意思就是打印后面的字符串(或者指向字符串的變量),上面是 Python2 中的使用方式,在 Python3 中,它變成了一個(gè)函數(shù)。應(yīng)該用 print(b+a)的樣式了。

報(bào)錯(cuò)了,其錯(cuò)誤原因已經(jīng)打印出來了(一定要注意看打印出來的信息):cannot concatenate 'str' and 'int' objects。原來 a 對(duì)應(yīng)的對(duì)象是一個(gè) int 類型的,不能將它和 str 對(duì)象連接起來。怎么辦?

原來,用 + 拼接起來的兩個(gè)對(duì)象,必須是同一種類型的。如果兩個(gè)都是數(shù)字,毫無疑問是正確的,就是求和;如果都是字符串,那么就得到一個(gè)新的字符串。

修改上面的錯(cuò)誤,可以通過以下方法:

>>> print b + `a`       
free1989

注意,\ 是反引號(hào),不是單引號(hào),就是鍵盤中通常在數(shù)字1左邊的那個(gè),在英文半角狀態(tài)下輸入的符號(hào)。這種方法,在編程實(shí)踐中比較少應(yīng)用,特別是在 Python3 中,已經(jīng)把這種方式棄絕了。我想原因就是這個(gè)符號(hào)太容易和單引號(hào)混淆了。在編程中,也不容易看出來,可讀性太差。

常言道:“困難只有一個(gè),解決困難的方法不止一種”,既然反引號(hào)可讀性不好,在編程實(shí)踐中就盡量不要使用。于是乎就有了下面的方法,這是被廣泛采用的。不但簡(jiǎn)單,更主要是直白,一看就懂什么意思了。

>>> print b + str(a)    
free1989

str(a)實(shí)現(xiàn)將整數(shù)對(duì)象轉(zhuǎn)換為字符串對(duì)象。雖然 str 是一種對(duì)象類型,但是它也能夠?qū)崿F(xiàn)對(duì)象類型的轉(zhuǎn)換,這就起到了一個(gè)函數(shù)的作用。其實(shí)前面已經(jīng)講過的 int 也有類似的作用。比如:

>>> a = "250"
>>> type(a)
<type 'str'>
>>> b = int(a)
>>> b
250
>>> type(b)
<type 'int'>

提醒列位,如果你對(duì) int 和 str 比較好奇,可以在交互模式中,使用 help(int),help(str)查閱相關(guān)的更多資料。

還有第三種:

>>> print b + repr(a)   #repr(a)與上面的類似
free1989 

這里 repr()是一個(gè)函數(shù),其實(shí)就是反引號(hào)的替代品,它能夠把結(jié)果字符串轉(zhuǎn)化為合法的 python 表達(dá)式。

可能看官看到這個(gè),就要問它們?nèi)咧g的區(qū)別了。首先明確,repr()和 \ 是一致的,就不用區(qū)別了。接下來需要區(qū)別的就是 repr()和 str,一個(gè)最簡(jiǎn)單的區(qū)別,repr 是函數(shù),str 是跟 int 一樣,一種對(duì)象類型。不過這么說是不能完全解惑的。幸虧有那么好的 google 讓我輩使用,你會(huì)找到不少人對(duì)這兩者進(jìn)行區(qū)分的內(nèi)容,我推薦這個(gè):

  1. When should i use str() and when should i use repr() ?

Almost always use str when creating output for end users.

repr is mainly useful for debugging and exploring. For example, if you suspect a string has non printing characters in it, or a float has a small rounding error, repr will show you; str may not.

repr can also be useful for for generating literals to paste into your source code. It can also be used for persistence (with ast.literal_eval or eval), but this is rarely a good idea--if you want editable persisted values, something like JSON or YAML is much better, and if you don't plan to edit them, use pickle.

2.In which cases i can use either of them ?

Well, you can use them almost anywhere. You shouldn't generally use them except as described above.

3.What can str() do which repr() can't ?

Give you output fit for end-user consumption--not always (e.g., str(['spam', 'eggs']) isn't likely to be anything you want to put in a GUI), but more often than repr.

4.What can repr() do which str() can't

Give you output that's useful for debugging--again, not always (the default for instances of user-created classes is rarely helpful), but whenever possible.

And sometimes give you output that's a valid Python literal or other expression--but you rarely want to rely on that except for interactive exploration.

以上英文內(nèi)容來源:http://stackoverflow.com/questions/19331404/str-vs-repr-functions-in-python-2-7-5

Python 轉(zhuǎn)義字符

在字符串中,有時(shí)需要輸入一些特殊的符號(hào),但是,某些符號(hào)不能直接輸出,就需要用轉(zhuǎn)義符。所謂轉(zhuǎn)義,就是不采用符號(hào)本來的含義,而采用另外一含義了。下面表格中列出常用的轉(zhuǎn)義符:

轉(zhuǎn)義字符 描述
\ (在行尾時(shí)) 續(xù)行符
\ 反斜杠符號(hào)
\' 單引號(hào)
\" 雙引號(hào)
\a 響鈴
\b 退格(Backspace)
\e 轉(zhuǎn)義
\000
\n 換行
\v 縱向制表符
\t 橫向制表符
\r 回車
\f 換頁(yè)
\oyy 八進(jìn)制數(shù),yy 代表的字符,例如:\o12 代表?yè)Q行
\xyy 十六進(jìn)制數(shù),yy 代表的字符,例如:\x0a 代表?yè)Q行
\other 其它的字符以普通格式輸出

以上所有轉(zhuǎn)義符,都可以通過交互模式下 print 來測(cè)試一下,感受實(shí)際上是什么樣子的。例如:

>>> print "hello.I am qiwsir.\                  # 這里換行,下一行接續(xù)
... My website is 'http://qiwsir.github.io'."
hello.I am qiwsir.My website is 'http://qiwsir.github.io'.

>>> print "you can connect me by qq\\weibo\\gmail"  #\\ 是為了要后面那個(gè) \
you can connect me by qq\weibo\gmail

看官自己試試吧。如果有問題,可以聯(lián)系我解答。


總目錄   |   上節(jié):寫一個(gè)簡(jiǎn)單的程序   |   下節(jié):字符串(2)

如果你認(rèn)為有必要打賞我,請(qǐng)通過支付寶:qiwsir@126.com,不勝感激。

上一篇:字符串(2)下一篇:運(yùn)算符