廖雪峰:Python教程
1.因?yàn)橛?jì)算機(jī)只能處理數(shù)字氛改,如果要處理文本些举,就必須先把文本轉(zhuǎn)換為數(shù)字才能處理馒吴。最早的計(jì)算機(jī)在設(shè)計(jì)時(shí)采用8個(gè)比特bit
作為一個(gè)字節(jié)勇垛,所以脖母,一個(gè)字節(jié)能表示的最大整數(shù)就是255,如果要表示更大的整數(shù)闲孤,就需要更多的字節(jié)谆级。
2.處理中文時(shí)一個(gè)字節(jié)顯然是不夠的,至少需要兩個(gè)字節(jié)崭放,而且還不能和ASCII
編碼沖突哨苛,所有,中國(guó)制定了GB3212
(國(guó)標(biāo))編碼币砂,用來(lái)把中文編進(jìn)去建峭。
3.各國(guó)有各國(guó)的標(biāo)準(zhǔn),就會(huì)不可避免地出現(xiàn)沖突决摧,因此亿蒸,Unicode
(萬(wàn)國(guó)碼)應(yīng)運(yùn)而生,Unicode
把所有語(yǔ)言都統(tǒng)一到一套編碼里掌桩,這樣就不會(huì)再有亂碼問(wèn)題边锁。Unicode
標(biāo)準(zhǔn)中,最常用的使用兩個(gè)字節(jié)表示一個(gè)字符(如果用到非常偏僻的字符波岛,則需要4個(gè)字節(jié))茅坛。
4.ASCII
編碼和Unicode
編碼的區(qū)別:
①ASCII
編碼是1個(gè)字節(jié)。
②Unicode
編碼通常是2個(gè)字節(jié)则拷。
5.UTF-8
編碼誕生的原因贡蓖?
①字符A
用ASCII
編碼是十進(jìn)制的65
曹鸠,二進(jìn)制的01000001
。如果把ASCII
編碼的A
用Unicode
編碼斥铺,只需要在前面補(bǔ)8
個(gè)0
即可彻桃。
②如果統(tǒng)一換成Unicode
編碼,亂碼的問(wèn)題就迎刃而解了晾蜘。但是邻眷,如果你寫(xiě)的文本基本上都是英文的話,用Unicode
編碼會(huì)比用ASCII
編碼多一倍的存儲(chǔ)空間剔交,在存儲(chǔ)和傳輸上就非常的不劃算肆饶。
③UTF-8
編碼把一個(gè)Unicode
字符根據(jù)不同的數(shù)字大小編碼成1-6個(gè)字節(jié),常用的英文字母被編碼成1個(gè)字節(jié)省容,漢字通常是3個(gè)字節(jié)抖拴,只有很生僻的字符才會(huì)被編碼成4-6個(gè)字節(jié)。
6.小結(jié):現(xiàn)在計(jì)算機(jī)系統(tǒng)通用的字符編碼工作方式腥椒。
①在計(jì)算機(jī)內(nèi)存中阿宅,統(tǒng)一使用Unicode
編碼,當(dāng)需要保存到硬盤(pán)或需要傳輸?shù)臅r(shí)候笼蛛,就轉(zhuǎn)換為UTF-8
編碼洒放。
7.Python3
版本中,字符串是以Unicode
編碼的滨砍,也就是說(shuō)Python
的字符串支持多語(yǔ)言往湿。
8.如何將十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制:
9.ord()
和chr()
函數(shù) - ordinal & character
10.bytes類(lèi)型
①存在的原因?
11.encode()
和decode()
- 含有中文的
str
可以用UTF_8
編碼為bytes
惋戏。 - 含有中文的
str
無(wú)法用ASCII
編碼领追,因?yàn)橹形木幋a的范圍超過(guò)了ASCII
編碼的范圍。
12.要計(jì)算str
包含多少個(gè)字符响逢,可以用len()
函數(shù)绒窑。
①如果換成bytes
,len()
函數(shù)就計(jì)算字節(jié)數(shù)
- 可見(jiàn)一個(gè)中文字符經(jīng)過(guò)
utf-8
編碼后通常會(huì)占用3個(gè)字節(jié)舔亭,而一個(gè)英文字符只占用1個(gè)字節(jié)些膨。
13.小結(jié)
-
str
和bytes
互相轉(zhuǎn)換時(shí),需要指定編碼钦铺。最常用的就是utf-8
订雾。
14.list
- 列表
①list
是Python
內(nèi)置的一種數(shù)據(jù)類(lèi)型,是一種有序的集合矛洞,可以隨時(shí)添加和刪除其中的元素洼哎。
②獲取列表最后一個(gè)元素的兩種方式:
③不止-1
喔,還可以-2,-3... a[-i] = a[len(a)+(-i)]
④list是一個(gè)可變的有序表谱净,因此窑邦,可以往list
中追加元素到末尾:
⑤那怎么刪除list
末尾的元素呢擅威? - pop()
⑥pop(i)
還可以刪除指定位置的元素喔:
⑦要把某個(gè)元素?fù)Q成別的元素壕探,可以直接復(fù)制給對(duì)應(yīng)的索引位置:
15.tuple
①是什么?另一種有序列表郊丛,叫元組李请。
②和list
的區(qū)別?
-
tuple
一旦初始化就不能修改厉熟。也就不能用append()
,insert()
导盅,pop()
這樣的方法。
③tuple
的存在的意義揍瑟?
- 因?yàn)?code>tuple不可變白翻,所以代碼更安全。
④tuple
是如何表示的绢片?
⑤這樣表示存在一種歧義:如果tuple內(nèi)僅有1個(gè)數(shù)據(jù)滤馍,注意要加個(gè)逗號(hào),
喔!5籽巢株!
- 因?yàn)閳A括號(hào)
()
既可以表示tuple
,也可以表示數(shù)學(xué)公式中的小括號(hào)亚斋。因此唧喉,Python
規(guī)定厢洞,在這種情況下,按小括號(hào)進(jìn)行計(jì)算那槽,計(jì)算結(jié)果為1。
⑥tuple
所謂的"不變"等舔,是指:指向永遠(yuǎn)不變骚灸。即指向'a'
,就不能改成'b'
软瞎,指向一個(gè)list
逢唤,就不能改成指向其他對(duì)象,但是指向的這個(gè)list
本身是可變的涤浇!
16.小結(jié)
①list
和tuple
是Python
內(nèi)置的有序集合鳖藕,一個(gè)可變,一個(gè)不可變只锭。
17.if
語(yǔ)句執(zhí)行的特點(diǎn)著恩,從上到下,如果在某個(gè)判斷是True
,則執(zhí)行該判斷對(duì)應(yīng)的語(yǔ)句喉誊,就忽略掉剩下的elif
和else
邀摆。
if x: //x為0,空字符串伍茄,空l(shuí)ist時(shí)栋盹,判斷為False
18.input()
返回的數(shù)據(jù)類(lèi)型是str
。
解決:用int()
將str
轉(zhuǎn)換為整數(shù)
19.計(jì)算1+2+...+100
20.我想打印1-10中的所有奇數(shù)敷矫?
①方法1
②continue
的一大坑
③正確使用continue
獲取1-10中的奇數(shù)
21.小結(jié)
①break
語(yǔ)句可以在循環(huán)過(guò)程中直接退出循環(huán)例获。
②continue
語(yǔ)句可以提前結(jié)束本輪循環(huán)(本輪循環(huán)continue
之后的語(yǔ)句將不再執(zhí)行),直接開(kāi)始下一輪循環(huán)曹仗。
③命令行模式下榨汤,如果死循環(huán)了,Ctrl+C
或直接關(guān)閉窗口怎茫。
22.dict
①Python
內(nèi)置了字典:dict
的支持dictionary
收壕,其他語(yǔ)言中也稱(chēng)為map
,使用鍵-值key-value
存儲(chǔ)轨蛤,具有極快的查找速度蜜宪。
②dict
和list
的區(qū)別?
- 假設(shè)我們需要在一本字典中找到一個(gè)字俱萍,
dict
的做法是在字典的索引列表中找到這個(gè)字對(duì)應(yīng)的頁(yè)碼端壳,然后直接翻到該頁(yè);而list
是從第一頁(yè)開(kāi)始枪蘑,一頁(yè)一頁(yè)往后翻损谦。
③由于一個(gè)key
只能對(duì)于一個(gè)value
,所以岳颇,"長(zhǎng)江后浪推前浪"
④如果key
不存在照捡,dict
就會(huì)報(bào)錯(cuò) - KeyError
。
⑤為了避免這種情況话侧,就需要提前判斷該key
是否存在栗精?
- 方法一:
in
操作符
- 方法二:
dict
提供的get()
方法
- 注意:返回None
時(shí),Python
交互式命令行不顯示結(jié)果瞻鹏。
⑥如何刪除一個(gè)key悲立?
-
pop(key)
,對(duì)于的value
也會(huì)從dict
中刪除新博。
⑦注意:dict
內(nèi)部存放的順序和key
放入的順序是沒(méi)有關(guān)系的薪夕。
⑧和list
相比,dict
有的特點(diǎn):速度 & 內(nèi)存
- 查找和插入的速度極快赫悄,不會(huì)隨著
key
的增加而變慢原献。 - 但是需要占用大量的內(nèi)存馏慨,內(nèi)存浪費(fèi)多。
⑨list
的特點(diǎn):
- 查找和插入的時(shí)間隨著元素的增加而增加姑隅。
- 占用空間小写隶,消耗的內(nèi)存很少。
⑩dict
的key
必須是不可變的對(duì)象讲仰。
- 因?yàn)?code>dict是根據(jù)
key
來(lái)計(jì)算value
的存儲(chǔ)位置慕趴。在Python
中,字符串叮盘、整數(shù)都是不可變的秩贰,而list
是可變的,因此它不能作為key
柔吼。
23.set
①是什么?
-
set
和dict
類(lèi)似丙唧,也是一組key
的集合愈魏。由于key
不能重復(fù),所以想际,在set
中培漏,沒(méi)有重復(fù)的key
。
②如何創(chuàng)建一個(gè)set
胡本?
- 需要提供一個(gè)
list
作為輸入集合牌柄。
③如何往set中添加元素?
-
add(key)
侧甫,可以重復(fù)添加珊佣,但無(wú)效果。
④如何刪除set中的元素披粟?
remove(key)
⑤set
可以看成數(shù)學(xué)意義上的無(wú)需和無(wú)重復(fù)元素的集合咒锻,因此,兩個(gè)set
可以做數(shù)學(xué)意義上的交集守屉、并集等操作惑艇。
24.不可變對(duì)象
①是什么?
- 調(diào)用對(duì)象自身的任何方法拇泛,都不會(huì)改變對(duì)象自身的內(nèi)容滨巴。
- 注:列表
list
是可變對(duì)象,因?yàn)榘嘲龋?dāng)它調(diào)用自身的sort()
方法時(shí)改變了其本身恭取。
- 注:字符串
s1
本身不變,永遠(yuǎn)是"Hello"
绪颖。s1
本身只是一個(gè)變量秽荤,它指向的對(duì)象的內(nèi)容才是"Hello"
甜奄。當(dāng)我們調(diào)用s1.replace('H','h')
時(shí),實(shí)際上調(diào)用方法replace()
是作用在字符串對(duì)象"Hello"
上的窃款,它并沒(méi)有改變字符串"Hello"
的內(nèi)容课兄,而是創(chuàng)建了一個(gè)新的字符串"hello"
并返回。此時(shí)晨继,變量s2
指向該新的字符串對(duì)象"hello"
烟阐。
25.借助抽象,我們不用關(guān)系底層的具體計(jì)算過(guò)程紊扬,而直接在更高層次上思考問(wèn)題(高級(jí)程序語(yǔ)言)蜒茄。
- 函數(shù),就是一種基本的代碼抽象方式餐屎。
26.導(dǎo)致TypeError
錯(cuò)誤的原因檀葛?
①調(diào)用函數(shù)時(shí),傳入的參數(shù)數(shù)量不對(duì)腹缩。
27.max()
函數(shù)可以接收任意多個(gè)參數(shù)屿聋,并返回最大的那個(gè)。
28.數(shù)據(jù)類(lèi)型轉(zhuǎn)換
①int()
| float()
| str()
| bool()
②函數(shù)名實(shí)際上就是指向函數(shù)對(duì)象的一個(gè)引用藏鹊,完全可以把函數(shù)名賦給一個(gè)變量润讥,相當(dāng)于給這個(gè)函數(shù)起了個(gè)"別名"。
29.小結(jié)
①調(diào)用Python
的函數(shù)盘寡,需要根據(jù)函數(shù)定義楚殿,傳入正確的參數(shù)。
30.定義函數(shù)
①如果定義的函數(shù)中沒(méi)有return
語(yǔ)句竿痰,函數(shù)執(zhí)行完畢后也會(huì)返回結(jié)果脆粥,只是結(jié)果是None
。
②return None
可以簡(jiǎn)寫(xiě)為return
③
from exercise1 import my_abs
//1.注意文件exercise1不加后綴py
//2.從exercise1文件中引入my_abs這個(gè)函數(shù)
④如果你想定義一個(gè)什么事也不做的空函數(shù)菇曲,可以用pass
語(yǔ)句冠绢。
def nop():
pass
⑤空函數(shù)有什么用?
-
pass
可以用來(lái)當(dāng)做占位符常潮,比如現(xiàn)在還沒(méi)想好怎么寫(xiě)函數(shù)的代碼弟胀,就可先放個(gè)pass
占個(gè)坑。
31.參數(shù)檢查
①自己定義的my_abs
和內(nèi)置的abs
函數(shù)的區(qū)別喊式?
- 缺少參數(shù)檢查孵户。
②完善以下my_abs
函數(shù)
③isinstance()
怎么用的?
isinstance(object,classinfo) //用來(lái)判斷一個(gè)對(duì)象是否是一個(gè)已知的類(lèi)型
//object - 實(shí)例對(duì)象
//classinfo - 可以是直接或間接類(lèi)名岔留、基本類(lèi)型或者它們組成的元組夏哭。
注:
type()
和isinstance()
的區(qū)別?
①type()
不考慮繼承献联。
②isinstance()
考慮繼承竖配。
④raise
怎么用的何址?
- 當(dāng)程序出現(xiàn)錯(cuò)誤,
Python
會(huì)自動(dòng)引發(fā)異常进胯,也可以通過(guò)raise
顯式地引發(fā)異常用爪。一旦執(zhí)行了raise
語(yǔ)句,raise
后面的語(yǔ)句將不能執(zhí)行(同continue)胁镐。
32.小結(jié)
①定義函數(shù)時(shí)偎血,需要確定函數(shù)名和參數(shù)個(gè)數(shù)。
②最好先對(duì)參數(shù)的數(shù)據(jù)類(lèi)型做檢查盯漂。
③函數(shù)體內(nèi)部可以用return
隨時(shí)返回函數(shù)結(jié)果颇玷。
④函數(shù)執(zhí)行完畢也沒(méi)有return
語(yǔ)句時(shí),自動(dòng)return None
就缆。
⑤函數(shù)可以同時(shí)返回多個(gè)值帖渠,其實(shí)就是一個(gè)tuple
。
33.設(shè)置一個(gè)函數(shù)违崇,求ax^2+bx+c = 0
的解阿弃。
①import math
- math.sqrt
②只有當(dāng)a,b,c
全部滿(mǎn)足int
或float
時(shí),才進(jìn)行下一步羞延,否則異常。
if not isinstance(a,(int,float)) and isinstance(b,(int,float)) and
isinstance(c,(int,float)) //從右往左
//若滿(mǎn)足以上條件
raise TypeError("Bad operand Type!")
③當(dāng)b*b-4*a*c >= 0
時(shí)
x1 = (-b + math.sqrt(b*b-4*a*c))/(2*a)
x2 = (-b - math.sqrt(b*b-4*a*c))/(2*a)
return x1,x2
//否則無(wú)解
else:
print("無(wú)解")