Python對象的基本概念
對象是Python中最基本概念。Python程序可以分解成模塊碎绎、語句螃壤、表達式、以及對象
- 程序由模塊構成
- 模塊包含語句
- 語句包含表達式
- 表達式建立并處理對象
Python內置類型
Python的核心數(shù)據類型
- 數(shù)字 1234
- 字符串 'sad'
- 列表 [1,[2,'three'],4]
- 字典 ['food':'spam']
- 元組 (1,‘aaa’,'43')
- 文件 open('filename','r')
- 集合 set('abc')
- 其他類型 None,布爾類型
- 編程單元類型 函數(shù) 模塊 類
- 與實現(xiàn)相關的類型 編譯的代碼堆棧跟蹤
Python中的類型特點
- Python中并沒有類型聲明筋帖,運行的表達式的語法決定了創(chuàng)建和使用的對象的類型
- Python是動態(tài)類型的奸晴,它會自動地跟蹤你的類型而不是要求聲明代碼
- Python也是強類型語言,只能對一個對象進行適合該類型的有效操作
Python數(shù)據類型——數(shù)字
- Python中數(shù)字包括:整數(shù)日麸、浮點數(shù)等(復數(shù)寄啼、進制數(shù))逮光、固定精度的十進制數(shù)、有理分數(shù)墩划、集合涕刚、布爾類型、無窮的整數(shù)精度乙帮、各種數(shù)字內置函數(shù)和模塊
數(shù)字常量
基本類型中杜漠,Python提供了:整數(shù)(正整數(shù)和負整數(shù))和浮點數(shù)(帶有小數(shù)部分的數(shù)字)
在Python2.6中 整數(shù)分為:
- 一般整數(shù)(32位)
- 長整數(shù)(無窮精度)
當整數(shù)的值超過32位時會自動轉換為長整數(shù)。當需要額外的精度的時候察净,Python會自動地轉換為長整數(shù)
在Python3.0中 整數(shù)是一個單獨的類型
Python3.0中驾茴,一般整數(shù)和長整數(shù)已經合二為一了,只有整數(shù)這一種氢卡。在Python3中整數(shù)在程序中不會再用末尾的l或L表示锈至。
十六進制數(shù)、八進制和二進制常量
整數(shù)可以編寫為十進制(以10為基數(shù))异吻、十六進制(以16為基數(shù))裹赴、八進制(以8為基數(shù))和二進制(以2為技術)。
- 十六進制以0x或0X開頭诀浪,后面接十六進制的數(shù)字09和AF
- 八進制常量以數(shù)字0o或00開頭棋返,后面接著數(shù)字0~7構成的字符串
- 二進制常量 以0b或0B開頭,后面跟著二進制數(shù)字0~1
處理進制轉換的函數(shù): - oct():會將十進制數(shù)轉換為八進制數(shù)
- hex():函數(shù)會將十進制轉換為十六進制
- bin():會將十進制轉換為二進制
- 內置的Int函數(shù)會將一個數(shù)字的字符串變換為一個整數(shù)雷猪,并可以通過定義的第二個參數(shù)來確定變換后的數(shù)字的進制
int('0x40',16)
int('0b1000000',2)
- 使用eval函數(shù) 可以把字符串作為Python的代碼
eval('0o100')
復數(shù)
Python的復數(shù)常量協(xié)程實部+虛部的寫法睛竣,虛部是以j或J結尾。實部可有可無求摇,
小數(shù)數(shù)字 decimal
Python2.4介紹了一種新的核心數(shù)據類型:小數(shù)對象射沟,小數(shù)是通過一個導入的模塊調用函數(shù)后創(chuàng)建的,而不是通過運行常量表達式創(chuàng)建的与境。小數(shù)對象就像浮點數(shù)验夯。小數(shù)有固定的位數(shù)和小數(shù)點。小數(shù)是有固定的精度的浮點值摔刁。
- 看下面的情況
0.1+0.1+0.1-0.3 這樣的結果應該為0 挥转,但是在Python中運行結果卻不是0 而是接近于0
5.551115123125783e-17
如果使用小數(shù)對象來進行準確計算的話:
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3'))
>>> 0.0
decimal模塊中的其他工具可以設置所有小數(shù)數(shù)值的精度、設置錯誤處理等
import decimal
print(decimal.Decimal(1) / decimal.Decimal(7))
# 設定小數(shù)數(shù)值精度
在Python2.6之后的版本中共屈,可使用上下文管理器語句來重新設置臨時精度绑谣,在語句退出后,精度又重新設置為初始值:
decimal.getcontext().prec = 3
print(decimal.Decimal(1) / decimal.Decimal(7))
>>> 0.1428571428571428571428571429
0.143
分數(shù)類型
Python2.6和Python3.0引入了分數(shù)類型拗引,實現(xiàn)了有理數(shù)對象借宵,明確保留了一個分子和一個分母
分數(shù)的模塊為 fractions
# 分數(shù)模塊
from fractions import Fraction
x = Fraction(1, 3)
y = Fraction(4, 6)
# 通過浮點數(shù)來運算
Fraction('.25')
Fraction('1.25')
print(x)
print(y)
>>> 1/3
>>> 2/3
創(chuàng)建分數(shù)后,可以進行分數(shù)的計算
print(x + y)
print(x - y)
處理數(shù)字對象的工具
表達式操作符
- 加法
- 乘法
- **乘方
- / 除法
* 傳統(tǒng)除法和真除法 這個操作對于整數(shù)會省去小數(shù)部分矾削,在Python3.0后無論任何類型都會保持小數(shù)部分 - // floor除法 這個操作不考慮操作對象的類型壤玫,總會省略掉結果的小數(shù)部分豁护,剩下最小的能整除的整數(shù)部分
對于在Python2.x和Python3.0中,如果程序依賴于截斷整數(shù)除法垦细,在Python中都使用//择镇。//把結果向下截斷到它的下層,真正結果之下的最近整數(shù)括改。但其直接效果是向下舍入,并不是嚴格截斷家坎。對于負數(shù)來說會出現(xiàn) 5/-2=-3的情況 - >> << 移位運算
內置數(shù)學函數(shù)
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之間的任意浮點數(shù)对粪、選擇在兩個數(shù)字之間的任意整數(shù)、在一個序列中任意挑選一項
print(random.random()) # 在0-1中選擇任意浮點數(shù)
print(random.randint(1, 10)) # 選擇兩個數(shù)字之間的任意整數(shù)
print(random.choice(['a', 'b', 'c'])) # 在一個序列中任意挑選一項
公用模塊
random装蓬、math
混合操作操作符優(yōu)先級
括號分組的子表達式優(yōu)先級要大于二級運算
二級運算大于一級運算
混合類型自動升級
對于 40+3.14這類的混合運算著拭,在Python中就涉及到數(shù)字類型的復雜度:整數(shù)比浮點數(shù)簡單,浮點數(shù)比復數(shù)簡單牍帚。當一個整數(shù)與浮點數(shù)混合時儡遮。整數(shù)首先會升級轉為浮點數(shù)的值,之后通過浮點數(shù)的運算法則得到浮點數(shù)的結果暗赶。對于任何混合類型的表達式鄙币,其中一個操作對象是更為復雜的數(shù)字,則會導致其他的操作對象升級為一個復雜的數(shù)字蹂随。使得表達式獲得一個復雜數(shù)字類型的結果
Python不會在其他的類型之間進行轉換十嘿,一個字符串和一個整數(shù)相加,就會產生錯誤岳锁。在Python2.6中非數(shù)字混合類型也可以比較绩衷,但是不會執(zhí)行轉換。在Python3.0中浸锨,非數(shù)字混合類型的比較是不允許的
數(shù)字的模塊
- math模塊
math模塊包括更高級的數(shù)學工具
Python數(shù)據類型——字符串
字符串在Python中作為序列唇聘,是一個包含其他對象的有序集合,字符串是單個字符的字符串序列
字符串序列操作
- 支持各個元素包含位置順序的操作
* 索引按照從最前面的偏移量進行編碼:從0開始柱搜,第一項索引為0 第二項為1迟郎。。聪蘸。 - 反向索引
* 在Python中宪肖,我們能夠反向索引表制,從最后一個開始。
S[-1] 等效于 S[len(S)-1]
- 分片操作
分片的一般形式為X[I:J]: 表示取出在X中從偏移量為I控乾,直到但不包括偏移量為J的內容 - 合并操作
作為一個序列么介,字符串也支持使用加號進行合并,使用加號將兩個字符串合并成一個新的字符串蜕衡。貨值金額重復(通過重復一次創(chuàng)建一個新的字符串) - + 加號對不同對象有不同的意義:對于數(shù)字為加法壤短,對于字符串為合并。
- Python允許字符串包括在單引號或雙引號慨仿、三個引號中久脯。
- Python也支持原始字符串常量 不含有反斜線等轉移機制,這樣的字符串常量是以字母'r'開頭的
字符串的不可變性
字符串在Python中具有不可變性——字符串在Python中創(chuàng)建后就不能唄改變镰吆。不能通過對某某一位置進行賦值而改變字符串帘撰。可以創(chuàng)建一個新的字符串并以同一個變量名對其進行賦值
在Python中的每一個對象都可以分為不可變性或者可變性万皿。
在核心類型中摧找,數(shù)字、字符串和元組是不可變的
列表和字典是可以自由的改變牢硅。
Python變量賦值
Python變量不需要提前聲明蹬耘,當給一個變量賦值的時候就創(chuàng)建了它』缴溃可能賦的是任何類型的對象婆赠,當變量出現(xiàn)一個表達式就會用其值替換。
在使用變量的值之前必須對其賦值
返回對象的所有屬性 dir
- 可以調用內置的dir函數(shù)佳励,將會返回一個列表休里。其中包含了對象的所有屬性。由于方法是函數(shù)屬性赃承。所以函數(shù)也會在這個列表中出現(xiàn)
Python數(shù)據類型——布爾類型
Python中的布爾數(shù)據類型妙黍,叫做bool,其值為True和False瞧剖,并且其值True和False是預先定義的內置的變量名拭嫁。在內部,新的變量名True和False是bool的實例抓于,實際上僅僅是內置的整數(shù)類型int的子類做粤。True和False的行為和整數(shù)1和0是一樣的。它們是作為關鍵字True和False顯示的捉撮,而不是數(shù)字1和0
Python數(shù)據類型——列表
列表是一個任意類型的對象的位置相關的有序集合怕品。列表沒有固定的大小。
列表的序列操作
列表是序列的一種巾遭,列表支持所有的我們對字符串所討論過的序列操作
- 計算列表長度
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的列表與其他語言中的數(shù)組有些類似肉康,但列表更加強大闯估。列表沒有固定類型的約束。
- 拼接元素 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的核心數(shù)據類型支持任意嵌套。能夠以任意的組合進行嵌套
>>> 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]
列表解析表達式通過對序列中的每一項運行一個表達式來創(chuàng)建一個新列表的方法刚夺,每次一個,從左至右末捣。列表解析表達式是編寫在方括號中的光督,上面的語句的意思是:把矩陣M的每個row中的row[1]放在一個新的列表中
分析一下,上面的列表表達式 會使用for循環(huán)開始循環(huán)M塔粒,先循環(huán)出來的是1,2筐摘,3 然后將索引1放到新的列表中卒茬,再執(zhí)行下一次循環(huán) 456 取出索引為1 再執(zhí)行下一次循環(huán) 789取出索引為1 所以最終得到的列表為[2,5,8]
在最近的Python版本中,括號中的解析語法可以用來創(chuàng)建產生所需結果的生成器
G = (sum(row) for row in M)
>>> next(G)
>>> 6
>>> next(G)
>>> 15
Python數(shù)據類型——集合
Python2.4引入了一種新的類型 集合(set)咖熟,這是一些唯一的圃酵、不可變的對象的一個無序集合
- 一個項在集合中只能出現(xiàn)一次,不管添加了多少次
- 集合只能包含不可變的對象類型馍管,列表和字典不能嵌入到集合中郭赐,元組由于不可變所以可以嵌入
- 集合具有列表和字典有共同的行為
- 集合是可以迭代的
- 集合既不是序列也不是映射類型,是自成一體的類型确沸。集合本質上具有基本的數(shù)學特性
集合常量
在Python2.x中我們使用set()來創(chuàng)建一個集合捌锭。在3.0中我們創(chuàng)建集合使用內置函數(shù)來創(chuàng)建集合對象
set('1234')
{1,2,3,4}
在Python中 {}是一個字典,所以空的集合必須通過內置函數(shù)set來創(chuàng)建
Python3.0中的集合解析
Python3,0還引入了一個集合解析構造罗捎,類似于列表解析的形式观谦。集合的解析編寫在花括號中。集合解析運行一個循環(huán)并在每次迭代時收集一個表達式的結果桨菜,通過一個循環(huán)變量來訪問當前的迭代值以用于集合表達式中豁状。
print({x ** 2 for x in [1, 2, 3, 4]})
在上面這個集合解析表達式中,循環(huán)的部分寫在表達式的右邊倒得,而集合表達式編寫在左邊泻红。這個集合解析式的含義:對于列表中的每一個元素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數(shù)據類型——字典
Python中的字典:不是序列根悼,而是一種映射凶异。映射是一個其他對象的集合蜀撑。通過鍵而不是通過相對位置來存儲的。映射并沒有任何可靠的順序剩彬。
字典是Python核心對象集合中的唯一的一種映射類型酷麦,具有可變性『砹担可以隨需求增大或減小
映射操作
字典編寫在大括號中沃饶,并包含一系列的“鍵:值”對。我們可以通過鍵對這個字典進行索引來讀取或改變鍵所關聯(lián)的值轻黑。字典的索引操作使用的是和序列相同的語法糊肤,只不過在方括號中使用的是鍵,而不是相對位置
>>> D = {'food':'Spam','quantity':4,'color':'pink'}
>>> D['food']
'Spam'
>>> D['quantity']+=1
>>> D
{'food': 'Spam', 'quantity': 5, 'color': 'pink'}
字典的操作
鍵的排序
字典不是序列氓鄙,并不包含任何可靠的順序馆揉。如果我們確實需要某種順序的時候,我們常用的方法就是通過字典的key收集一個鍵的列表抖拦,然后使用列表sort方法進行排序升酣。然后使用Python的for循環(huán)逐個進行顯示
>>> 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數(shù)據類型——元組
元組tuple就像一個不可以改變的列表复颈。就像列表一樣绩聘,元組是序列,但是它具有不可變性。和字符串類似,元組編寫在圓括號中而不是方括號中风秤。支持任意類型前酿,任意嵌套
T = (1, 2, 3, 54,3)
print(len(T))
API
- index(value) 返回value在元組中對應的索引
- count(value) 返回對應的value出現(xiàn)的次數(shù)
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數(shù)據類型——文件
文件對象是Python代碼對電腦上外部文件的主要接口。沒有特定的常量語法創(chuàng)建文件。要創(chuàng)建一個文件對象,需要調用內置的open函數(shù)以字符串的形式傳遞給它一個外部的文件名以及一個處理模式的字符串会喝。
- 在當前文件夾下創(chuàng)建文件,并向它寫入文本玩郊。
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其他的數(shù)值類型:十進制數(shù)译红、分數(shù)预茄、布爾值、None(特殊的占位符對象)