Python学习笔记 - Python数据类型
前言
在Python語(yǔ)言中,所有的數(shù)據(jù)類型都是類,每一個(gè)變量都是類的“實(shí)例”。沒(méi)有基本數(shù)據(jù)類型的概念,所以整數(shù)、浮點(diǎn)數(shù)和字符串也都是類。
Python有6種標(biāo)準(zhǔn)數(shù)據(jù)類型:數(shù)字、字符串、列表、元組、集合和字典,而列表、元組、集合和字典可以保存多項(xiàng)數(shù)據(jù),它們每一個(gè)都是一種數(shù)據(jù)結(jié)構(gòu),因此可以稱這四種為“數(shù)據(jù)結(jié)構(gòu)”類型。
本文我們主要介紹數(shù)字和字符串類型。
一、數(shù)字類型
Python數(shù)字類型有4種:整數(shù)類型、浮點(diǎn)數(shù)類型、復(fù)數(shù)類型和布爾類型。需要注意的是,布爾類型也是數(shù)字類型,它事實(shí)上是整數(shù)類型的一種。
1.1 整數(shù)類型
Python整數(shù)類型為 int,整數(shù)類型的范圍可以很大,可以表示很大的整數(shù),這只受所在計(jì)算機(jī)硬件的限制。
【提示】Python3 不再區(qū)分整數(shù)和長(zhǎng)整數(shù),所有需要的整數(shù)也可以是長(zhǎng)整數(shù)。
默認(rèn)情況下一個(gè)整數(shù)值表示的是十進(jìn)制數(shù),例如 16 表示的是十進(jìn)制整數(shù)。其他進(jìn)制,如二進(jìn)制數(shù)、八進(jìn)制數(shù)和十六進(jìn)制數(shù)表示方式如下:
- 二進(jìn)制:以 0b 或 0B 為前綴,注意 0 是阿拉伯?dāng)?shù)字,不要誤以為是英文字母 o。
- 八進(jìn)制:以 0o 或 0O 為前綴,第一個(gè)字符是阿拉伯?dāng)?shù)字0,第二個(gè)字符是英文字母 o 或 O。
- 十六進(jìn)制:以 0x 或 0X 為前綴,注意 0 是阿拉伯?dāng)?shù)字。其中,10~15 分別以 a~f (此處的 a~f 不區(qū)分大小寫)來(lái)表示。
例如,整數(shù)值 28 、0b11100、0B11100、0o34、0O34、0x1C 和 0X1C 都表示同一個(gè)數(shù)字。在 Python shell 中輸出結(jié)果如下:
>>> 28 28 >>> 0b11100 28 >>> 0O34 28 >>> 0o34 28 >>> 0x1C 28 >>> 0X1c 281.2? 浮點(diǎn)數(shù)類型
浮點(diǎn)數(shù)類型主要用來(lái)存儲(chǔ)小數(shù)數(shù)值,Python浮點(diǎn)數(shù)類型為 float,Python只支持雙精度浮點(diǎn)數(shù)類型,而且與本機(jī)相關(guān)。
浮點(diǎn)數(shù)類型可以使用小數(shù)表示,也可以使用科學(xué)計(jì)數(shù)法,科學(xué)計(jì)數(shù)法中會(huì)使用大寫或小寫的字母 e 表示 10 的指數(shù)。如 e2 表示 。
在Python Shell 中運(yùn)行示例如下:
>>> 1.0 1.0 >>> 0.0 0.0 >>> 3.36e2 336.0 >>> 1.56e-2 0.0156其中,3.36e2 表示的是 3.36 × ,1.56e-2 表示的是 1.56 × 。
【注意】Python不允許除以0,不管是整型數(shù)值0還是浮點(diǎn)型數(shù)值0,Python都不允許除以0。
1.3? 復(fù)數(shù)類型
????????復(fù)數(shù)在數(shù)學(xué)中是非常重要的概念,無(wú)論是在理論物理學(xué),還是在電氣工程實(shí)踐中都經(jīng)常使用。但是很多計(jì)算機(jī)編程語(yǔ)言都不支持復(fù)數(shù),而Python是支持復(fù)數(shù)的,這使得Python能夠很好地用來(lái)進(jìn)行科學(xué)計(jì)算。
??????? Python中復(fù)數(shù)類型為 complex,復(fù)數(shù)的虛部用字母 j 或 J 來(lái)表示。例如,1+2j 表示的是實(shí)部為1、虛部為2的復(fù)數(shù)。在Python Shell 中運(yùn)行示例如下:
>>> (1+2j) + (1+2j) (2+4j)上述代碼實(shí)現(xiàn)了兩個(gè)復(fù)數(shù)的相加運(yùn)算。
1.4? 布爾類型
Python中布爾類型為 bool,bool 是 int 類型的子類,它只有兩個(gè)值:True 和 False。
【注意】任何類型數(shù)據(jù)都可以通過(guò) bool() 函數(shù)轉(zhuǎn)換為布爾值,那些被認(rèn)為 “沒(méi)有的”、“空的” 值會(huì)轉(zhuǎn)換為 False,反之轉(zhuǎn)換為 True。如 None(空對(duì)象)False、0、0.0、0j(復(fù)數(shù))、""(空字符串)、[](空列表)、()(空元組)和 {}(空字典)這些數(shù)值會(huì)轉(zhuǎn)換為 False,否則是 True。
示例如下:
>>> bool(0) False >>> bool(2) True >>> bool(1) True >>> bool('') False >>> bool([]) False >>> bool({}) False >>> a = 1 + True >>> a 2 >>> print(a) 2上述代碼中 bool(2)? 和 bool(1) 表達(dá)式數(shù)據(jù)的是 True,這說(shuō)明數(shù)值 2 和 1 都能轉(zhuǎn)換為True,在整數(shù)中只有0是轉(zhuǎn)換為 False,其他類型亦是如此。
二、數(shù)字類型相互轉(zhuǎn)換
????????上文中我們學(xué)習(xí)了四種數(shù)字類型,我們不禁會(huì)思考一個(gè)問(wèn)題,不同數(shù)據(jù)類型之間是否可以轉(zhuǎn)換呢?Python通過(guò)一些函數(shù)可以實(shí)現(xiàn)不同數(shù)據(jù)類型之間的轉(zhuǎn)換,如數(shù)字類型之間相互轉(zhuǎn)換以及整數(shù)與字符串之間的轉(zhuǎn)換。我們先討論數(shù)字類型的相互轉(zhuǎn)換。
??????? 除復(fù)數(shù)外,其他的三種數(shù)字類型(整型、浮點(diǎn)型、布爾型)都可以相互進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換分為隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換。
2.1? 隱式類型轉(zhuǎn)換
????????多個(gè)數(shù)字類型數(shù)據(jù)之間可以進(jìn)行數(shù)學(xué)計(jì)算,由于參與進(jìn)行計(jì)算的數(shù)字類型可能不同,此時(shí)會(huì)發(fā)生隱式類型轉(zhuǎn)換。計(jì)算過(guò)程中隱式類型轉(zhuǎn)換規(guī)則如下表1-1 所示。
| 操作數(shù)1類型 | 操作數(shù)2類型 | 轉(zhuǎn)換后的類型 |
| 布爾 | 整數(shù) | 整數(shù) |
| 布爾、整數(shù) | 浮點(diǎn) | 浮點(diǎn) |
布爾類型的值可以隱式轉(zhuǎn)換為整數(shù)類型,布爾值 True 轉(zhuǎn)換為整數(shù)1,布爾值 False 轉(zhuǎn)換為整數(shù)0。在Python Shell 中運(yùn)行示例如下:
>>> a = 1 + True >>> print(a) 2 >>> type(a) # ---1 <class 'int'> >>> a = 1.0 + 1 >>> type(a) <class 'float'> >>> print(a) 2.0 >>> a = 1.0 + True >>> print(a) 2.0 >>> a = 1.0 + 1 + False >>> print(a) 2.0 >>> type(a) <class 'float'>????????從上述代碼表達(dá)式的運(yùn)算結(jié)果類型可知表1-1所示的類型轉(zhuǎn)換規(guī)則,這里不再贅述。另外,上述代碼標(biāo)記1中使用了 type() 函數(shù),type()函數(shù)可以返回傳入的變量的數(shù)據(jù)類型,<class 'int'> 說(shuō)明是整型,<class 'float'> 說(shuō)明是浮點(diǎn)型。
2.2? 顯式類型轉(zhuǎn)換
????????在不能進(jìn)行隱式類型轉(zhuǎn)換的情況下,就可以使用類型轉(zhuǎn)換函數(shù)進(jìn)行顯式類型轉(zhuǎn)換了。除復(fù)數(shù)類型外,其他三種數(shù)字類型(整型、浮點(diǎn)型、布爾型)都有自己的轉(zhuǎn)換函數(shù),分別是 int()、float() 和 bool() 函數(shù)。
????????int() 函數(shù)可以將布爾、浮點(diǎn) 和 字符串轉(zhuǎn)換為整數(shù)。布爾數(shù)值 True 使用 int() 函數(shù)返回 1,False 使用 int() 函數(shù)返回 0;浮點(diǎn)數(shù)值使用 int() 函數(shù)會(huì)截掉小數(shù)部分。int() 函數(shù)轉(zhuǎn)換字符串會(huì)在下面內(nèi)容再介紹。
??????? float() 函數(shù)可以將布爾、整數(shù)和字符串轉(zhuǎn)換為浮點(diǎn)值。布爾數(shù)值 True 使用 float()函數(shù)返回 1.0,False 使用 float() 函數(shù)返回 0.0;整數(shù)值使用 float() 函數(shù)會(huì)加上小數(shù)部分“0”。float() 函數(shù)轉(zhuǎn)換字符串會(huì)在下面內(nèi)容再介紹。
在Python Shell 中運(yùn)行示例如下:
>>> int(False) 0 >>> int(True) 1 >>> int(19.6) 19 >>> float(5) 5.0 >>> float(False) 0.0 >>> float(True) 1.0三、字符串類型
????????由字符組成的一串字符序列稱為“字符串”,字符串是有順序的,從左到右,字符索引從 0 開(kāi)始依次遞增。Python中字符串類型是用 str 關(guān)鍵字修飾的。
3.1? 字符串表示方式
Python中字符串的表示方式有如下三種:
- 普通字符串:采用單引號(hào)“ ' ” 或雙引號(hào) “ " ” 包裹起來(lái)的字符串。
- 原始字符串(raw string):在普通字符串前加 r,字符串中的特殊字符不需要轉(zhuǎn)義,按照字符串的本來(lái)“面目”呈現(xiàn)。
- 長(zhǎng)字符串:字符串中包含了換行縮進(jìn)等排版字符,可以使用三重單引號(hào) “ ''' ” 或三重雙引號(hào) “ """ ” 包裹起來(lái),這就是長(zhǎng)字符串。
1)普通字符串
很多程序員習(xí)慣使用單引號(hào)(' ')表示字符串。下面的示例表示的都是 Hello World 字符串。
'Hello World' "Hello World" '\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064' # ---1 "\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064" # ---2????????Python中的字符串采用Unicode編碼,所以字符串可以包含中文等亞洲字符。代碼第1處和第2處的字符串是用Unicode編碼表示的字符串,事實(shí)上它表示的也是 Hello World 字符串,可通過(guò) print 函數(shù)將 Unicode 編碼表示的字符串輸出到控制臺(tái),則會(huì)看到 Hello World 字符串。
>>> s = 'Hello World' >>> print(s) Hello World >>> s = "Hello World" >>> print(s) Hello World >>> s = '\u0048\u0065\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064' >>> print(s) Helo World >>> s = "\u0048\u0065\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064" >>> print(s) Helo World????????如果想在字符串中包含一些特殊的字符,例如換行符、制表符等,在普通字符串中則需要轉(zhuǎn)移,前面加上反斜杠 “ \ ”,這稱為字符轉(zhuǎn)移。表 3-2 所示是常用的幾個(gè)轉(zhuǎn)義符。
| 字符表示 | Unicode編碼 | 說(shuō)明 |
| \t | \u0009 | 水平制表符 |
| \n | \u000a | 換行 |
| \r | \u000d | 回車 |
| \" | \u0022 | 雙引號(hào) |
| \' | \u0027 | 單引號(hào) |
| \\ | \u005c | 反斜線 |
在 Python Shell 中運(yùn)行示例如下:
>>> s = 'Hello\n World' >>> print(s) HelloWorld >>> s = 'Hello\t World' >>> print(s) Hello World >>> s = 'Hello\' World' >>> print(s) Hello' World >>> s = "Hello' World" ---1 >>> print(s) Hello' World >>> s = 'Hello" World' ---2 >>> print(s) Hello" World >>> s = 'Hello\\ World' ---3 >>> print(s) Hello\ World >>> s = 'Hello\u005c World' ---4 >>> print(s) Hello\ World????????字符串中的單引號(hào)(' ') 和雙引號(hào)(" ") 也可以不用轉(zhuǎn)義。在包含單引號(hào)符號(hào)的字符串中使用雙引號(hào)包裹字符串,見(jiàn)代碼第1處;在包含雙引號(hào)字符的字符串中使用單引號(hào)包裹字符串,見(jiàn)代碼第2處。另外,可以使用Unicode編碼替代需要轉(zhuǎn)義的特殊字符,代碼第4處和代碼第3處是等價(jià)的。
2)原始字符串(raw string)
在普通字符串前面加字母 r,表示字符串是原始字符串。原始字符串可以直接按照字符串的字面意思來(lái)使用,沒(méi)有轉(zhuǎn)義字符。在 Python Shell 中運(yùn)行示例代碼如下:
>>> s = 'Hello\tWorld' # ---1 >>> print(s) Hello World >>> s = r'Hello\tWorld' # ---2 >>> print(s) Hello\tWorld????????代碼第1處是普通字符串,代碼第2處是原始字符串,它們的區(qū)別只是在字符串前面加字母 r。從輸出結(jié)果可見(jiàn),原始字符串中的 \t 沒(méi)有被當(dāng)成制表符使用。
3)長(zhǎng)字符串
字符串中包含了換行縮進(jìn)等排版字符時(shí),則可以使用長(zhǎng)字符串。在 Python Shell 中運(yùn)行示例代碼如下:
>>> s = '''Hello ... World''' >>> print(s) Hello World >>> s = """Hello \t ... World""" >>> print(s) Hello World長(zhǎng)字符串中如果包含特殊字符也需要轉(zhuǎn)義。
3.2? 字符串格式化
????????在實(shí)際的編程過(guò)程中,經(jīng)常會(huì)遇到將其他類型變量與字符串拼接到一起并進(jìn)行格式化輸出的情況。例如計(jì)算的金額需要保留小數(shù)點(diǎn)后四位,數(shù)字需要右對(duì)齊等,這些都需要格式化。
????????在字符串格式化時(shí)可以使用字符串的 format() 方法以及占位符。在Python Shell 中運(yùn)行示例如下:
>>> name = 'Mary' >>> age = 18 >>> s = '她的年齡是{0}歲。'.format(age) ---1 >>> print(s) 她的年齡是18歲。 >>> s = '{0}芳齡是{1}歲。'.format(name, age) ---2 >>> print(s) Mary芳齡是18歲。 >>> s = '{1}芳齡是{0}歲。'.format(age, name) ---3 >>> print(s) Mary芳齡是18歲。 >>> s = '{n}芳齡是{a}歲。'.format(n=name, a=age) ---4 >>> print(s) Mary芳齡是18歲。????????字符串中可以用占位符({} 表示的內(nèi)容),配合 format() 方法使用,會(huì)將 format() 方法中的參數(shù)替換占位符內(nèi)容。占位符可以用參數(shù)索引表示,見(jiàn)第1處代碼、第2處代碼和第3處代碼,也可以使用參數(shù)名表示占位符,見(jiàn)第4處代碼,n 和 a 都是參數(shù)名字,需要注意的是,n 和 a 稱為形參,name 和 age 稱為實(shí)參。
| 控制符 | 說(shuō)明 |
| d、i | 轉(zhuǎn)換為帶符號(hào)的十進(jìn)制形式的整數(shù) |
| f、F | 轉(zhuǎn)換為十進(jìn)形式制的浮點(diǎn)數(shù) |
| g、G | 十進(jìn)制整數(shù)或浮點(diǎn)數(shù) |
| e、E | 科學(xué)計(jì)算法表示浮點(diǎn)數(shù) |
| o | 轉(zhuǎn)換為帶符號(hào)的八進(jìn)制形式的整數(shù):符號(hào)是小寫英文字母 o |
| x、X | 轉(zhuǎn)換為帶符號(hào)的十六進(jìn)制形式的整數(shù):x 是小寫表示,X 是大寫表示 |
| r | 使用 repr()函數(shù)將變量或表達(dá)式的值轉(zhuǎn)換為字符串 |
| s | 使用 str()函數(shù)將變量或表達(dá)式的值轉(zhuǎn)換為字符串 |
| C | 轉(zhuǎn)化為單字符(只接受整數(shù)或單字符字符串) |
????????格式控制符位于占位符索引或占位符名字的后面,之間用冒號(hào)分隔,例如 {1:d} 表示索引為1的占位符格式參數(shù)是十進(jìn)制整數(shù)。在Python Shell 中運(yùn)行示例如下:
>>> name = 'Mary' >>> age = 18 >>> money = 1234.5678 >>> "{0}芳齡是{1:d}歲".format(name, age) # ---1 'Mary芳齡是18歲' >>> "{1}芳齡是{0:5d}歲。".format(age, name) # ---2 'Mary芳齡是 18歲。' >>> "{0}今天收入是{1:f}元。".format(name, money) # ---3 'Mary今天收入是1234.567800元。' >>> "{0}今天收入是{1:.2f}元。".format(name, money) # ---4 'Mary今天收入是1234.57元。' >>> "{0}今天收入是{1:10.2f}元。".format(name, money) # ---5 'Mary今天收入是 1234.57元。' >>> "{0}今天收入是{1:g}元。".format(name, money) 'Mary今天收入是1234.57元。' >>> "{0}今天收入是{1:G}元。".format(name, money) 'Mary今天收入是1234.57元。' >>> "{0}今天收入是{1:e}元。".format(name, money) 'Mary今天收入是1.234568e+03元。' >>> "{0}今天收入是{1:E}元。".format(name, money) 'Mary今天收入是1.234568E+03元。' >>> '十進(jìn)制{0:d}的八進(jìn)制表示為{0:o},十六進(jìn)制表示為{0:x}'.format(28) '十進(jìn)制28的八進(jìn)制表示為34,十六進(jìn)制表示為1c'????????上述代碼第1處中 {1:d} 是格式化十進(jìn)制整數(shù),代碼第2處中 {0:5d} 是指定輸出長(zhǎng)度為5的字符串,不足用空格補(bǔ)齊。代碼第3處中 {1:f} 是格式化十進(jìn)制浮點(diǎn)數(shù),從輸出的結(jié)果可見(jiàn),小數(shù)部分太長(zhǎng)了。如果想控制小數(shù)部分可以使用代碼第4處的 {1: .2f} 占位符,其中表示保留小數(shù)點(diǎn)后兩位。如果想設(shè)置長(zhǎng)度可以使用代碼第5處的 {1: 10.2f} 占位符,其中 10 表示輸出總長(zhǎng)度,包括小數(shù)點(diǎn)和小數(shù)部分,不足用空格補(bǔ)位。
補(bǔ)充:字符串格式化方法2:%<控制符>
Python還提供了 “%” 對(duì)各種類型的數(shù)據(jù)進(jìn)行格式化輸出,示例代碼如下:
>>> price = 100 >>> print("The book`s price is %s." % price) The book`s price is 100.????????上述代碼中的 print 函數(shù)包含三個(gè)部分,第一部分是格式化字符串(它相當(dāng)于字符串模板),該格式化字符串中包含了一個(gè) “%s” 占位符,它會(huì)被第三部分的變量或表達(dá)式的值代替;第二部分固定使用 “%” 作為分隔符。
??????? 格式化字符串中的 “%s” 被稱為轉(zhuǎn)換說(shuō)明符(Conversion Specifier),其作用相當(dāng)于一個(gè)占位符,它會(huì)被后面的變量或表達(dá)式的值代替。“%s” 指定將變量或值使用 str() 函數(shù)轉(zhuǎn)換為字符串。
??????? 如果格式化字符串中包含多個(gè)“%s”占位符,則第三部分也應(yīng)該對(duì)應(yīng)地提供多個(gè)變量,并且使用圓括號(hào)將這些變量括起來(lái)。示例代碼如下:
>>> user = 'Charli' >>> age = 18 >>> print("%s is a %s years old boy." % (user, age)) Charli is a 18 years old boy.當(dāng)使用上面的格式化轉(zhuǎn)換控制符(或轉(zhuǎn)換說(shuō)明符)時(shí)可指定轉(zhuǎn)換后的最小寬度。示例代碼如下:
>>> num = -28 >>> print("num is: %6i" % num) num is: -28 >>> print("num is: %6d" % num) num is: -28 >>> print("num is: %6o" % num) num is: -34 >>> print("num is: %6x" % num) num is: -1c >>> print("num is: %6X" % num) num is: -1C >>> print("num is: %6s" % num) num is: -28從上面的輸出結(jié)果可以看出,此時(shí)指定了字符串的最小寬度為6,因此程序轉(zhuǎn)換數(shù)值時(shí)總寬度為6,程序自動(dòng)在數(shù)值前面補(bǔ)充了三個(gè)空格。
在默認(rèn)情況下,轉(zhuǎn)換出來(lái)的字符串總是右對(duì)齊,不夠?qū)挾葧r(shí)左邊用空格補(bǔ)充。Python也允許在最小寬度之前添加一個(gè)標(biāo)志來(lái)改變這種默認(rèn)行為,Python支持如下標(biāo)志:
- -:指定左對(duì)齊
- +:表示數(shù)值總要帶著符號(hào)(正數(shù)帶“+”,負(fù)數(shù)帶“-”)
- 0:表示不補(bǔ)充空格,而是補(bǔ)充0。
《提示》這三個(gè)標(biāo)志可以多個(gè)同時(shí)存在。
轉(zhuǎn)換整數(shù)(%d)的示例代碼如下:
>>> num2 = 30 # 最小寬度為6,右對(duì)齊,不夠左邊補(bǔ)0 >>> print("num2 is: %06d" % num2) num2 is: 000030 # 最小寬度為6,右對(duì)齊,不夠左邊補(bǔ)0 >>> print("num2 is: %+06d" % num2) num2 is: +00030 # 最小寬度為6,左對(duì)齊 >>> print("num2 is: %-06d" % num2) num2 is: 30轉(zhuǎn)換浮點(diǎn)數(shù)(%f)的示例代碼如下:
>>> my_value = 3.001415926535 # 最小寬度為8,小數(shù)點(diǎn)后保留3位,不足左邊補(bǔ)空格 >>> print("my_value is: %8.3f" % my_value) my_value is: 3.001 # 最小寬度為8,小數(shù)點(diǎn)后保留3位,不足左邊補(bǔ)0 >>> print("my_value is: %08.3f" % my_value) my_value is: 0003.001 # 最小寬度為8,小數(shù)點(diǎn)后保留3位,不足左邊補(bǔ)0,始終帶符號(hào) >>> print("my_value is: %+08.3f" % my_value) my_value is: +003.001如果轉(zhuǎn)換的是字符串格式(%s),Python允許指定轉(zhuǎn)換后的字符串的最大字符數(shù)。這個(gè)標(biāo)志被稱為精度值,該精度值被放在最小寬度之后,中間用點(diǎn)號(hào) (.) 隔開(kāi)。示例代碼如下:
>>> the_name = "Charlie" # 只保留3個(gè)字符,最小寬度為10,右對(duì)齊,寬度不足左邊補(bǔ)空格 >>> print("the name is: %10.3s" % the_name) the name is: Cha # 只保留3個(gè)字符,沒(méi)有設(shè)置最小寬度,則按實(shí)際寬度輸出 >>> print("the name is: %.3s" % the_name) the name is: Cha3.3? 字符串查找
????????在給定的字符串中查找子字符串是比較常見(jiàn)的操作。字符串類(str) 中提供了 find 和 rfind 方法用于查找子字符串,返回值是查找到的子字符串所在的位置,沒(méi)有找到返回 -1。下面只具體說(shuō)明 find 和 rfind 方法。
str.find(sub[, start[, end]])在索引 start 和 end 之間查找子字符串 sub,如果找到返回最左端位置的索引,如果沒(méi)有找到返回-1。start 是開(kāi)始索引,end 是結(jié)束索引,這兩個(gè)參數(shù)都可以省略,如果 start 省略說(shuō)明查找從字符串頭開(kāi)始;如果 end 省略說(shuō)明查找到字符串結(jié)尾;如果全部省略就是查找整個(gè)字符串本身。
str.rfind(sub[, start[, end]])與 find 方法類似,區(qū)別是如果找到返回最右端位置的索引。如果在查找的范圍內(nèi)只找到一處字符串,那么這里 find 和 rfind 方法返回值是相同的。
【提示】在Python 文檔中,[ ] 表示可以省略部分,find 和 rfind 方法參數(shù) [, start[, end]] 表示 start 和 end 都可以省略。
在Python Shell 中運(yùn)行示例代碼如下:
>>> source_str = "There is a string accessing example." >>> len(source_str) ---1 36 >>> source_str[16] ---2 'g' >>> source_str.find('r') 3 >>> source_str.rfind('r') 13 >>> source_str.find('ing') 14 >>> source_str.rfind('ing') 24 >>> source_str.find('e', 15) 21 >>> source_str.rfind('e', 15) 34 >>> source_str.find('ing', 5) 14 >>> source_str.rfind('ing', 5) 24 >>> source_str.find('ing', 18, 28) 24 >>> source_str.rfind('ing', 18, 28) 24 >>> source_str.rfind('ingg', 5) -1????????上述代碼第1處 len(source_str) 返回字符串長(zhǎng)度,注意 len 是函數(shù),不是字符串類的一個(gè)方法,它的參數(shù)是字符串。代碼第2處 source_str[16] 表示訪問(wèn)字符串中索引為16的字符。
????????上述字符串查找方法比較類似,這里重點(diǎn)解釋一下 source_str.find('ing', 5) 和 source_str.rfind('ing', 5) 表達(dá)式。從下圖 3-1 可見(jiàn),ing 字符串出現(xiàn)過(guò)兩次,索引分別是 14 和 24。source_str.find('ing', 5) 返回最左端索引14,返回值為14;source_str.rfind('ing', 5) 返回最右端索引 24。
圖3-1? source_str 字符串索引【提示】函數(shù)和方法的區(qū)別是,方法是定義在類中的函數(shù),在類的外部調(diào)用時(shí)需要通過(guò)類或?qū)ο笳{(diào)用,例如上述代碼 source_str.find('r') 就是調(diào)用字符串類對(duì)象 source_str 的 find 方法,find 方法是在 str 類中定義的。而通常的函數(shù)不是類中定義的,也稱為頂層函數(shù),它們不屬于任何一個(gè)類,調(diào)用時(shí)直接使用函數(shù)即可,例如上述代碼中的 len(source_str),就調(diào)用了 len 函數(shù),只不過(guò)它的參數(shù)是字符串對(duì)象 source_str。
3.4? 字符串與數(shù)字相互轉(zhuǎn)換
在實(shí)際的編程過(guò)程中,經(jīng)常會(huì)用到字符串與數(shù)字相互轉(zhuǎn)換。下面從不同的方面介紹字符串與數(shù)字相互轉(zhuǎn)換。
1)字符串轉(zhuǎn)換為數(shù)字
????????字符串轉(zhuǎn)換為數(shù)字可以使用 int() 和 float() 函數(shù)實(shí)現(xiàn)。上文 2.2 節(jié)介紹了這兩個(gè)函數(shù)實(shí)現(xiàn)數(shù)字類型之間的轉(zhuǎn)換,事實(shí)上這兩個(gè)函數(shù)也可以接收字符串參數(shù),如果字符串能成功轉(zhuǎn)換為數(shù)字,則返回?cái)?shù)字,否則引發(fā)異常。
??????? 在Python Shell 中運(yùn)行示例代碼如下:
>>> int('9') 9 >>> int('9.6') Traceback (most recent call last):File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: '9.6' >>> float('9.6') 9.6 >>> int('AB') Traceback (most recent call last):File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'AB'????????默認(rèn)情況下,int() 函數(shù)都將字符串參數(shù)當(dāng)成十進(jìn)制數(shù)字進(jìn)行轉(zhuǎn)換,所以 int('AB') 會(huì)失敗。int() 函數(shù)也可以指定基數(shù)(即進(jìn)制),在Python Shell 中運(yùn)行示例如下:
>>> int('AB', 16) 1712)數(shù)字轉(zhuǎn)換為字符串
數(shù)字轉(zhuǎn)換為字符串有很多方法,3.2 節(jié)中介紹的字符串格式化方法可以將數(shù)字轉(zhuǎn)換為字符串。另外,Python 中字符串提供了 str() 函數(shù)。
可以使用 str() 函數(shù)將任何類型的數(shù)字轉(zhuǎn)換為字符串。在Python Shell 中運(yùn)行示例代碼如下:
>>> str(3.24) '3.24' >>> str(True) 'True' >>> str([]) '[]' >>> str([1, 2, 3]) '[1, 2, 3]' >>> str(34) '34'從上述代碼可知,str() 函數(shù)很強(qiáng)大,什么類型都可以轉(zhuǎn)換為字符串。但缺點(diǎn)是不能格式化,如果需要格式化字符串可以使用 format 方法。
在Python Shell 中運(yùn)行示例代碼如下:
>>> '{0:.2f}'.format(3.25) '3.25' >>> '{0:.1f}'.format(3.25) '3.2' >>> '{0:10.1f}'.format(3.25) ' 3.2' >>> '{:10.1f}'.format(3.25) ' 3.2'【提示】在使用 format 方法格式化字符串時(shí),如果只有一個(gè)參數(shù),占位符索引可以省略掉。
?補(bǔ)充:使用 repr() 函數(shù)將數(shù)字轉(zhuǎn)換為字符串
?使用 repr() 函數(shù)將數(shù)字類型轉(zhuǎn)換為字符串類型。示例代碼如下:
>>> a = 10 >>> repr(a) '10' >>> repr(3.24) '3.24' >>> repr(True) 'True' >>> repr(False) 'False'????????str() 和 repr() 函數(shù)都可以將數(shù)字轉(zhuǎn)換成字符串,其中 str 本身是Python內(nèi)置的類型(和 int、float 一樣),而 repr() 則只是一個(gè)函數(shù)。此外,repr 還有一個(gè)功能,它會(huì)以Python表達(dá)式的形式來(lái)表示值。對(duì)比如下代碼的運(yùn)行結(jié)果:
>>> st = "I will play my life" >>> print(st) I will play my life >>> print(repr(st)) 'I will play my life'上面代碼中,st 本身就是一個(gè)字符串,但程序依然使用了 repr() 函數(shù)對(duì)字符串進(jìn)行轉(zhuǎn)換,可以看到兩個(gè)print語(yǔ)句的輸出結(jié)果有所不同。
如果直接使用print()函數(shù)輸出字符串,將只能看到字符串的內(nèi)容,沒(méi)有引號(hào);但如果先使用 repr() 函數(shù)對(duì)字符串進(jìn)行處理,然后再使用print()執(zhí)行輸出,將可以看到帶引號(hào)的字符串——這就是字符串的Python的表達(dá)式形式。
《提示》在Python Shell 交互式解釋器中輸入一個(gè)變量或表達(dá)式時(shí),Python會(huì)自動(dòng)使用 repr() 函數(shù)處理該變量或表達(dá)式。
3.5? 使用 input() 函數(shù)獲取用戶輸入
????????input() 函數(shù)用于向用戶生成一條提示,然后獲取用戶輸入的內(nèi)容。由于 input() 函數(shù)總會(huì)將用戶輸入的內(nèi)容放入字符串中,因此用戶可以輸入任何內(nèi)容,input() 函數(shù)總是返回一個(gè)字符串。
例如如下程序:程序清單:input_test.py
# coding=utf-8msg = input("請(qǐng)輸入你的值:") print(type(msg)) print(msg)?示例運(yùn)行結(jié)果:
F:\python_work\Python基礎(chǔ)\字符串>python input_test.py 請(qǐng)輸入你的值:2 <class 'str'> 2F:\python_work\Python基礎(chǔ)\字符串>python input_test.py 請(qǐng)輸入你的值:1.2 <class 'str'> 1.2F:\python_work\Python基礎(chǔ)\字符串>python input_test.py 請(qǐng)輸入你的值:Hello <class 'str'> Hello從上面的運(yùn)行過(guò)程可以看出,無(wú)論輸入哪種內(nèi)容,始終可以看到 input() 函數(shù)返回字符串類型(str),程序總會(huì)將用戶輸入的內(nèi)容轉(zhuǎn)換成字符串。
3.6? 字節(jié)類型 — bytes
????????Python3 新增了 bytes 類型, 用于代表字節(jié)。字符串類型(str) 由多個(gè)字符組成,以字符為單位進(jìn)行操作(默認(rèn)以 utf-8 為字符編碼格式);bytes 是由多個(gè)字節(jié)組成,以字節(jié)為單位組成,我們可以稱之為 字節(jié)串。
??????? bytes 和 str 除操作的數(shù)據(jù)單元不同之外,它們支持的所有方法都基本相同,bytes 也是不可變序列。
??????? bytes 對(duì)象只負(fù)責(zé)以字節(jié)(二進(jìn)制格式)序列來(lái)記錄數(shù)據(jù),至于這些數(shù)據(jù)到底表示什么內(nèi)容,完全由程序決定。如果采用合適的字符集,字符串可以轉(zhuǎn)換成字節(jié)串;反過(guò)來(lái),字節(jié)串也可以恢復(fù)成對(duì)應(yīng)的字符串。
??????? 由于 bytes 保存的就是原始的字節(jié)(二進(jìn)制格式)數(shù)據(jù),因此 bytes 對(duì)象可用于在網(wǎng)絡(luò)上傳輸數(shù)據(jù),也可用于存儲(chǔ)各種二進(jìn)制格式的文件,比如圖片、音樂(lè)等文件。
??????? 如果希望將一個(gè)字符串轉(zhuǎn)換成 bytes 對(duì)象,有如下三種方式。
- 如果字符串內(nèi)容都是 ASCII 字符,則可以通過(guò)字節(jié)在字符串之前添加字母 b 來(lái)構(gòu)建字節(jié)串值。
- 調(diào)用 bytes() 函數(shù)(本質(zhì)是 bytes 類的構(gòu)造方法)將字符串按指定字符集轉(zhuǎn)換成字節(jié)串,如果不指定字符集,默認(rèn)使用 UTF-8 字符集。
- 調(diào)用字符串本身的 encode() 方法將字符串按指定字符集轉(zhuǎn)換成字節(jié)串,如果不指定字符集,默認(rèn)使用 UTF-8 字符集。
例如,如下程序示范了如何創(chuàng)建字節(jié)串。程序清單:bytes_test.py
# coding=utf-8# 創(chuàng)建一個(gè)空的bytes對(duì)象 b1 = bytes()# 創(chuàng)建一個(gè)空的bytes值 b2 = b''# 通過(guò)前綴b指定hello是bytes類型的值 b3 = b'hello' print(b3) print(b3[0]) print(b3[2:4])# 調(diào)用bytes()方法將字符串轉(zhuǎn)換成bytes對(duì)象 b4 = bytes('I love Python Programming', encoding='utf-8') print(b4)# 利用字符串的encode()方法編碼成bytes,默認(rèn)使用UTF-8字符集 b5 = "學(xué)習(xí) Python 很有趣".encode('utf-8') print(b5)運(yùn)行結(jié)果:
F:\python_work\Python基礎(chǔ)\字符串>python bytes_test.py b'hello' 104 b'll' b'I love Python Programming' b'\xe5\xad\xa6\xe4\xb9\xa0 Python \xe5\xbe\x88\xe6\x9c\x89\xe8\xb6\xa3'????????上面程序中,b1~b5都是字節(jié)串對(duì)象,該程序示范了以不同方式來(lái)構(gòu)建字節(jié)串對(duì)象。其中,b2、b3 都是直接在 ASCII 字符串前添加 b 前綴來(lái)得到字節(jié)串的;b4 調(diào)用 bytes() 函數(shù)來(lái)構(gòu)造字節(jié)串;而 b5 則調(diào)用字符串的 encode() 方法來(lái)構(gòu)建字節(jié)串。
??????? 在字節(jié)串中每一個(gè)數(shù)據(jù)單元都是字節(jié),也就是8位二進(jìn)制,其中每4位(相當(dāng)于4位二進(jìn)制數(shù),最小值為9,最大值為15)可以用一個(gè)十六進(jìn)制數(shù)來(lái)表示,因此每字節(jié)需要兩個(gè)十六進(jìn)制數(shù)表示,所以可以看到上面運(yùn)行的程序的輸出是:b'\xe5\xad\xa6\xe4\xb9\xa0 Python \xe5\xbe\x88\xe6\x9c\x89\xe8\xb6\xa3' ,比如 \xe5 就表示 1 字節(jié),其中 \x 表示十六進(jìn)制,e5 就是兩位的十六進(jìn)制數(shù)。
??????? 如果程序獲得了 bytes 對(duì)象,也可調(diào)用 bytes 類對(duì)象的 decode() 方法將其解碼成字符串,例如,在上面的程序中添加如下代碼。
# 將 bytes 對(duì)象解碼成字符串,默認(rèn)使用UTF-8字符集進(jìn)行解碼 st = b5.decode('utf-8') print(st)運(yùn)行結(jié)果為:
學(xué)習(xí) Python 很有趣【知識(shí)拓展】字符集的概念
計(jì)算機(jī)底層并不能保存字符,但程序總是需要保存各種字符的,那該怎么辦呢?計(jì)算機(jī)科學(xué)家就想了一個(gè)辦法:為每個(gè)字符編號(hào),當(dāng)程序要保存字符時(shí),實(shí)際上保存的是該字符對(duì)應(yīng)的編號(hào);當(dāng)程序讀取字符時(shí),讀取的其實(shí)也是編號(hào),接下來(lái)要去查 “編號(hào)-字符對(duì)應(yīng)表”(簡(jiǎn)稱碼表)才能得到實(shí)際的字符。因此,所謂的字符集,就是所有字符的編號(hào)組成的綜合。早期美國(guó)人給英文字符、數(shù)字、英文標(biāo)點(diǎn)符號(hào)等字符進(jìn)行了編號(hào),他們認(rèn)為所有字符加起來(lái)頂多 100 多個(gè),只要 1 字節(jié)(8位,支持 256 個(gè)字符編號(hào))即可為所有字符編號(hào)——這就是 ASCII 字符集。后來(lái),亞洲國(guó)家紛紛為本國(guó)文字進(jìn)行編號(hào)——即制訂本國(guó)的字符集,但這些字符集并不兼容。于是美國(guó)人又為世界上所有書面語(yǔ)言的字符進(jìn)行了統(tǒng)一編號(hào),這次他們用了兩個(gè)字節(jié)(16位,支持65536個(gè)字符編號(hào)),這就是 Unicode 字符集。實(shí)際使用的 UTF-8、UTF-16 等其實(shí)都屬于 Unicode 字符集。
由于不同人對(duì)字符的編號(hào)完全可以很隨意,比如同一個(gè) “愛(ài)” 字,我可以為其編號(hào)為 99,別人可以為其編號(hào)為 199,所以同一個(gè)編號(hào)在不同的字符集中代表的字符完全有可能是不同的。因此,對(duì)于同一個(gè)字符,如果采用不同的字符集來(lái)生成 bytes 對(duì)象,就會(huì)得到不同的 bytes 對(duì)象。
《補(bǔ)充說(shuō)明》字符串還有其他的內(nèi)容,如拼接字符串、字符串大小寫轉(zhuǎn)換、刪除字符串空白字符、字符串替換、字符串分割、連接等。
參考
《Python從小白到大牛(第1版-2018).pdf》第6章 - 數(shù)據(jù)類型
《瘋狂Python講義(2018.12).pdf》第2章 - 變量和簡(jiǎn)單類型
《Python編程:從入門到實(shí)踐(2016.7).pdf》第2章 - 變量和簡(jiǎn)單數(shù)據(jù)類型
總結(jié)
以上是生活随笔為你收集整理的Python学习笔记 - Python数据类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Spark ML】第 2 章: Spa
- 下一篇: 洗料系列-杂谈篇-麻将自动化---第一章