日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python学习笔记 - Python数据类型

發布時間:2023/12/15 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习笔记 - Python数据类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在Python語言中,所有的數據類型都是類,每一個變量都是類的“實例”。沒有基本數據類型的概念,所以整數、浮點數和字符串也都是類。

Python有6種標準數據類型:數字、字符串、列表、元組、集合和字典,而列表、元組、集合和字典可以保存多項數據,它們每一個都是一種數據結構,因此可以稱這四種為“數據結構”類型。

本文我們主要介紹數字和字符串類型。

一、數字類型

Python數字類型有4種:整數類型、浮點數類型、復數類型和布爾類型。需要注意的是,布爾類型也是數字類型,它事實上是整數類型的一種。

1.1 整數類型

Python整數類型為 int,整數類型的范圍可以很大,可以表示很大的整數,這只受所在計算機硬件的限制。

【提示】Python3 不再區分整數和長整數,所有需要的整數也可以是長整數。

默認情況下一個整數值表示的是十進制數,例如 16 表示的是十進制整數。其他進制,如二進制數、八進制數和十六進制數表示方式如下:

  • 二進制:以 0b 或 0B 為前綴,注意 0 是阿拉伯數字,不要誤以為是英文字母 o。
  • 八進制:以 0o 或 0O 為前綴,第一個字符是阿拉伯數字0,第二個字符是英文字母 o 或 O。
  • 十六進制:以 0x 或 0X 為前綴,注意 0 是阿拉伯數字。其中,10~15 分別以 a~f (此處的 a~f 不區分大小寫)來表示。

例如,整數值 28 、0b11100、0B11100、0o34、0O34、0x1C 和 0X1C 都表示同一個數字。在 Python shell 中輸出結果如下:

>>> 28 28 >>> 0b11100 28 >>> 0O34 28 >>> 0o34 28 >>> 0x1C 28 >>> 0X1c 28

1.2? 浮點數類型

浮點數類型主要用來存儲小數數值,Python浮點數類型為 float,Python只支持雙精度浮點數類型,而且與本機相關。

浮點數類型可以使用小數表示,也可以使用科學計數法,科學計數法中會使用大寫或小寫的字母 e 表示 10 的指數。如 e2 表示 。

在Python Shell 中運行示例如下:

>>> 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,不管是整型數值0還是浮點型數值0,Python都不允許除以0。

1.3? 復數類型

????????復數在數學中是非常重要的概念,無論是在理論物理學,還是在電氣工程實踐中都經常使用。但是很多計算機編程語言都不支持復數,而Python是支持復數的,這使得Python能夠很好地用來進行科學計算。

??????? Python中復數類型為 complex,復數的虛部用字母 j 或 J 來表示。例如,1+2j 表示的是實部為1、虛部為2的復數。在Python Shell 中運行示例如下:

>>> (1+2j) + (1+2j) (2+4j)

上述代碼實現了兩個復數的相加運算。

1.4? 布爾類型

Python中布爾類型為 bool,bool 是 int 類型的子類,它只有兩個值:True 和 False。

【注意】任何類型數據都可以通過 bool() 函數轉換為布爾值,那些被認為 “沒有的”、“空的” 值會轉換為 False,反之轉換為 True。如 None(空對象)False、0、0.0、0j(復數)、""(空字符串)、[](空列表)、()(空元組)和 {}(空字典)這些數值會轉換為 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) 表達式數據的是 True,這說明數值 2 和 1 都能轉換為True,在整數中只有0是轉換為 False,其他類型亦是如此。

二、數字類型相互轉換

????????上文中我們學習了四種數字類型,我們不禁會思考一個問題,不同數據類型之間是否可以轉換呢?Python通過一些函數可以實現不同數據類型之間的轉換,如數字類型之間相互轉換以及整數與字符串之間的轉換。我們先討論數字類型的相互轉換。

??????? 除復數外,其他的三種數字類型(整型、浮點型、布爾型)都可以相互進行轉換,轉換分為隱式類型轉換和顯式類型轉換。

2.1? 隱式類型轉換

????????多個數字類型數據之間可以進行數學計算,由于參與進行計算的數字類型可能不同,此時會發生隱式類型轉換。計算過程中隱式類型轉換規則如下表1-1 所示。

