一、Python課程簡介
??Python, 是一種面向?qū)ο蟮慕忉屝陀?jì)算機(jī)程序設(shè)計(jì)語言统屈,由荷蘭人Guido van Rossum于1989年發(fā)明,第一個(gè)公開發(fā)行版發(fā)行于1991年牙躺。
??Python是純粹的自由軟件愁憔, 源代碼和解釋器CPython遵循 GPL(GNU General Public License)協(xié)議。Python語法簡潔清晰孽拷,特色之一是強(qiáng)制用空白符(white space)作為語句縮進(jìn)吨掌。
??Python具有豐富和強(qiáng)大的庫。它常被昵稱為膠水語言,能夠把用其他語言制作的各種模塊(尤其是C/C++)很輕松地聯(lián)結(jié)在一起膜宋。常見的一種應(yīng)用情形是窿侈,使用Python快速生成程序的原型(有時(shí)甚至是程序的最終界面),然后對其中有特別要求的部分秋茫,用更合適的語言改寫史简,比如3D游戲中的圖形渲染模塊,性能要求特別高肛著,就可以用C/C++重寫圆兵,而后封裝為Python可以調(diào)用的擴(kuò)展類庫。需要注意的是在您使用擴(kuò)展類庫時(shí)可能需要考慮平臺問題枢贿,某些可能不提供跨平臺的實(shí)現(xiàn)殉农。
設(shè)計(jì)者開發(fā)時(shí)總的指導(dǎo)思想是,對于一個(gè)特定的問題局荚,只要有一種最好的方法來解決就好了超凳。
??Python的作者有意的設(shè)計(jì)限制性很強(qiáng)的語法,使得不好的編程習(xí)慣(例如if語句的下一行不向右縮進(jìn))都不能通過編譯危队。其中很重要的一項(xiàng)就是Python的縮進(jìn)規(guī)則聪建。
- Python 是一個(gè)高層次的結(jié)合了解釋性、編譯性茫陆、互動(dòng)性和面向?qū)ο蟮哪_本語言金麸。
- Python 的設(shè)計(jì)具有很強(qiáng)的可讀性,相比其他語言經(jīng)常使用英文關(guān)鍵字簿盅,其他語言的一些標(biāo)點(diǎn)符號挥下,它具有比其他語言更有特色語法結(jié)構(gòu)。
- Python 是一種解釋型語言(邊解釋邊執(zhí)行): 這意味著開發(fā)過程中沒有了編譯這個(gè)環(huán)節(jié)桨醋。類似于PHP和Perl語言棚瘟。
- Python 是交互式語言: 這意味著,您可以在一個(gè)Python提示符喜最,直接互動(dòng)執(zhí)行寫你的程序偎蘸。
- Python 是面向?qū)ο笳Z言: 這意味著Python支持面向?qū)ο蟮娘L(fēng)格或代碼封裝在對象的編程技術(shù)。
- Python 是初學(xué)者的語言:Python 對初級程序員而言瞬内,是一種偉大的語言迷雪,它支持廣泛的應(yīng)用程序開發(fā),從簡單的文字處理到 WWW 瀏覽器再到游戲虫蝶。
??如果對語言進(jìn)行分類章咧,那么python是一門強(qiáng)類型,動(dòng)態(tài)類型的語言(弱類型:比如int可以變成float能真,python中數(shù)值類型不可變赁严;動(dòng)態(tài)類型:編譯時(shí)不知道變量類型扰柠,python中變量無類型)。
二疼约、數(shù)值類型
??數(shù)值類型就是我們平常用來做計(jì)算的數(shù)字類型卤档,在python中有如下幾種數(shù)值類型:
??Python3 中有六個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類型:
- Number(數(shù)字)
- String(字符串)
- List(列表)
- Tuple(元組)
- Sets(集合)
- Dictionary(字典)
1. Number(數(shù)字)
??Python3 支持 int(整型)、float(浮點(diǎn)型)忆谓、bool(布爾型)裆装、complex(復(fù)數(shù))。
??在Python 3里倡缠,只有一種整數(shù)類型 int,表示為長整型茎活,沒有 python2 中的 Long昙沦。像大多數(shù)語言一樣,數(shù)值類型的賦值和計(jì)算都是很直觀的载荔。
??內(nèi)置的 type() 函數(shù)可以用來查詢變量所指的對象類型盾饮。
>>> a, b, c, d = 20, 5.5, True, 4+3j
>>> print(type(a), type(b), type(c), type(d))
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
??此外還可以用 isinstance 來判斷:
>>>a = 111
>>> isinstance(a, int) # returns True
??isinstance 和 type 的區(qū)別在于:
class A:
pass
class B(A):
pass
isinstance(A(), A) # returns True
type(A()) == A # returns True
isinstance(B(), A) # returns True
type(B()) == A # returns False
區(qū)別就是:
??type()不會認(rèn)為子類是一種父類類型。
??isinstance()會認(rèn)為子類是一種父類類型懒熙。
(1) int整型
>>> type(1) #b查看類型 int整型 結(jié)果為 <class 'int'>
>>> a=1
>>> type(a)
(2) float浮點(diǎn)型
??浮點(diǎn)型由整數(shù)部分和小數(shù)部分組成丘损,也可以使用科學(xué)計(jì)數(shù)法表示
>>> type(1.1) #查看類型 int整型 結(jié)果為 <class 'float'>
>>> a=1.1
>>> type(a)
>>> a-1 #0.10000000000009
>>> import decimal #十進(jìn)制的浮點(diǎn)型
>>> d=decimal.Decimal('1.1')
>>> a=1
>>> d-a #0.1
(3) 布爾型
>>> c=True #bool 值為1 橙色為關(guān)鍵字 得大寫
>>> type(c)
>>> c2=False #值為0 可以數(shù)字相加
>>> type(c2)
(4) 復(fù)數(shù)型
??可以用a + bj,或者complex(a,b)表示, 復(fù)數(shù)的實(shí)部a和虛部b都是浮點(diǎn)型
>>> e=1+2j #只能用j或者J表示虛部
>>> type(e) #complex型
??Python沒有專門表示虛數(shù)的類型工扎,而將虛數(shù)視為實(shí)部為零的復(fù)數(shù)徘钥。
2. 補(bǔ)充:
(1) 基本數(shù)據(jù)類型
??Python 中的變量不需要聲明。每個(gè)變量在使用前都必須賦值肢娘,變量賦值以后該變量才會被創(chuàng)建呈础,因?yàn)閜ython變量沒有默認(rèn)值。
??在 Python 中橱健,變量就是變量而钞,它沒有類型,我們所說的"類型"是變量所指的內(nèi)存中對象的類型拘荡。
??等號(=)用來給變量賦值臼节。
??等號(=)運(yùn)算符左邊是一個(gè)變量名,等號(=)運(yùn)算符右邊是存儲在變量中的值。
(2) 多個(gè)變量賦值
??Python允許你同時(shí)為多個(gè)變量賦值珊皿。例如:
>>> a = b = c = 1 #創(chuàng)建一個(gè)整型對象网缝,值為1,三個(gè)變量被分配到相同的內(nèi)存空間上亮隙。
??您也可以為多個(gè)對象指定多個(gè)變量途凫。例如:
>>> a, b, c = 1, 2, "runoob" #兩個(gè)整型對象 1 和 2 的分配給變量 a 和 b,字符串對象 "runoob" 分配給變量 c溢吻。
>>> a=1;b=2 #兩個(gè)整型對象1和2的分配給a和b
(3) 查看屬性方法
>>> dir(__builtins__) #查看屬性方法
(4) 查看所有關(guān)鍵字
①>>> import keyword #導(dǎo)入關(guān)鍵字模塊
>>> keyword.kwlist #調(diào)用屬性
②>>> help('keywords') #基礎(chǔ)階段重要的內(nèi)置函數(shù) 查看關(guān)鍵字
(5) 保存及運(yùn)行文件
①IDLE中file→new file
file→save(ctrl+s) 在彈窗中選擇路徑和填寫文件名
②Run→Run Moudle(F5) 即可在IDLE中運(yùn)行
(6) 默認(rèn)顏色說明
??紫色為內(nèi)置函數(shù)维费,例如
dir,print,type,int,list,tuple,print
??橙色為關(guān)鍵字果元,例如
True
(7) 使用del語句刪除一些對象引用
??可以通過使用del語句刪除單個(gè)或多個(gè)對象。例如:
>>> del var
>>> del var_a,var_b
3. 數(shù)值運(yùn)算
(1) 運(yùn)算符
python支持以下七種運(yùn)算符:
- 算術(shù)運(yùn)算符
- 比較(關(guān)系)運(yùn)算符
- 賦值運(yùn)算符
- 邏輯運(yùn)算符
- 位運(yùn)算符
- 成員運(yùn)算符
- 身份運(yùn)算符
① 算術(shù)運(yùn)算符
??+ - * /(數(shù)值的除法的結(jié)果是浮點(diǎn)數(shù)) //(整除犀盟,向下取整而晒,地板除法) %(取余) x**y(返回x的y次冪)
>>> q=5;w=2
>>> q//w #2 向下取整
>>> q/w #2.5
>>> a,b=9.0,2.0
>>> a//b=4.0
>>> import math #導(dǎo)入數(shù)學(xué)模塊
>>> math.ceil(5/2) #3 向上取整
>>> dir(math) #查看math的方法
>>> 5%2 #取余運(yùn)算 為1
>>> 2**4 #冪運(yùn)算 2的4次方為16
② 比較運(yùn)算符
??假設(shè)變量a為10阅畴,b為20
== 等于 (a==b)返回False
倡怎!= 不等于 (a!=b)返回Ture
> 大于 (a>b)返回False
< 小于 (a<b)返回Ture
>= 大于等于 (a>=b)返回False
<= 小于等于 (a<=b)返回Ture
??注意:python中支持連續(xù)比較钠乏,本質(zhì):通過編譯器將連續(xù)比較拆分成多個(gè)比較
③ 賦值運(yùn)算符
= += -= = /= %= *= //=
>>> a+=1 #等價(jià)于a=a+1
??在混合計(jì)算時(shí)俏拱,Python會把整型轉(zhuǎn)換成為浮點(diǎn)數(shù)。
④ 位運(yùn)算符
??位運(yùn)算符是把數(shù)字看作二進(jìn)制進(jìn)行計(jì)算的吼句。
??假設(shè)a為60锅必,b為13
??a:0011 1100 b:0000 1101
- & 按位與運(yùn)算符:若參與運(yùn)算的兩個(gè)值的兩個(gè)相應(yīng)位都為1,則該位的結(jié)果為1命辖,否則為0 (a&b)輸出結(jié)果12况毅,二進(jìn)制解釋:0000 1100
- | 按位或運(yùn)算符:只要對應(yīng)的兩個(gè)二進(jìn)制位有一個(gè)為1,結(jié)果位就為1 (a|b)輸出結(jié)果60尔艇,二進(jìn)制解釋:0011 1101
- ^ 按位異或運(yùn)算符:當(dāng)兩個(gè)對應(yīng)的二進(jìn)制位相異時(shí)尔许,結(jié)果為1 (a^b)輸出結(jié)果49,二進(jìn)制解釋:0011 0001
- ~ 按位取反運(yùn)算符:對數(shù)據(jù)的每個(gè)二進(jìn)制位取反终娃,即把1變?yōu)?味廊,把0變?yōu)? (a~b)輸出結(jié)果-61,二進(jìn)制解釋:1100 0011
- << 左移動(dòng)運(yùn)算符:運(yùn)算數(shù)的各個(gè)二進(jìn)制位全部左移若干位棠耕,由<<<右邊的數(shù)指定移動(dòng)的位數(shù)余佛,高位丟棄,低位補(bǔ)0 (a<<2)輸出結(jié)果240窍荧,二進(jìn)制解釋:1111 0000
- > > 右移動(dòng)運(yùn)算符:運(yùn)算數(shù)的各個(gè)二進(jìn)制位全部右移若干位辉巡,由<<<右邊的數(shù)指定移動(dòng)的位數(shù) (a>>2)輸出結(jié)果15,二進(jìn)制解釋:0000 1111
⑤ 邏輯運(yùn)算符
??假設(shè)a為10蕊退,b為20
- and 布爾"與":如果x為False郊楣,x and y就返回False憔恳,否則返回y的計(jì)算值
(a and b) 返回20
- or 布爾"或":如果是非0,就返回x的值净蚤,否則返回y的計(jì)算值
(a or b)返回10
- not 布爾"非":如果x為True钥组,就返回False,如果x為False今瀑,就返回True
not(a and b) 返回False
⑥ 成員運(yùn)算符
??假設(shè)a為10程梦,list=[1,2,3,4,5]
- in 如果在指定的序列中找到值,就返回True橘荠,否則返回False
print(a in list) 返回False
- not in 如果在指定的序列中沒有找到值屿附,就返回True,否則就返回False
print(a not in list) 返回True
⑦ 身份運(yùn)算符
??假設(shè)a為10哥童,b為10
- is is判斷兩個(gè)標(biāo)識符是否引用自同一個(gè)對象 print(a is b)返回True
- not is is not 用來判斷兩個(gè)標(biāo)識符是否引用自不同對象
print(a not is b) 返回False
(2) 運(yùn)算符優(yōu)先級
??表中列出了從最高到最低優(yōu)先級的所有運(yùn)算符
運(yùn)算符 | 描述 |
---|---|
** | 指數(shù)(最高級) |
~拿撩、+、- | 按位翻轉(zhuǎn)如蚜、一元加號和減號 |
*、/影暴、%错邦、// | 乘、除型宙、取模撬呢、取整除 |
+、- | 加法妆兑、減法 |
>>魂拦、<< | 右移、左移運(yùn)算符 |
& | 位與 |
^搁嗓、 | 位運(yùn)算符 |
<=芯勘、<、>腺逛、>= | 比較運(yùn)算符 |
<>荷愕、==、!= | 等于運(yùn)算符 |
=棍矛、&=安疗、/=、//=够委、-=荐类、+=、=茁帽、*= | 賦值運(yùn)算符 |
Is玉罐、is not | 身份運(yùn)算符 |
In屈嗤、not in | 成員運(yùn)算符 |
not、or厌小、and | 邏輯運(yùn)算符 |
??計(jì)算順序:默認(rèn)地恢共,運(yùn)算符優(yōu)先級表決定了哪個(gè)運(yùn)算符在別的運(yùn)算符之前計(jì)算。然而璧亚,如果你想要改變它們的計(jì)算順序讨韭,你得使用圓括號。
注意:
- 括號擁有最高優(yōu)先級癣蟋,可以強(qiáng)制表達(dá)式按照需要的順序求值
- 乘方擁有次高的優(yōu)先級
- 優(yōu)先級相同的操作按照自左向右的順序求值(乘方除外)
4. 序列類型
??數(shù)據(jù)結(jié)構(gòu)是以某種方式(如通過編號)組合起來的數(shù)據(jù)元素(如數(shù)透硝、字符乃至其他數(shù)據(jù)結(jié)構(gòu))集合。在Python中疯搅,最基本的數(shù)據(jù)結(jié)構(gòu)為序列濒生。
??Python包含6種內(nèi)建序列,即列表、元組幔欧、字符串罪治、Unicode字符串、buffer字符串礁蔗、xrange對象
- 字符串 str
- 列表 list
- 元組 tuple
<b>其中:</b> - 可變序列 list
- 不可變序列 tuple,str
??Python支持一種數(shù)據(jù)結(jié)構(gòu)的概念觉义,名為容器。容器基本上就是可包含其他對象的對象浴井。兩種主要的容器是序列(如列表和元組)和映射(如字典)晒骇。在序列中,每個(gè)元素都有編號磺浙,而在映射中洪囤,每個(gè)元素都有名稱(也叫鍵)。有一種既不是序列也不是映射的容器撕氧,它就是集合瘤缩。
(1) 字符串--string
① 單引號字符串
??Python中的字符串用單引號(')或雙引號(")括起來,同時(shí)使用反斜杠()轉(zhuǎn)義特殊字符呵曹。
>>> s1='asljf123' #'asljf123'
>>> s2='asljf' '123' #'asljf123'
② 對引號轉(zhuǎn)義
>>> s3="Hello,World!" #'Hello,World'
??在這個(gè)示例中款咖,我們使用雙引號將其括起和單引號有差別么崇猫?
>>>s4='Hello,World!' #'Hello,World'
??其實(shí)狱从,結(jié)果完全相同。為何同時(shí)支持單引號和雙引號呢佳励?
>>> s5="asd:'adffw'" #"asd:'adffw'" 引用某人說的話
>>> '"Hello!"she said' #'"Hello!"she said'
??第一個(gè)字符串包含一個(gè)單引號跨新,因此不能用單引號將整個(gè)字符串括起富腊,否則解釋器將報(bào)錯(cuò)。
??第二個(gè)字符串包含雙引號域帐,因此必須使用單引號將整個(gè)字符串括起赘被。
也可以使用反斜杠()對引號進(jìn)行轉(zhuǎn)義是整。
>>> 'Let\'s go!' #"Let's go!"
??這樣Python將明白中間的引號是字符串的一部分,而不是字符串結(jié)束的標(biāo)志民假。
>>> s6='''aaa #可以跨行
>>> ggg''' #'aaa\ngggg'
③ 拼接字符串
>>> s2='asljf' '123' #'asljf123'
??Python自動(dòng)將它們拼接起來了浮入。僅當(dāng)你同時(shí)一次輸入兩個(gè)字符串時(shí),這種機(jī)制才管用羊异。
加號 (+) 是字符串的連接符事秀, 星號 (*) 表示復(fù)制當(dāng)前字符串,緊跟的數(shù)字為復(fù)制的次數(shù)野舶。
>>> str = 'Runoob'
>>> print (str * 2) # 輸出字符串兩次 RunoobRunoob
>>> print (str + "TEST") # 連接字符串 RunoobTEST
④ 字符串標(biāo)識str和repr
??Python打印所有的字符串時(shí)易迹,都用引號將其括起。這是因?yàn)镻ython打印值時(shí)平道,保留其在代碼中的樣子睹欲,而不是你希望用戶看到的樣子。但如果用print一屋,結(jié)果將不同窘疮。
>>> "Hello,\nworld!" #'Hello,\nworld!'
>>> print("Hello,\nworld!")
#'Hello,
world!'
??通過兩種不同的機(jī)制將值轉(zhuǎn)換成了字符串。你可通過使用函數(shù)str和repr直接使用這兩種機(jī)制冀墨。使用str能以合理的方式將值轉(zhuǎn)換為用戶能夠看懂的字符串考余。
>>> print(repr("Hello,\nworld!")) #'Hello,\nworld!'
>>> print(str("Hello,\nworld!"))
#'Hello,
world!'
⑤ 長字符串
??要表示很長的字符串(跨越多行的字符串),可使用三引號轧苫。
>>> print('''This is a very long string.
It continues here.''')
??還可以使用三個(gè)雙引號。請注意疫蔓,這讓解釋器能夠識別表示字符串開始和結(jié)束位置的引號含懊,因此字符串本身可包含單引號和雙引號,無需使用反斜杠進(jìn)行轉(zhuǎn)義衅胀。
??注意:常規(guī)字符串也可跨越多行岔乔。只要在行尾加上反斜杠,反斜杠和換行符將被轉(zhuǎn)義滚躯。
>>> 1+2+\
+4+5
⑥ 原始字符串
??Python 使用反斜杠()轉(zhuǎn)義特殊字符雏门,如果你不想讓反斜杠發(fā)生轉(zhuǎn)義,可以在字符串前面添加一個(gè) r或者添加一個(gè)\掸掏,表示原始字符串茁影。
>>> print('Ru\noob') #Ru 此處有換行 oob
>>> print('Ru\\noob') #Ru\noob
>>> print(r'Ru\noob') #Ru\noob
??一個(gè)例外是,引號需要像通常那樣進(jìn)行轉(zhuǎn)義丧凤,但這意味著用于執(zhí)行轉(zhuǎn)義的反斜杠也將包含在最終的字符串中募闲。
>>> print(r(Let\'s go!')) #Let\'s go
??另外,原始字符串不能以單個(gè)反斜杠結(jié)尾愿待。
>>> print(r'C:\Program Files\foo\bar''\\')
??注意:Python 沒有單獨(dú)的字符類型即沒有char浩螺,一個(gè)字符就是長度為1的字符串靴患。
與 C 字符串不同的是,Python 字符串不能被改變要出。向一個(gè)索引位置賦值鸳君,比如word[0]='m'會導(dǎo)致錯(cuò)誤。
(2) 列表--list
??列表的內(nèi)容是可變的患蹂,即可修改其內(nèi)容或颊。
① 創(chuàng)建
??List(列表) 是 Python 中使用最頻繁的數(shù)據(jù)類型。列表可以完成大多數(shù)集合類的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)况脆。列表中元素的類型可以不相同饭宾,它支持?jǐn)?shù)字,字符串甚至可以包含列表(所謂嵌套)格了。列表是寫在方括號([])之間看铆、用逗號分隔開的元素列表。列表中的元素類型也可以不相同盛末。
>>> list = [ 'abcd', 786 , 2.23, 'runoob', 70.2 ]
>>> li=['a','b'] #list 寫在方括號之間弹惦,元素用逗號隔開
② 操作
??與Python字符串,元組不一樣的是悄但,列表中的元素是可以改變的:
a. 修改列表:給元素賦值
??使用索引表示法給特定位置的元素賦值棠隐。
>>> a = [1, 2, 3, 4, 5, 6]
>>> a[0] = 9 #變?yōu)榱薬=[9,2,3,4,5,6]
>>> a[2:5] = [] # 將對應(yīng)的元素值設(shè)置為 [] 變?yōu)榱薣9, 2, 6]
??可以對一個(gè)列表中的元素賦不同類型的值。列表a中既有int類型的值檐嚣,也有str 類型的值助泽。
>>> a[1] = 'hello' #[1, 'hello', 3, 4, 5, 6]
??不能對一個(gè)不存在元素的位置賦值,因此如果列表的長度為2嚎京,就不能給索引為100 的元素賦值嗡贺。
>>> a[7]=2 #IndexError: list assignment index out of range
??如果要賦值,可以用乘法來先進(jìn)行初始化操作鞍帝。
>>> b = [None]*5
>>> b = a + b # [1, 2, 3, 4, 5, 6, None, None, None, None, None]
>>> b[7] = 2 # [1, 2, 3, 4, 5, 6, None, 2, None, None, None]
b. 增加元素
??append()方法是一個(gè)用于在列表末尾添加新對象的方法诫睬。該方法的語法如下:
list.append(obj)
??append()方法不是簡單地返回一個(gè)修改過的新列表,而是直接修改原來的列表帕涌。
>>> a.append('ww') #a = [1, 2, 3, 4, 5, 6,'ww']
??由示例可以得知:可以往數(shù)字序列中添加字符串摄凡,也可以往字符串序列中添加數(shù)字。
c. 刪除元素
可以使用del刪除元素
>>> del a[1] #a = [1, 3, 4, 5, 6,'ww']
>>> len(a) #6
d. 給切片賦值
??切片賦值是列表一個(gè)強(qiáng)大的特性蚓曼。
>>> show=list('hi,boy')
>>> show[3:]=list('man') #['h', 'i', ',', 'm', 'a', 'n']
??這里運(yùn)用了list()強(qiáng)制類型轉(zhuǎn)換,將字符串轉(zhuǎn)換為列表亲澡。List()函數(shù)的一個(gè)功能就 是根據(jù)字符串創(chuàng)建列表,并且所有類型都適用纫版。這里可以同時(shí)給多個(gè)元素賦值谷扣。
>>> greeting=list('hi')
>>> greeting=list[1:]=list('hello') #['h','e','l','l','o']
??可將切片替換為長度與其不同的序列。
>>> field=list('ae')
>>> field[1:1]=list('bcd') #['a', 'b', 'c', 'd', 'e']
??可以在不替換任何原有元素的情況下在任意位置插入新元素。在這里会涎,替換了一個(gè) 空切片裹匙,相當(dāng)于插入了一個(gè)序列。你可以采取相反的措施來刪除切片末秃。
>>> field1=list('abcde')
>>> field1[1:4]=[] #['a','e']
??使用了前面插入操作的逆操作概页,可以對序列中任意位置的元素進(jìn)行刪除。上述代碼 與del field1[1:4]等效练慕。
f. 嵌套列表
>>> field2=['a','b','c']
>>> num=[1,2,3]
>>> mix=[field2,num] #[['a','b','c'], [1,2,3]]
>>> mix[0] #['a','b','c']
>>> mix[0][0] #'a'
??在列表中可以嵌套列表惰匙,嵌套的列表取出后還是列表。
(3) 元組--tuple
??與列表一樣铃将,元組也是序列项鬼,不同之處在于元組的元素不能修改。元組寫在小括號(())里劲阎,元素之間用逗號隔開绘盟。元組中的元素類型也可以不相同。
??因?yàn)樵M不可變悯仙,所以代碼更安全龄毡,如果可能,能用元組代替列表就盡量用元組
① 創(chuàng)建
??元組語法很簡單锡垄,只要將一些值用逗號分隔沦零,就能自動(dòng)創(chuàng)建一個(gè)元組。
>>> tuple = ( 'abcd', 786 , 2.23, 'runoob', 70.2 )
>>> tu=1,2,3 #也是元組
>>> tu=(1,2,3) #tuple
??元組還可用圓括號括起(這也是通常采用的做法)
>>> tup1 = ()
??空元組用兩個(gè)不包含任何內(nèi)容的圓括號表示
>>> (1) #變?yōu)檎土?1
>>> 42货岭, #(42,)
??包含一個(gè)值的元組的實(shí)現(xiàn)方式有一些奇特路操,必須在括號中的元素后面加一個(gè)逗號。
>>> tuple([1,2,3]) #(1,2,3)
>>> tuple('abc') #('a','b','c')
>>> tuple((1,2,3)) #(1,2,3)
??函數(shù)tuple的工作原理與list很像:它將一個(gè)序列作為參數(shù)千贯,并將其轉(zhuǎn)換為元組寻拂。如果參數(shù)已經(jīng)是元組,就原封不動(dòng)地返回它丈牢。
② 操作
a. 訪問元組
??使用下標(biāo)索引訪問
>>> mix = ('hello',1220)
>>> mix[0] #('hello')
>>> mix[0:2] #('hello',1220)
b. 修改元組
??元組中的元素值不允許修改,但可以對元組進(jìn)行連接組合
>>> field = (112,333)
>>> tu = ('hello')
>>> field + tu #(112,333, 'hello')
c. 刪除元組
??元組中的元素值不允許刪除瞄沙,但可以使用del語句刪除整個(gè)元組
>>> del field
>>> print(field) #NameError: name 'field' is not defined
d. 元組截取
??用索引截取一段元素
>>> num = (1,2,3,4)
>>> num[1:] #(2,3,4)
③ 為何要熟悉元組呢己沛?
- 它們用作映射中的鍵(以及集合的成員),而列表不行距境。
- 有些內(nèi)置函數(shù)數(shù)和方法返回元組申尼,這意味著必須跟它們打交道。只要不嘗試修改元組垫桂,與元組打交道通常意味著像處理列表一樣處理它們(需要使用元組沒有的index和count等方法時(shí)例外)师幕。
④ 指向不變
>>> t = ('a','b',['A','B'])
>>> t[2][0]='X'
>>> t[2][1]='Y'
>>> t #('a','b',['X','Y'])
??表面上看,元組的元素確實(shí)變了,其實(shí)變的不是元組的元素霹粥,而是list列表的元素灭将。元組一開始指向的list列表并沒有改成別的list列表,所以元組的不變是指每個(gè)元素的指向永遠(yuǎn)不變后控,如指向'a'就不能改成指向'b'指向一個(gè)list就不能改成指向其它對象庙曙,但指向的list列表本身是可變的。
5. 序列的通用操作
??Python中所有序列都可以進(jìn)行一些特定操作浩淘,包括索引捌朴、切片、相加张抄、相乘和成員資格檢查砂蔽。另外,Python還提供了一些內(nèi)置函數(shù)署惯,可用于確定序列的長度以及找出序列中的長度左驾、最小值和最大值。
??索引和步長都有正負(fù)之分
(1) 索引
??序列中的每個(gè)元素都分配一個(gè)數(shù)字(即編號)泽台,代表它在序列中的位置(索引)什荣,第一個(gè)索引為0,第二個(gè)是1怀酷,以此類推稻爬,-1為末尾的開始位置。
??序列中可以通過編號分別對序列的元素進(jìn)行訪問蜕依。
??獲取元素的方式為:在變量后加中括號[]桅锄,在中括號中輸入所取元素的索引(編號值)。
>>> greeting='Hello'
>>> greeting[0] #H
>>> greeting[1] #e
>>> greeting[-1] #o
??字符串是由字符組成的序列样眠,索引0指向第一個(gè)元素友瘤。Python沒有專門用于表示字符的類型,因此一個(gè)字符就是只包含一個(gè)元素的字符串檐束。
??在Python中辫秧,從左向右索引稱為正數(shù)索引,從右向左索引稱為負(fù)數(shù)索引被丧。
??對于字符串字面量(以及其他的序列字面量)盟戏,可直接對其執(zhí)行索引操作,無需先將其賦給變量甥桂。
>>> 'Hello'[0] #H
??如果函數(shù)調(diào)用返回一個(gè)序列柿究,可直接對其執(zhí)行索引操作。
>>> thirdt=input()[0]
??索引既可以對變量的引用操作黄选,也可以直接操作序列蝇摸,還可以操作函數(shù)的返回序列。
??當(dāng)索引超出范圍時(shí),Python會報(bào)一個(gè)IndexError錯(cuò)誤貌夕,即索引越界錯(cuò)誤律歼。要確保索引不越界,記得最后一個(gè)元素的索引是len(str)-1蜂嗽。
(2) 切片
??索引用來對單個(gè)元素進(jìn)行訪問苗膝,使用切片可以對一定范圍內(nèi)的元素進(jìn)行訪問,切片通過冒號相隔的兩個(gè)索引實(shí)現(xiàn)植旧。
??序列的截取(序列被截取后返回一個(gè)包含所需元素的新序列辱揭。)的語法格式如下:
變量[頭下標(biāo):尾下標(biāo)]
??第一個(gè)索引是包含的第一個(gè)元素的編號,但第二個(gè)索引是切片后余下的第一個(gè)元素的編號病附。
>>> li=['a','b','c','d','e']
>>> len(li) #計(jì)算長度
>>> li[3] #為'd'
>>> li[0:3] #為['a', 'b', 'c'] 切片 左閉右開的
??分片操作既支持正數(shù)索引问窃,也支持負(fù)數(shù)索引⊥昊Γ
??分片操作的實(shí)現(xiàn)需要提供兩個(gè)索引作為邊界域庇,第一個(gè)索引的元素包含在分片內(nèi),第二個(gè)索引的元素不包含在分片內(nèi)覆积,即左閉右開听皿。
① 絕妙的簡寫
??假設(shè)要訪問列表中的最后兩個(gè)元素:
>>> number[3:5] #['d','e']
>>> number[-100:-1] #[1, 2, 3, 4, 5, 6, 7, 8, 9]
??在這里,索引為5指的是第6個(gè)元素:它并不存在宽档,但確實(shí)是到達(dá)最后一個(gè)元素后再前進(jìn)一步所處的位置尉姨。
??分片操作不存在索引越界的問題,分片操作對不存在的編號返回空值吗冤,存在的就返回對應(yīng)值又厉。
>>> li[-3:0] #[]
??執(zhí)行切片操作時(shí),如果第一個(gè)索引指定的元素位于第二個(gè)索引指定的元素后面(在這里椎瘟,倒數(shù)第3個(gè)元素位于第1個(gè)元素后面)覆致,結(jié)果就是一個(gè)空序列。
>>> li[2:] #['c', 'd', 'e'] 輸出從第三個(gè)元素開始的所有元素
??如果切片結(jié)束于序列末尾肺蔚,可省略第二個(gè)索引煌妈。
>>> li[:2] #['a','b']
??同樣,如果切片始于序列開頭宣羊,可省略第一個(gè)索引璧诵。
>>> li[:]
??要復(fù)制整個(gè)序列,可將兩個(gè)索引都省略段只。
② 步長
??進(jìn)行切片時(shí),切片的開始和結(jié)束點(diǎn)都需要指定(無論是直接還是間接)鉴扫,用這種方式取連續(xù)的元素沒有問題赞枕,但若要取序列中不連續(xù)的元素就比較麻煩,或者直接不能操作。
??所以炕婶,Python提供了另一個(gè)參數(shù)--步長姐赡,該參數(shù)通常是隱式設(shè)置的。在普通切片中柠掂,步長是1项滑,步長不能為0。切片操作就是按照這個(gè)步長逐個(gè)遍歷序列的元素涯贞,因此切片包含起點(diǎn)和終點(diǎn)之間的所有元素枪狂。
>>> number=[1,2,3,4,5,6,7,8,9,10]
>>> number[0:10:2] #[1,3,5,7,9] 設(shè)置步長為2時(shí),得到奇數(shù)序列宋渔,其中這個(gè)2就是步長的顯示設(shè)置
>>> li[::] #['a', 'b', 'c', 'd', 'e'] 第二個(gè):后為步長 默認(rèn)為1
>>> li[::2] #['a', 'c', 'e'] 兩個(gè)走一步
??使用負(fù)數(shù)步長州疾,即從右向左提取元素。
>>> li[5:0:-1] #['e', 'd', 'c', 'b']
>>> li[0:5:-1] #[] 拿不到東西
>>> li[-1:-6:-1] #['e', 'd', 'c', 'b', 'a']
>>> li[-3:-5:-1] #['c', 'b']
??對于正數(shù)步長皇拣,Python會從序列的頭部開始向右提取元素严蓖,直到最后一個(gè)元素;
??對于負(fù)數(shù)步長氧急,則是從序列的尾部開始向左提取元素颗胡,直到第一個(gè)元素。
??正數(shù)步長必須讓開始點(diǎn)小于結(jié)束點(diǎn)吩坝,而負(fù)數(shù)步長必須讓開始點(diǎn)大于結(jié)束點(diǎn)毒姨。
>>> li[5:0:-1] #['e', 'd', 'c', 'b'] #設(shè)置第二個(gè)索引為0,取不到序列中的第一個(gè)元素
>>> li[5::-1] #['e', 'd', 'c', 'b', 'a']
??使用負(fù)數(shù)步長時(shí)钾恢,設(shè)置第二個(gè)索引為空才可以取到序列的第一個(gè)元素手素。
(3) 序列相加
??使用加號可以進(jìn)行序列的連接操作。
>>> [1,2,4]+[4,5,6] #[1,2,4,4,5,6]
>>> 'sssdd'+'qqqeee' #'sssddqqqeee'
>>> [1]+ 'a' #TypeError: can only concatenate list (not "str") to list
??只有類型相同的序列才能通過加號進(jìn)行序列連接操作瘩蚪,不同類型的序列不能通過加號進(jìn)行序列連接操作泉懦。
(4) 乘法
?將序列與數(shù)x相乘時(shí),將重復(fù)這個(gè)序列x次來創(chuàng)建一個(gè)新序列疹瘦。
>>> 'h'*5 #'hhhhh'
>>> [1]*3 #[1,1,1]
??如果要?jiǎng)?chuàng)建一個(gè)重復(fù)序列崩哩,就可以像上面的示例一樣乘以一個(gè)想要得到的序列長度的數(shù)字,這樣就可以快速得到需要的列表言沐,非常方便邓嘹。
??空列表是使用不包含任何內(nèi)容的兩個(gè)方括號([])表示的,表示里面什么東西都沒有险胰。如果創(chuàng)建一個(gè)占用10個(gè)或更多元素的空間汹押,卻不包括任何有用內(nèi)容的列表,該怎么辦呢起便?做法是使用[0]*10棚贾,浙江創(chuàng)建一個(gè)包含10個(gè)0的列表窖维。
??如果要初始化一個(gè)長度為x的序列,就需要讓每個(gè)編碼位置上都是空值妙痹,此時(shí)需要一個(gè)值代表空值铸史,即里面沒有任何元素,可以使用None怯伊。None是Python的內(nèi)建值琳轿,表示什么都沒有。因此耿芹,要將列表的長度初始化成5崭篡,可以這樣做。
>>> sq=[None]*5 #[None, None, None, None, None]
??Python中的序列懲罰可以幫助我們快速做一些初始化操作猩系。
(5) 成員資格
??要檢查特定的值是否包含在序列中媚送,可使用運(yùn)算符in和not in。
??in運(yùn)算符用于檢驗(yàn)?zāi)硞€(gè)條件是否為真寇甸,并返回檢驗(yàn)結(jié)果塘偎,滿足時(shí)返回True,不滿足時(shí)返回False拿霉。這種運(yùn)算符稱作布爾運(yùn)算符吟秩,返回的值叫布爾值。
>>> li='lucky'
>>> 'lucky' in li #Ture
>>> 'lucky' not in #False
>>> number=[1,2,3,4,5]
>>> 'a' in number #False
>>> 3 in li #TypeError: 'in <string>' requires string as left operand, not int
??數(shù)字類型不能在字符串類型中通過in進(jìn)行成員資格檢測绽淘,而字符串類型可以在數(shù)字列表中通過in進(jìn)行成員資格檢測涵防。
>>> subject = '$$$ Get rich now!!! $$$'
>>> '$$$' in subject #True
??檢查字符串變量subject是否包含字符串'$$$',這可用于垃圾郵件過濾器中。
(6) 長度沪铭、最小值和最大值
??對應(yīng)的內(nèi)建函數(shù)分別是len壮池、max和min,其中函數(shù)len返回序列包含的元素個(gè)數(shù)杀怠,而min和max分別返回序列中最小和最大的元素椰憋。
>>> len(number) #5
>>> max(1,1,2,3,4) #4
??max和min函數(shù)的參數(shù)可以是多個(gè)數(shù)字直接作為參數(shù)。
(7) 數(shù)據(jù)類型的轉(zhuǎn)換
??有時(shí)候赔退,我們需要對數(shù)據(jù)內(nèi)置的類型進(jìn)行轉(zhuǎn)換橙依,數(shù)據(jù)類型的轉(zhuǎn)換,你只需要將數(shù)據(jù)類型作為函數(shù)名即可硕旗。以下幾個(gè)內(nèi)置的函數(shù)可以執(zhí)行數(shù)據(jù)類型之間的轉(zhuǎn)換窗骑。這些函數(shù)返回一個(gè)新的對象,表示轉(zhuǎn)換的值漆枚。
函數(shù) | 描述 |
---|---|
int(x [,base]) | 將x轉(zhuǎn)換為一個(gè)整數(shù) |
float(x) | 將x轉(zhuǎn)換到一個(gè)浮點(diǎn)數(shù) |
complex(real [,imag]) | 創(chuàng)建一個(gè)復(fù)數(shù) |
str(x) | 將對象 x 轉(zhuǎn)換為字符串 |
repr(x) | 將對象 x 轉(zhuǎn)換為表達(dá)式字符串 |
eval(str) | 用來計(jì)算在字符串中的有效Python表達(dá)式,并返回一個(gè)對象 |
tuple(s) | 將序列 s 轉(zhuǎn)換為一個(gè)元組 |
list(s) | 將序列 s 轉(zhuǎn)換為一個(gè)列表 |
set(s) | 轉(zhuǎn)換為可變集合 |
dict(d) | 創(chuàng)建一個(gè)字典创译。d 必須是一個(gè)序列 (key,value)元組。 |
frozenset(s) | 轉(zhuǎn)換為不可變集合 |
chr(x) | 將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)字符 |
ord(x) | 將一個(gè)字符轉(zhuǎn)換為它的整數(shù)值 |
hex(x) | 將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)十六進(jìn)制字符串 |
oct(x) | 將一個(gè)整數(shù)轉(zhuǎn)換為一個(gè)八進(jìn)制字符串 |
>>> a=int(1.1) #a為1
>>> list('abc') #['a', 'b', 'c']
6. 變量命名規(guī)則
??變量命名由字母墙基,數(shù)字软族,下劃線組成辛藻。不能以數(shù)字開頭。不能用關(guān)鍵字互订。
>>> import keyword
>>> keyword.kwlist
>>> ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if',
'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
7. 編碼來源
??由于計(jì)算機(jī)最早是美國人發(fā)明的,因此最早只有127個(gè)字母被編碼到計(jì)算機(jī)里痘拆,也就是大小寫英文字母仰禽、數(shù)字和一些符號,這個(gè)編碼表被稱為ASCII編碼
??要處理中文纺蛆,顯然一個(gè)字節(jié)是不夠的吐葵,至少需要兩個(gè)字節(jié),而且不能和ASCII編碼沖突桥氏,所以中國指定了GB2312編碼温峭,用來把中文編進(jìn)去
??所以各國有各國的標(biāo)準(zhǔn),Unicode把所有語言都統(tǒng)一到一套編碼里字支,這樣就不會有亂碼問題了
??下面我們來看ASCII編碼和Unicode編碼的區(qū)別:ASCII編碼是1個(gè)字節(jié)凤藏,而Unicode編碼通常是兩個(gè)字節(jié)
??新的問題又出現(xiàn)了,如果統(tǒng)一成Unicode編碼堕伪,亂碼問題從此消失了揖庄。但是寫的文本基本上全部是英文時(shí),用Unicode編碼比ASCII編碼多一倍存儲空間欠雌,在存儲和傳輸上十分不劃算
??所以出現(xiàn)了把Unicode編碼轉(zhuǎn)化為"可變長編碼"的UTF-8編碼蹄梢。UTF-8編碼把一個(gè)Unicode字符根據(jù)不同的數(shù)字大小編碼成16個(gè)字節(jié),常用的英文字母被編碼成1個(gè)字節(jié)富俄,漢字通常是3個(gè)字節(jié)禁炒,只有很生僻的字符才會被編碼成46個(gè)字節(jié)
??UTF-8編碼有一個(gè)額外的好處,就是ASCII編碼實(shí)際上可以看成是UTF-8的一部分
??現(xiàn)在我們可以總結(jié)一下現(xiàn)在計(jì)算機(jī)系統(tǒng)通用的字符編碼工作方式:在計(jì)算機(jī)內(nèi)存中霍比,統(tǒng)一使用Unicode編碼幕袱,當(dāng)需要保存到硬盤或需要傳輸時(shí),可以轉(zhuǎn)換為UTF-8編碼
??python用的就是UTF-8的
8. 注釋
??注釋必須以"#"符號開始桂塞,在代碼中凹蜂,井號后面到行尾的所有內(nèi)容都將被忽略。
??注釋可以獨(dú)占一行阁危,也可以放在語句行的末尾玛痊。
??注釋最重要的用途在于解釋代碼并不顯而易見的特性