Python 數據類型

要學習一門語言,首先要看看它的數據類型。由于Python是一門動態語言,所以Python的變量在聲明時不需要類型,只要寫出名稱即可。這里所用的Python版本是目前最新的Python 3.6.1。

數字類型

整數

在Python中只有一種整數類型,類似Java的BigInteger,可以擴展到無限大位。整數字面量可以是十進制、二進制、八進制或十六進制的。數字在輸出的時候會以十進制輸出,如果希望以其他形式輸出,可以使用oct、hex、bin等幾個內置函數轉換。

在Python中運算符和其他語言類似。比較特殊的是除法,默認的/是小數除,而其他語言中的整除是//。乘方則是**。下面用一點例子來說明。

print('--------------整數類型--------------')
print(f'Integer type:{type(100)}')
print(f'Integer value:{100}')

# 各種進制
decimal = 100
binary_number = 0b1100
octal_number = 0o12374
hexadecimal = 0xcafe

print(f'八進制:{oct(decimal)}')
print(f'十六進制:{hex(decimal)}')
print(f'二進制:{bin(decimal)}')

# 特別的運算符
result = 5 / 3
print(f'/ 是小數除:{result}')
result = 5 // 3
print(f'// 是整除:{result}')
result = 5 ** 3
print(f'**是乘方:{result}')

浮點數

Python中的浮點數,就是遵循IEEE 754的雙精度浮點數。浮點數也支持科學計數法。這里沒什么說的。

print('--------------浮點數類型--------------')
print(f'Float type:{type(3.14)}')
print(f'Float value:{3.14}')

# 各種小數
float_number = 3.1415
exp_number = 0.31415e1
print(f'float:{exp_number}')

復數

Python還有一個特點,那就是內置了復數的支持。復數字面量使用a+bj來表示。復數的實部和虛部分別用real和imag來取得。

print('--------------復數類型--------------')
complex1 = 1 + 2j
complex2 = 2 + 3j
print('復數類型:', type(complex1))
print('復數:', complex1 + complex2)
print('復數{0}的實部:{1},虛部是:{2}'.format(complex1, complex1.real, complex1.imag))
print('{0}的共軛復數是:{1}'.format(complex1, complex1.conjugate()))

布爾類型

Python支持布爾類型,真值和假值分別是TrueFalse

print('--------------布爾類型--------------')

print(f'Bool type:{type(True)}')
print(f'Bool value:{False}')

空類型

Python的空類型類似Java中的void或null。

print('--------------空類型--------------')
print(f'None type:{type(None)}')
print(f'None value:{None}')

字符串

Python字符串可以使用單引號'或雙引號"來包括。它們之間沒有任何區別。當使用一種引號的時候,字符串內部的另一種引號不需要轉義。所以如果字符串內部要包含單引號,那么我們使用雙引號包括更好。需要注意,Python字符串是不可變的

多行字符串使用三個連續的引號來表示。為了美觀,多行字符串的第一行往往另起一行,不過這樣的話第一行實際上會是個空行。如果希望不要第一行的空行,可以在多行字符串上添加一個反斜杠\。

如果字符串引號前有一個字母r,說明這個字符串是一個原始(raw)字符串,其中的\n這樣的字符不會轉義,而是以字面量形式輸出。

如果字符串引號前有一個字母f,表示這是一個格式化字符串。該字符串中的{variable}將會被實際的變量值所替換。該功能是Python 3.6中新增的。原始字符串和格式化字符串也可以混用。

下面是一些例子。

print('--------------字符串類型--------------')
print(f'String type:{type("")}')
print(f'string value:{"fuck"}')

multiLineString = '''\
這是一個多行字符串
首行的\\表示第一行被忽略
'''
print(multiLineString)

rawString = r"\n不會被轉移"
print(f'原始字符串:{rawString}')

formattedString = f"{3.14}"
print(f'格式化字符串:{formattedString}')

列表

列表也是一種內置可變的數據結構,類似Java的List。Python的列表使用也很簡單。新建列表需要空的一對方括號[]或者list()來新建一個空列表。列表有很多方法可以操作列表中的元素。直接看例子就行了。

print('--------------列表--------------')
# 新建列表
list1 = []
list2 = list()

# 插入元素
list1.append(1)
list1.append(2)
list1.extend(range(3, 6))
list1.insert(2, 9)

print(f'插入元素 list1:{list1}')

# 刪除元素
list1.remove(5)
del list1[2]
print(f'刪除元素 list1:{list1}')

# 清除列表
list1.clear()
print(f'清除列表 list1:{list1}')