表1-1 隱式類型轉換規則
操作數1類型操作數2類型轉換后的類型
布爾整數整數
布爾、整數浮點浮點

布爾類型的值可以隱式轉換為整數類型,布爾值 True 轉換為整數1,布爾值 False 轉換為整數0。在Python Shell 中運行示例如下:

>>> 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'>

????????從上述代碼表達式的運算結果類型可知表1-1所示的類型轉換規則,這里不再贅述。另外,上述代碼標記1中使用了 type() 函數,type()函數可以返回傳入的變量的數據類型,<class 'int'> 說明是整型,<class 'float'> 說明是浮點型。

2.2? 顯式類型轉換

????????在不能進行隱式類型轉換的情況下,就可以使用類型轉換函數進行顯式類型轉換了。除復數類型外,其他三種數字類型(整型、浮點型、布爾型)都有自己的轉換函數,分別是 int()、float() 和 bool() 函數。

????????int() 函數可以將布爾、浮點 和 字符串轉換為整數。布爾數值 True 使用 int() 函數返回 1,False 使用 int() 函數返回 0;浮點數值使用 int() 函數會截掉小數部分。int() 函數轉換字符串會在下面內容再介紹。

??????? float() 函數可以將布爾、整數和字符串轉換為浮點值。布爾數值 True 使用 float()函數返回 1.0,False 使用 float() 函數返回 0.0;整數值使用 float() 函數會加上小數部分“0”。float() 函數轉換字符串會在下面內容再介紹。

在Python Shell 中運行示例如下:

>>> int(False) 0 >>> int(True) 1 >>> int(19.6) 19 >>> float(5) 5.0 >>> float(False) 0.0 >>> float(True) 1.0

三、字符串類型

????????由字符組成的一串字符序列稱為“字符串”,字符串是有順序的,從左到右,字符索引從 0 開始依次遞增。Python中字符串類型是用 str 關鍵字修飾的

3.1? 字符串表示方式

