Python對象的基本概念
對象是Python中最基本概念。Python程序可以分解成模塊、語句、表達式、以及對象
- 程序由模塊構成
- 模塊包含語句
- 語句包含表達式
- 表達式建立并處理對象
Python內置類型
Python的核心數據類型
- 數字 1234
- 字符串 'sad'
- 列表 [1,[2,'three'],4]
- 字典 ['food':'spam']
- 元組 (1,‘aaa’,'43')
- 文件 open('filename','r')
- 集合 set('abc')
- 其他類型 None,布爾類型
- 編程單元類型 函數 模塊 類
- 與實現相關的類型 編譯的代碼堆棧跟蹤
Python中的類型特點
- Python中并沒有類型聲明,運行的表達式的語法決定了創建和使用的對象的類型
- Python是動態類型的,它會自動地跟蹤你的類型而不是要求聲明代碼
- Python也是強類型語言,只能對一個對象進行適合該類型的有效操作
Python數據類型——數字
- Python中數字包括:整數、浮點數等(復數、進制數)、固定精度的十進制數、有理分數、集合、布爾類型、無窮的整數精度、各種數字內置函數和模塊
數字常量
基本類型中,Python提供了:整數(正整數和負整數)和浮點數(帶有小數部分的數字)
在Python2.6中 整數分為:
- 一般整數(32位)
- 長整數(無窮精度)
當整數的值超過32位時會自動轉換為長整數。當需要額外的精度的時候,Python會自動地轉換為長整數
在Python3.0中 整數是一個單獨的類型
Python3.0中,一般整數和長整數已經合二為一了,只有整數這一種。在Python3中整數在程序中不會再用末尾的l或L表示。
十六進制數、八進制和二進制常量
整數可以編寫為十進制(以10為基數)、十六進制(以16為基數)、八進制(以8為基數)和二進制(以2為技術)。
- 十六進制以0x或0X開頭,后面接十六進制的數字09和AF
- 八進制常量以數字0o或00開頭,后面接著數字0~7構成的字符串
- 二進制常量 以0b或0B開頭,后面跟著二進制數字0~1
處理進制轉換的函數: - oct():會將十進制數轉換為八進制數
- hex():函數會將十進制轉換為十六進制
- bin():會將十進制轉換為二進制
- 內置的Int函數會將一個數字的字符串變換為一個整數,并可以通過定義的第二個參數來確定變換后的數字的進制
int('0x40',16)
int('0b1000000',2)
- 使用eval函數 可以把字符串作為Python的代碼
eval('0o100')
復數
Python的復數常量協程實部+虛部的寫法,虛部是以j或J結尾。實部可有可無,
小數數字 decimal
Python2.4介紹了一種新的核心數據類型:小數對象,小數是通過一個導入的模塊調用函數后創建的,而不是通過運行常量表達式創建的。小數對象就像浮點數。小數有固定的位數和小數點。小數是有固定的精度的浮點值。
- 看下面的情況
0.1+0.1+0.1-0.3 這樣的結果應該為0 ,但是在Python中運行結果卻不是0 而是接近于0
5.551115123125783e-17
如果使用小數對象來進行準確計算的話:
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3'))
>>> 0.0
decimal模塊中的其他工具可以設置所有小數數值的精度、設置錯誤處理等
import decimal
print(decimal.Decimal(1) / decimal.Decimal(7))
# 設定小數數值精度
在Python2.6之后的版本中,可使用上下文管理器語句來重新設置臨時精度,在語句退出后,精度又重新設置為初始值:
decimal.getcontext().prec = 3
print(decimal.Decimal(1) / decimal.Decimal(7))
>>> 0.1428571428571428571428571429
0.143
分數類型
Python2.6和Python3.0引入了分數類型,實現了有理數對象,明確保留了一個分子和一個分母
分數的模塊為 fractions
# 分數模塊
from fractions import Fraction
x = Fraction(1, 3)
y = Fraction(4, 6)
# 通過浮點數來運算
Fraction('.25')
Fraction('1.25')
print(x)
print(y)
>>> 1/3
>>> 2/3
創建分數后,可以進行分數的計算
print(x + y)
print(x - y)
處理數字對象的工具
表達式操作符
- 加法
- 乘法
- **乘方
- / 除法
* 傳統除法和真除法 這個操作對于整數會省去小數部分,在Python3.0后無論任何類型都會保持小數部分 - // floor除法 這個操作不考慮操作對象的類型,總會省略掉結果的小數部分,剩下最小的能整除的整數部分
對于在Python2.x和Python3.0中,如果程序依賴于截斷整數除法,在Python中都使用//。//把結果向下截斷到它的下層,真正結果之下的最近整數。但其直接效果是向下舍入,并不是嚴格截斷。對于負數來說會出現 5/-2=-3的情況 - >> << 移位運算
內置數學函數
pow、abs、round、int、hex、bin
import math
print(math.pi, math.e)
# sin
print(math.sin(2 * math.pi / 180))
# 平方根
print(math.sqrt(144))
# 計算冪
print(pow(3, 4))
# 絕對值
print(abs(-25))
# 求和
print(sum((1, 2, 3, 4, 2, 2, 1)))
# 查找最大值
print(max((3, 4, 5, 6, 1, 9)))
# 查找最小值
print(min((1, 3, 5, 4, 9, 8)))
# 截斷
print(math.floor(2.6)) >>>2
# 取舍
print(round(2.6)) >>>3
# 真除
print(math.trunc(2.3333))
## Python計算平方根
math.sprt(144)
144** 0.5
pow(144,.5) 內置方法
- random
標準庫中的random模塊,可以選出在0和1之間的任意浮點數、選擇在兩個數字之間的任意整數、在一個序列中任意挑選一項
print(random.random()) # 在0-1中選擇任意浮點數
print(random.randint(1, 10)) # 選擇兩個數字之間的任意整數
print(random.choice(['a', 'b', 'c'])) # 在一個序列中任意挑選一項
公用模塊
random、math
混合操作操作符優先級
括號分組的子表達式優先級要大于二級運算
二級運算大于一級運算
混合類型自動升級
對于 40+3.14這類的混合運算,在Python中就涉及到數字類型的復雜度:整數比浮點數簡單,浮點數比復數簡單。當一個整數與浮點數混合時。整數首先會升級轉為浮點數的值,之后通過浮點數的運算法則得到浮點數的結果。對于任何混合類型的表達式,其中一個操作對象是更為復雜的數字,則會導致其他的操作對象升級為一個復雜的數字。使得表達式獲得一個復雜數字類型的結果
Python不會在其他的類型之間進行轉換,一個字符串和一個整數相加,就會產生錯誤。在Python2.6中非數字混合類型也可以比較,但是不會執行轉換。在Python3.0中,非數字混合類型的比較是不允許的
數字的模塊
- math模塊
math模塊包括更高級的數學工具
Python數據類型——字符串
字符串在Python中作為序列,是一個包含其他對象的有序集合,字符串是單個字符的字符串序列
字符串序列操作
- 支持各個元素包含位置順序的操作
* 索引按照從最前面的偏移量進行編碼:從0開始,第一項索引為0 第二項為1。。。 - 反向索引
* 在Python中,我們能夠反向索引,從最后一個開始。
S[-1] 等效于 S[len(S)-1]
- 分片操作
分片的一般形式為X[I:J]: 表示取出在X中從偏移量為I,直到但不包括偏移量為J的內容 - 合并操作
作為一個序列,字符串也支持使用加號進行合并,使用加號將兩個字符串合并成一個新的字符串。貨值金額重復(通過重復一次創建一個新的字符串) - + 加號對不同對象有不同的意義:對于數字為加法,對于字符串為合并。
- Python允許字符串包括在單引號或雙引號、三個引號中。
- Python也支持原始字符串常量 不含有反斜線等轉移機制,這樣的字符串常量是以字母'r'開頭的
字符串的不可變性
字符串在Python中具有不可變性——字符串在Python中創建后就不能唄改變。不能通過對某某一位置進行賦值而改變字符串??梢詣摻ㄒ粋€新的字符串并以同一個變量名對其進行賦值
在Python中的每一個對象都可以分為不可變性或者可變性。
在核心類型中,數字、字符串和元組是不可變的
列表和字典是可以自由的改變。
Python變量賦值
Python變量不需要提前聲明,當給一個變量賦值的時候就創建了它??赡苜x的是任何類型的對象,當變量出現一個表達式就會用其值替換。
在使用變量的值之前必須對其賦值
返回對象的所有屬性 dir
- 可以調用內置的dir函數,將會返回一個列表。其中包含了對象的所有屬性。由于方法是函數屬性。所以函數也會在這個列表中出現
Python數據類型——布爾類型
Python中的布爾數據類型,叫做bool,其值為True和False,并且其值True和False是預先定義的內置的變量名。在內部,新的變量名True和False是bool的實例,實際上僅僅是內置的整數類型int的子類。True和False的行為和整數1和0是一樣的。它們是作為關鍵字True和False顯示的,而不是數字1和0
Python數據類型——列表
列表是一個任意類型的對象的位置相關的有序集合。列表沒有固定的大小。
列表的序列操作
列表是序列的一種,列表支持所有的我們對字符串所討論過的序列操作
- 計算列表長度
len(L)
3
- 切片操作
L[:-1]
[123, 'span']
- 拼接字符串形成一個新的字符串
>>> L+[1,3,4,5,6]
[123, 'span', 1.2345, 1, 3, 4, 5, 6]
>>> L
[123, 'span', 1.2345]
類型的特定操作
Python的列表與其他語言中的數組有些類似,但列表更加強大。列表沒有固定類型的約束。
- 拼接元素 append方法擴充了列表的大小并在列表的尾部插入一項
>>> L.append('hello')
>>> L
[123, 'span', 1.2345, 'hello']
- 移除給定偏移量的一項pop
>>> L.pop(2)
1.2345
>>> L
[123, 'span', 'hello']
* sort 按照升序對列表進行排序
* reverse對列表進行翻轉
邊界檢查
列表沒有固定大小,Python不允許引用不存在的元素。超出列表末尾之外的索引會導致錯誤
>>> L[99]
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
L[99]
IndexError: list index out of range
>>> L[99]=1
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
L[99]=1
IndexError: list assignment index out of range
嵌套
Python的核心數據類型支持任意嵌套。能夠以任意的組合進行嵌套
>>> M = [[1,2,3],[4,5,6],[7,8,9]]
>>> M[1]
[4, 5, 6]
列表解析
Python中還有更高級的列表操作,稱作列表解析表達式
>>> col2 = [row[1] for row in M]
>>> col2
[2, 5, 8]
列表解析表達式通過對序列中的每一項運行一個表達式來創建一個新列表的方法,每次一個,從左至右。列表解析表達式是編寫在方括號中的,上面的語句的意思是:把矩陣M的每個row中的row[1]放在一個新的列表中
分析一下,上面的列表表達式 會使用for循環開始循環M,先循環出來的是1,2,3 然后將索引1放到新的列表中,再執行下一次循環 456 取出索引為1 再執行下一次循環 789取出索引為1 所以最終得到的列表為[2,5,8]
在最近的Python版本中,括號中的解析語法可以用來創建產生所需結果的生成器
G = (sum(row) for row in M)
>>> next(G)
>>> 6
>>> next(G)
>>> 15
Python數據類型——集合
Python2.4引入了一種新的類型 集合(set),這是一些唯一的、不可變的對象的一個無序集合
- 一個項在集合中只能出現一次,不管添加了多少次
- 集合只能包含不可變的對象類型,列表和字典不能嵌入到集合中,元組由于不可變所以可以嵌入
- 集合具有列表和字典有共同的行為
- 集合是可以迭代的
- 集合既不是序列也不是映射類型,是自成一體的類型。集合本質上具有基本的數學特性
集合常量
在Python2.x中我們使用set()來創建一個集合。在3.0中我們創建集合使用內置函數來創建集合對象
set('1234')
{1,2,3,4}
在Python中 {}是一個字典,所以空的集合必須通過內置函數set來創建
Python3.0中的集合解析
Python3,0還引入了一個集合解析構造,類似于列表解析的形式。集合的解析編寫在花括號中。集合解析運行一個循環并在每次迭代時收集一個表達式的結果,通過一個循環變量來訪問當前的迭代值以用于集合表達式中。
print({x ** 2 for x in [1, 2, 3, 4]})
在上面這個集合解析表達式中,循環的部分寫在表達式的右邊,而集合表達式編寫在左邊。這個集合解析式的含義:對于列表中的每一個元素x,給出包含x的平方的一個新的集合
再來看一個栗子:集合解析也可以迭代其他類型的對象,例如:字符串
print({x for x in 'hello world'})
>>> {'r', 'h', ' ', 'd', 'w', 'o', 'l', 'e'}
print({c * 4 for c in 'hello'})
>>> {'hhhh', 'eeee', 'oooo', 'llll'}
集合的用途
集合由于每項在集合中只能存在集合中存儲一次,集合可以用來把重復項從其他集合中過濾掉。直接把集合轉換為一個集合
L = [1, 2, 1, 3, 2, 4, 5]
s1 = set(L)
print(s1)
L = list(s1)
print(L)
Python數據類型——字典
Python中的字典:不是序列,而是一種映射。映射是一個其他對象的集合。通過鍵而不是通過相對位置來存儲的。映射并沒有任何可靠的順序。
字典是Python核心對象集合中的唯一的一種映射類型,具有可變性。可以隨需求增大或減小
映射操作
字典編寫在大括號中,并包含一系列的“鍵:值”對。我們可以通過鍵對這個字典進行索引來讀取或改變鍵所關聯的值。字典的索引操作使用的是和序列相同的語法,只不過在方括號中使用的是鍵,而不是相對位置
>>> D = {'food':'Spam','quantity':4,'color':'pink'}
>>> D['food']
'Spam'
>>> D['quantity']+=1
>>> D
{'food': 'Spam', 'quantity': 5, 'color': 'pink'}
字典的操作
鍵的排序
字典不是序列,并不包含任何可靠的順序。如果我們確實需要某種順序的時候,我們常用的方法就是通過字典的key收集一個鍵的列表,然后使用列表sort方法進行排序。然后使用Python的for循環逐個進行顯示
>>> Ks = list(D.keys())
>>> Ks
['food', 'quantity', 'color']
對鍵的列表進行排序
>>> Ks.sort()
>>> ks
['color', 'food', 'quantity']
按照排序后的鍵來顯示字典的元素
>>> for key in Ks:
print(key,'->',D[key])
color -> pink
food -> Spam
quantity -> 5
判斷鍵是否存在 if測試
盡管我們能夠通過給新的鍵賦值來擴展字典,但是獲取一個不存在的鍵值仍然是一個錯誤
但是在某些情況下我們并不是總知道當前的字典中存在什么鍵,我們就需要先測試鍵是否存在。
in關系表達式允許我們查詢字典中一個鍵是否存在。并可以使用if進行判斷
>>> 'food' in D
True
>>> 'foot' in D
False
Python數據類型——元組
元組tuple就像一個不可以改變的列表。就像列表一樣,元組是序列,但是它具有不可變性。和字符串類似,元組編寫在圓括號中而不是方括號中。支持任意類型,任意嵌套
T = (1, 2, 3, 54,3)
print(len(T))
API
- index(value) 返回value在元組中對應的索引
- count(value) 返回對應的value出現的次數
print(T.count(3))
>>> 2
元組類型的混合嵌套
TA = ('spam', 3.0, [11, 22, 33])
print(TA[0])
print(TA[2][2])
>>> spam
>>> 33
元組的長度不可以增長或縮短,因為元組是不可變的
···
TA.append(33)
會報AttributeError錯誤
···
Python數據類型——文件
文件對象是Python代碼對電腦上外部文件的主要接口。沒有特定的常量語法創建文件。要創建一個文件對象,需要調用內置的open函數以字符串的形式傳遞給它一個外部的文件名以及一個處理模式的字符串。
- 在當前文件夾下創建文件,并向它寫入文本。
f = open('test.txt', 'w')
f.write('Hello\n')
f.write('world\n')
f.close()
- 再讀出寫入的文件內容
f = open('test.txt', 'r')
text = f.read()
print(text)
tips:Python讀取一個文件的最佳方式是不讀它,文件提供了一個迭代器。我們可以使用迭代器來進行讀取
其他核心類型
Python其他的數值類型:十進制數、分數、布爾值、None(特殊的占位符對象)