# 棧操作
list2.append(1)
list2.append(2)
list2.pop()
print(f'list2:{list2}')

元組

元組和列表類似,不過需要注意,元組是不可變的。元組的主要作用就是讓函數方便的返回多個值。創建空元組,可以使用()或者tuple()來創建。需要注意假如元組只有一個元素,那么需要在后面添加一個逗號。元組的值也可以方便的解構出來。

print('--------------元組--------------')
print(f'tuple type:{type((5,))}')

tuple1 = ()
tuple1 = tuple()
tuple2 = (1, 2, 3, 4, 5)
tuple3 = (50,)
tuple2 = (5, 6)
a, b = tuple2
print(f'a={a},b={b}')

集合

集合表示不重復的元素組合。要創建集合,只要把元素放到一對花括號中即可。如果需要空集合,不能使用{},而應該使用set()來創建。如果需要不可變集合,使用frozenset。集合的簡單使用列在下面了。

print('--------------集合--------------')
print(f'set type:{type(set())}')

set1 = set()
set2 = {1, 2, 3, 4}

# 添加元素
set1.add(3)
set1.add(4)
set1.add(9)
print(f'set1 :{set1}')

# 刪除元素
set1.remove(4)

# 不可變集合
set1 = frozenset(set1)

# 集合操作
print(f'交:{set1 & set2}')
print(f'并:{set1 | set2}')
print(f'差:{set1 - set2}')
print(f'對稱差集:{set1 ^ set2}')

字典

字典是鍵值對的集合,類似于Java中的Map類型。需要注意的是Python的字典的鍵必須是不可變類型,也就是說鍵必須是數字、元組、字符串這樣的對象才行。由于列表等類型是可變的,所以它們不能用作鍵。

創建字典使用空花括號對{}或者dict()構造函數。字典也包含了各種方法用于對元素進行操作。值得注意的幾個字典的函數:keys()返回鍵列表;values()返回值列表;items()返回鍵值對組成的列表。

print('--------------字典--------------')
print(f'dict type:{type({})}')

# 創建字典
dict1 = {}
dict2 = dict()
dict2 = {1: 2, 2: 4, 3: 6}

# 字典操作
dict1[1] = 1
dict1[2] = 2
print(f'dict1:{dict1}')

dict1[2] = 3
print(f'dict1:{dict1}')

del dict1[2]
print(f'dict1:{dict1}')

# 鍵值集合
print(f'dict2.keys:{dict2.keys()}')
print(f'dict2.values{dict2.values()}')
for k, v in dict2.items():
    print(f"[{k}:{v}]", end=' ')
print()

集合操作

序列類型

前面說的列表、元組、字符串這些都是序列類型。它們支持功能強大的切片操作。切片操作使用切片操作符[:],會返回對應開閉區間的元素集合。如果只指定了一邊的索引,那么另外一邊自動擴展到端點處。

索引還可以是負數,表示從后往前數,最后一個元素索引是-1,倒數第二個是-2,以此類推。另外如果索引超出序列范圍也不用擔心,解釋器會忽略多余的長度。

print('--------------序列類型--------------')
longString = 'abcdefghijklnm'

print(f'整個序列:{longString[:]}')
print(f'前5個:{longString[0:5]}')
print(f'后5個:{longString[-6:-1]}')
print(f'前五個之后的所有:{longString[6:]}')
print(f'后五個前面所有的:{longString[:-6]}')
print(f'所有元素:{longString[0:1000]}')

字符串、元組都是不可變的對象。所以它們的切片只能用來讀取。如果是列表的話,我們還可以修改切片的值。下面的代碼就將列表的一個切片修改為另一個列表。

longList = [1, 2, 2, 3, 4, 56, 6, 7, 8, 9, 0]

print(f'longList:{longList}')
longList[0:3] = [5]
print(f'longList:{longList}')

列表解析

python的列表還支持一種復雜的操作,叫做列表解析。它可以使用一個序列生成另一個列表,靈活使用的話功能非常強大。列表解析需要使用for循環語法。下面是一個將列表轉換為平方列表的例子。

squareList = [i * i for i in range(1, 10)]

它與下面的for循環等價,但是寫法更簡潔。

for i in range(1,10):
    squareList.append(i*i)

Python官方教程上有幾個更復雜的例子。例如,列表解析還可以解析多個變量,以及if表達式。

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

上面的列表解析表達式與下面的等價。

>>> for x in [1,2,3]:
...     for y in [3,1,4]:
...         if x != y:
...             combs.append((x, y))
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容