Python中字符串的表示方式有如下三種:

  • 普通字符串:采用單引號“ ' ” 或雙引號 “ " ” 包裹起來的字符串。
  • 原始字符串(raw string):在普通字符串前加 r,字符串中的特殊字符不需要轉義,按照字符串的本來“面目”呈現。
  • 長字符串:字符串中包含了換行縮進等排版字符,可以使用三重單引號 “ ''' ” 或三重雙引號 “ """ ” 包裹起來,這就是長字符串。

1)普通字符串

很多程序員習慣使用單引號(' ')表示字符串。下面的示例表示的都是 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編碼表示的字符串,事實上它表示的也是 Hello World 字符串,可通過 print 函數將 Unicode 編碼表示的字符串輸出到控制臺,則會看到 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

????????如果想在字符串中包含一些特殊的字符,例如換行符、制表符等,在普通字符串中則需要轉移,前面加上反斜杠 “ \ ”,這稱為字符轉移。表 3-2 所示是常用的幾個轉義符。

表3-2 轉義符
字符表示Unicode編碼說明
\t\u0009水平制表符
\n\u000a換行
\r\u000d回車
\"\u0022雙引號
\'\u0027單引號
\\\u005c反斜線

在 Python Shell 中運行示例如下:

>>> 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

????????字符串中的單引號(' ') 和雙引號(" ") 也可以不用轉義。在包含單引號符號的字符串中使用雙引號包裹字符串,見代碼第1處;在包含雙引號字符的字符串中使用單引號包裹字符串,見代碼第2處。另外,可以使用Unicode編碼替代需要轉義的特殊字符,代碼第4處和代碼第3處是等價的。

2)原始字符串(raw string)

在普通字符串前面加字母 r,表示字符串是原始字符串。原始字符串可以直接按照字符串的字面意思來使用,沒有轉義字符。在 Python Shell 中運行示例代碼如下:

>>> s = 'Hello\tWorld' # ---1 >>> print(s) Hello World >>> s = r'Hello\tWorld' # ---2 >>> print(s) Hello\tWorld

????????代碼第1處是普通字符串,代碼第2處是原始字符串,它們的區別只是在字符串前面加字母 r。從輸出結果可見,原始字符串中的 \t 沒有被當成制表符使用。

3)長字符串

字符串中包含了換行縮進等排版字符時,則可以使用長字符串。在 Python Shell 中運行示例代碼如下:

>>> s = '''Hello ... World''' >>> print(s) Hello World >>> s = """Hello \t ... World""" >>> print(s) Hello World

長字符串中如果包含特殊字符也需要轉義。

3.2? 字符串格式化

????????在實際的編程過程中,經常會遇到將其他類型變量與字符串拼接到一起并進行格式化輸出的情況。例如計算的金額需要保留小數點后四位,數字需要右對齊等,這些都需要格式化。

????????在字符串格式化時可以使用字符串的 format() 方法以及占位符。在Python Shell 中運行示例如下:

>>> 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歲。

????????字符串中可以用占位符({} 表示的內容),配合 format() 方法使用,會將 format() 方法中的參數替換占位符內容。占位符可以用參數索引表示,見第1處代碼、第2處代碼和第3處代碼,也可以使用參數名表示占位符,見第4處代碼,n 和 a 都是參數名字,需要注意的是,n 和 a 稱為形參,name 和 age 稱為實參。

表3-3 字符串格式化控制符
控制符說明
d、i轉換為帶符號的十進制形式的整數
f、F轉換為十進形式制的浮點數
g、G十進制整數或浮點數
e、E科學計算法表示浮點數
o轉換為帶符號的八進制形式的整數:符號是小寫英文字母 o
x、X轉換為帶符號的十六進制形式的整數:x 是小寫表示,X 是大寫表示
r使用 repr()函數將變量或表達式的值轉換為字符串
s使用 str()函數將變量或表達式的值轉換為字符串
C轉化為單字符(只接受整數或單字符字符串)

????????格式控制符位于占位符索引或占位符名字的后面,之間用冒號分隔,例如 {1:d} 表示索引為1的占位符格式參數是十進制整數。在Python Shell 中運行示例如下:

>>> 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元。' >>> '十進制{0:d}的八進制表示為{0:o},十六進制表示為{0:x}'.format(28) '十進制28的八進制表示為34,十六進制表示為1c'

????????上述代碼第1處中 {1:d} 是格式化十進制整數,代碼第2處中 {0:5d} 是指定輸出長度為5的字符串,不足用空格補齊。代碼第3處中 {1:f} 是格式化十進制浮點數,從輸出的結果可見,小數部分太長了。如果想控制小數部分可以使用代碼第4處的 {1: .2f} 占位符,其中表示保留小數點后兩位。如果想設置長度可以使用代碼第5處的 {1: 10.2f} 占位符,其中 10 表示輸出總長度,包括小數點和小數部分,不足用空格補位。

補充:字符串格式化方法2:%<控制符>

Python還提供了 “%” 對各種類型的數據進行格式化輸出,示例代碼如下:

>>> price = 100 >>> print("The book`s price is %s." % price) The book`s price is 100.

????????上述代碼中的 print 函數包含三個部分,第一部分是格式化字符串(它相當于字符串模板),該格式化字符串中包含了一個 “%s” 占位符,它會被第三部分的變量或表達式的值代替;第二部分固定使用 “%” 作為分隔符。

??????? 格式化字符串中的 “%s” 被稱為轉換說明符(Conversion Specifier),其作用相當于一個占位符,它會被后面的變量或表達式的值代替。“%s” 指定將變量或值使用 str() 函數轉換為字符串。

??????? 如果格式化字符串中包含多個“%s”占位符,則第三部分也應該對應地提供多個變量,并且使用圓括號將這些變量括起來。示例代碼如下:

>>> user = 'Charli' >>> age = 18 >>> print("%s is a %s years old boy." % (user, age)) Charli is a 18 years old boy.

當使用上面的格式化轉換控制符(或轉換說明符)時可指定轉換后的最小寬度。示例代碼如下:

>>> 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

從上面的輸出結果可以看出,此時指定了字符串的最小寬度為6,因此程序轉換數值時總寬度為6,程序自動在數值前面補充了三個空格。

在默認情況下,轉換出來的字符串總是右對齊,不夠寬度時左邊用空格補充。Python也允許在最小寬度之前添加一個標志來改變這種默認行為,Python支持如下標志:

  • -:指定左對齊
  • +:表示數值總要帶著符號(正數帶“+”,負數帶“-”)
  • 0:表示不補充空格,而是補充0。

《提示》這三個標志可以多個同時存在。

轉換整數(%d)的示例代碼如下:

>>> num2 = 30 # 最小寬度為6,右對齊,不夠左邊補0 >>> print("num2 is: %06d" % num2) num2 is: 000030 # 最小寬度為6,右對齊,不夠左邊補0 >>> print("num2 is: %+06d" % num2) num2 is: +00030 # 最小寬度為6,左對齊 >>> print("num2 is: %-06d" % num2) num2 is: 30

轉換浮點數(%f)的示例代碼如下:

>>> my_value = 3.001415926535 # 最小寬度為8,小數點后保留3位,不足左邊補空格 >>> print("my_value is: %8.3f" % my_value) my_value is: 3.001 # 最小寬度為8,小數點后保留3位,不足左邊補0 >>> print("my_value is: %08.3f" % my_value) my_value is: 0003.001 # 最小寬度為8,小數點后保留3位,不足左邊補0,始終帶符號 >>> print("my_value is: %+08.3f" % my_value) my_value is: +003.001

如果轉換的是字符串格式(%s),Python允許指定轉換后的字符串的最大字符數。這個標志被稱為精度值,該精度值被放在最小寬度之后,中間用點號 (.) 隔開。示例代碼如下:

>>> the_name = "Charlie" # 只保留3個字符,最小寬度為10,右對齊,寬度不足左邊補空格 >>> print("the name is: %10.3s" % the_name) the name is: Cha # 只保留3個字符,沒有設置最小寬度,則按實際寬度輸出 >>> print("the name is: %.3s" % the_name) the name is: Cha

3.3? 字符串查找

????????在給定的字符串中查找子字符串是比較常見的操作。字符串類(str) 中提供了 find 和 rfind 方法用于查找子字符串,返回值是查找到的子字符串所在的位置,沒有找到返回 -1。下面只具體說明 find 和 rfind 方法。

str.find(sub[, start[, end]])

在索引 start 和 end 之間查找子字符串 sub,如果找到返回最左端位置的索引,如果沒有找到返回-1。start 是開始索引,end 是結束索引,這兩個參數都可以省略,如果 start 省略說明查找從字符串頭開始;如果 end 省略說明查找到字符串結尾;如果全部省略就是查找整個字符串本身。

str.rfind(sub[, start[, end]])

與 find 方法類似,區別是如果找到返回最右端位置的索引。如果在查找的范圍內只找到一處字符串,那么這里 find 和 rfind 方法返回值是相同的。

【提示】在Python 文檔中,[ ] 表示可以省略部分,find 和 rfind 方法參數 [, start[, end]] 表示 start 和 end 都可以省略。

在Python Shell 中運行示例代碼如下:

>>> 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) 返回字符串長度,注意 len 是函數,不是字符串類的一個方法,它的參數是字符串。代碼第2處 source_str[16] 表示訪問字符串中索引為16的字符。

????????上述字符串查找方法比較類似,這里重點解釋一下 source_str.find('ing', 5)source_str.rfind('ing', 5) 表達式。從下圖 3-1 可見,ing 字符串出現過兩次,索引分別是 14 和 24。source_str.find('ing', 5) 返回最左端索引14,返回值為14;source_str.rfind('ing', 5) 返回最右端索引 24。

圖3-1? source_str 字符串索引

【提示】函數和方法的區別是,方法是定義在類中的函數,在類的外部調用時需要通過類或對象調用,例如上述代碼 source_str.find('r') 就是調用字符串類對象 source_str 的 find 方法,find 方法是在 str 類中定義的。而通常的函數不是類中定義的,也稱為頂層函數,它們不屬于任何一個類,調用時直接使用函數即可,例如上述代碼中的 len(source_str),就調用了 len 函數,只不過它的參數是字符串對象 source_str。

3.4? 字符串與數字相互轉換

在實際的編程過程中,經常會用到字符串與數字相互轉換。下面從不同的方面介紹字符串與數字相互轉換。

1)字符串轉換為數字

????????字符串轉換為數字可以使用 int() 和 float() 函數實現。上文 2.2 節介紹了這兩個函數實現數字類型之間的轉換,事實上這兩個函數也可以接收字符串參數,如果字符串能成功轉換為數字,則返回數字,否則引發異常。

??????? 在Python Shell 中運行示例代碼如下:

>>> 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'

????????默認情況下,int() 函數都將字符串參數當成十進制數字進行轉換,所以 int('AB') 會失敗。int() 函數也可以指定基數(即進制),在Python Shell 中運行示例如下:

>>> int('AB', 16) 171

2)數字轉換為字符串

數字轉換為字符串有很多方法,3.2 節中介紹的字符串格式化方法可以將數字轉換為字符串。另外,Python 中字符串提供了 str() 函數。

可以使用 str() 函數將任何類型的數字轉換為字符串。在Python Shell 中運行示例代碼如下:

>>> str(3.24) '3.24' >>> str(True) 'True' >>> str([]) '[]' >>> str([1, 2, 3]) '[1, 2, 3]' >>> str(34) '34'

從上述代碼可知,str() 函數很強大,什么類型都可以轉換為字符串。但缺點是不能格式化,如果需要格式化字符串可以使用 format 方法。

在Python Shell 中運行示例代碼如下:

>>> '{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 方法格式化字符串時,如果只有一個參數,占位符索引可以省略掉。

?補充:使用 repr() 函數將數字轉換為字符串

?使用 repr() 函數將數字類型轉換為字符串類型。示例代碼如下:

>>> a = 10 >>> repr(a) '10' >>> repr(3.24) '3.24' >>> repr(True) 'True' >>> repr(False) 'False'

????????str() 和 repr() 函數都可以將數字轉換成字符串,其中 str 本身是Python內置的類型(和 int、float 一樣),而 repr() 則只是一個函數。此外,repr 還有一個功能,它會以Python表達式的形式來表示值。對比如下代碼的運行結果:

>>> st = "I will play my life" >>> print(st) I will play my life >>> print(repr(st)) 'I will play my life'

上面代碼中,st 本身就是一個字符串,但程序依然使用了 repr() 函數對字符串進行轉換,可以看到兩個print語句的輸出結果有所不同。

如果直接使用print()函數輸出字符串,將只能看到字符串的內容,沒有引號;但如果先使用 repr() 函數對字符串進行處理,然后再使用print()執行輸出,將可以看到帶引號的字符串——這就是字符串的Python的表達式形式。

《提示》在Python Shell 交互式解釋器中輸入一個變量或表達式時,Python會自動使用 repr() 函數處理該變量或表達式。

3.5? 使用 input() 函數獲取用戶輸入

????????input() 函數用于向用戶生成一條提示,然后獲取用戶輸入的內容。由于 input() 函數總會將用戶輸入的內容放入字符串中,因此用戶可以輸入任何內容,input() 函數總是返回一個字符串。

例如如下程序:程序清單:input_test.py

# coding=utf-8msg = input("請輸入你的值:") print(type(msg)) print(msg)

?示例運行結果:

F:\python_work\Python基礎\字符串>python input_test.py 請輸入你的值:2 <class 'str'> 2F:\python_work\Python基礎\字符串>python input_test.py 請輸入你的值:1.2 <class 'str'> 1.2F:\python_work\Python基礎\字符串>python input_test.py 請輸入你的值:Hello <class 'str'> Hello

從上面的運行過程可以看出,無論輸入哪種內容,始終可以看到 input() 函數返回字符串類型(str),程序總會將用戶輸入的內容轉換成字符串。

3.6? 字節類型 — bytes

????????Python3 新增了 bytes 類型, 用于代表字節。字符串類型(str) 由多個字符組成,以字符為單位進行操作(默認以 utf-8 為字符編碼格式);bytes 是由多個字節組成,以字節為單位組成,我們可以稱之為 字節串

??????? bytes 和 str 除操作的數據單元不同之外,它們支持的所有方法都基本相同,bytes 也是不可變序列。

??????? bytes 對象只負責以字節(二進制格式)序列來記錄數據,至于這些數據到底表示什么內容,完全由程序決定。如果采用合適的字符集,字符串可以轉換成字節串;反過來,字節串也可以恢復成對應的字符串。

??????? 由于 bytes 保存的就是原始的字節(二進制格式)數據,因此 bytes 對象可用于在網絡上傳輸數據,也可用于存儲各種二進制格式的文件,比如圖片、音樂等文件。

??????? 如果希望將一個字符串轉換成 bytes 對象,有如下三種方式。

  • 如果字符串內容都是 ASCII 字符,則可以通過字節在字符串之前添加字母 b 來構建字節串值。
  • 調用 bytes() 函數(本質是 bytes 類的構造方法)將字符串按指定字符集轉換成字節串,如果不指定字符集,默認使用 UTF-8 字符集。
  • 調用字符串本身的 encode() 方法將字符串按指定字符集轉換成字節串,如果不指定字符集,默認使用 UTF-8 字符集。

例如,如下程序示范了如何創建字節串。程序清單:bytes_test.py

# coding=utf-8# 創建一個空的bytes對象 b1 = bytes()# 創建一個空的bytes值 b2 = b''# 通過前綴b指定hello是bytes類型的值 b3 = b'hello' print(b3) print(b3[0]) print(b3[2:4])# 調用bytes()方法將字符串轉換成bytes對象 b4 = bytes('I love Python Programming', encoding='utf-8') print(b4)# 利用字符串的encode()方法編碼成bytes,默認使用UTF-8字符集 b5 = "學習 Python 很有趣".encode('utf-8') print(b5)

運行結果:

F:\python_work\Python基礎\字符串>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都是字節串對象,該程序示范了以不同方式來構建字節串對象。其中,b2、b3 都是直接在 ASCII 字符串前添加 b 前綴來得到字節串的;b4 調用 bytes() 函數來構造字節串;而 b5 則調用字符串的 encode() 方法來構建字節串。

??????? 在字節串中每一個數據單元都是字節,也就是8位二進制,其中每4位(相當于4位二進制數,最小值為9,最大值為15)可以用一個十六進制數來表示,因此每字節需要兩個十六進制數表示,所以可以看到上面運行的程序的輸出是:b'\xe5\xad\xa6\xe4\xb9\xa0 Python \xe5\xbe\x88\xe6\x9c\x89\xe8\xb6\xa3' ,比如 \xe5 就表示 1 字節,其中 \x 表示十六進制,e5 就是兩位的十六進制數。

??????? 如果程序獲得了 bytes 對象,也可調用 bytes 類對象的 decode() 方法將其解碼成字符串,例如,在上面的程序中添加如下代碼。

# 將 bytes 對象解碼成字符串,默認使用UTF-8字符集進行解碼 st = b5.decode('utf-8') print(st)

運行結果為:

學習 Python 很有趣

【知識拓展】字符集的概念

計算機底層并不能保存字符,但程序總是需要保存各種字符的,那該怎么辦呢?計算機科學家就想了一個辦法:為每個字符編號,當程序要保存字符時,實際上保存的是該字符對應的編號;當程序讀取字符時,讀取的其實也是編號,接下來要去查 “編號-字符對應表”(簡稱碼表)才能得到實際的字符。因此,所謂的字符集,就是所有字符的編號組成的綜合。早期美國人給英文字符、數字、英文標點符號等字符進行了編號,他們認為所有字符加起來頂多 100 多個,只要 1 字節(8位,支持 256 個字符編號)即可為所有字符編號——這就是 ASCII 字符集。后來,亞洲國家紛紛為本國文字進行編號——即制訂本國的字符集,但這些字符集并不兼容。于是美國人又為世界上所有書面語言的字符進行了統一編號,這次他們用了兩個字節(16位,支持65536個字符編號),這就是 Unicode 字符集。實際使用的 UTF-8、UTF-16 等其實都屬于 Unicode 字符集。

由于不同人對字符的編號完全可以很隨意,比如同一個 “愛” 字,我可以為其編號為 99,別人可以為其編號為 199,所以同一個編號在不同的字符集中代表的字符完全有可能是不同的。因此,對于同一個字符,如果采用不同的字符集來生成 bytes 對象,就會得到不同的 bytes 對象。

《補充說明》字符串還有其他的內容,如拼接字符串、字符串大小寫轉換、刪除字符串空白字符、字符串替換、字符串分割、連接等。

參考

《Python從小白到大牛(第1版-2018).pdf》第6章 - 數據類型

《瘋狂Python講義(2018.12).pdf》第2章 - 變量和簡單類型

《Python編程:從入門到實踐(2016.7).pdf》第2章 - 變量和簡單數據類型

總結

以上是生活随笔為你收集整理的Python学习笔记 - Python数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。