縮進(jìn) & 數(shù)據(jù)類型
任何一種編程語(yǔ)言都有自己的一套語(yǔ)法,編譯器或者解釋器就是負(fù)責(zé)把符合語(yǔ)法的程序代碼轉(zhuǎn)換成CPU能夠執(zhí)行的機(jī)器碼,然后執(zhí)行。
Python的語(yǔ)法比較簡(jiǎn)單,采用縮進(jìn)方式,堅(jiān)持使用4個(gè)空格的縮進(jìn),且沒有結(jié)束引號(hào),很優(yōu)雅,寫出來(lái)的代碼就像下面的樣子:
# print absolute value of an integer:
a = 100
if a >= 0:
print(a)
else:
print(-a)
記得Python程序是大小寫敏感的?。?!
計(jì)算機(jī)能處理的遠(yuǎn)不止數(shù)值,還可以處理文本、圖形、音頻、視頻、網(wǎng)頁(yè)等各種各樣的數(shù)據(jù),不同的數(shù)據(jù),需要定義不同的數(shù)據(jù)類型。在Python中,能夠直接處理的數(shù)據(jù)類型有以下幾種:
- 整數(shù) int
- 浮點(diǎn)數(shù) float
- 字符串 str(單引雙引都o(jì)k)(字符串內(nèi)部既包含’又包含"可以用轉(zhuǎn)義字符來(lái)標(biāo)識(shí),轉(zhuǎn)義字符可以轉(zhuǎn)義很多字符,比如n表示換行,t表示制表符,字符本身也要轉(zhuǎn)義,所以表示的字符就是)
- 布爾值 bool
- 空值 None
- 變量 對(duì)變量賦值x = y是把變量x指向真正的對(duì)象,該對(duì)象是變量y所指向的。隨后對(duì)變量y的賦值不影響變量x的指向。
- 常量
字符編碼 & 格式化
因?yàn)橛?jì)算機(jī)只能處理數(shù)字,如果要處理文本,就必須先把文本轉(zhuǎn)換為數(shù)字才能處理。最早的計(jì)算機(jī)在設(shè)計(jì)時(shí)采用8個(gè)比特(bit)作為一個(gè)字節(jié)(byte),所以,一個(gè)字節(jié)能表示的最大的整數(shù)就是255(二進(jìn)制11111111=十進(jìn)制255),如果要表示更大的整數(shù),就必須用更多的字節(jié)。比如兩個(gè)字節(jié)可以表示的最大整數(shù)是65535,4個(gè)字節(jié)可以表示的最大整數(shù)是4294967295。
UTF-8編碼有一個(gè)額外的好處,就是ASCII編碼實(shí)際上可以被看成是UTF-8編碼的一部分,所以,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續(xù)工作。
現(xiàn)在計(jì)算機(jī)系統(tǒng)通用的字符編碼工作方式:在計(jì)算機(jī)內(nèi)存中,統(tǒng)一使用Unicode編碼,當(dāng)需要保存到硬盤或者需要傳輸?shù)臅r(shí)候,就轉(zhuǎn)換為UTF-8編碼。用記事本編輯的時(shí)候,從文件讀取的UTF-8字符被轉(zhuǎn)換為Unicode字符到內(nèi)存里,編輯完成后,保存的時(shí)候再把Unicode轉(zhuǎn)換為UTF-8保存到文件:
瀏覽網(wǎng)頁(yè)的時(shí)候,服務(wù)器會(huì)把動(dòng)態(tài)生成的Unicode內(nèi)容轉(zhuǎn)換為UTF-8再傳輸?shù)綖g覽器:
所以你看到很多網(wǎng)頁(yè)的源碼上會(huì)有類似的信息,表示該網(wǎng)頁(yè)正是用的UTF-8編碼。
在最新的Python 3版本中,字符串是以Unicode編碼的,也就是說(shuō),Python的字符串支持多語(yǔ)言。1個(gè)中文字符經(jīng)過(guò)UTF-8編碼后通常會(huì)占用3個(gè)字節(jié),而1個(gè)英文字符只占用1個(gè)字節(jié)。
在Python中,采用的格式化方式和C語(yǔ)言是一致的,用%實(shí)現(xiàn),舉例如下:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
list & tuple
list和tuple是Python內(nèi)置的有序集合,一個(gè)可變,一個(gè)不可變。根據(jù)需要來(lái)選擇使用它們。
list
list是一種有序的集合,可以隨時(shí)添加和刪除其中的元素。比如,列出班里所有同學(xué)的名字,就可以用一個(gè)list表示:
>>> classmates = ['Michael', 'Bob', 'Tracy']
>>> classmates
['Michael', 'Bob', 'Tracy']
變量classmates就是一個(gè)list。用len()函數(shù)可以獲得list元素的個(gè)數(shù):
>>> len(classmates)
3
用索引來(lái)訪問(wèn)list中每一個(gè)位置的元素,記得索引是從0
開始的。如果要取最后一個(gè)元素,除了計(jì)算索引位置外,還可以用-1
做索引,直接獲取最后一個(gè)元素,倒數(shù)第二個(gè)就是[-2]。
list是一個(gè)可變的有序表,所以,可以往list中追加元素到末尾append()
:
>>> classmates.append('Adam')
>>> classmates
['Michael', 'Bob', 'Tracy', 'Adam']
也可以把元素插入到指定的位置,比如索引號(hào)為1的位置insert()
:
>>> classmates.insert(1, 'Jack')
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']
要?jiǎng)h除list末尾的元素,用pop()
方法:
>>> classmates.pop()
'Adam'
>>> classmates
['Michael', 'Jack', 'Bob', 'Tracy']
要?jiǎng)h除指定位置的元素,用pop(i)
方法,其中i是索引位置:
>>> classmates.pop(1)
'Jack'
>>> classmates
['Michael', 'Bob', 'Tracy']
要把某個(gè)元素替換成別的元素,可以直接賦值給對(duì)應(yīng)的索引位置:
>>> classmates[1] = 'Sarah'
>>> classmates
['Michael', 'Sarah', 'Tracy']
list里面的元素的數(shù)據(jù)類型也可以不同,比如:
>>> L = ['Apple', 123, True]
list元素也可以是另一個(gè)list,比如:
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
tuple
tuple與list灰常像,最大不同就是它一旦初始化,就不能修改!比如同樣是列出同學(xué)的名字:
>>> classmates = ('Michael', 'Bob', 'Tracy')
現(xiàn)在,classmates這個(gè)tuple不能變了,它也沒有append(),insert()這樣的方法。其他獲取元素的方法和list是一樣的,你可以正常地使用classmates[0]
,classmates[-1]
,但不能賦值成另外的元素。不可變的tuple有什么意義?因?yàn)閠uple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple。
當(dāng)你定義一個(gè)tuple時(shí),在定義的時(shí)候,tuple的元素就必須被確定下來(lái),比如:
>>> t = (1, 2)
>>> t
(1, 2)
一個(gè)“可變的”tuple:
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
tuple所謂的“不變”是說(shuō),tuple的每個(gè)元素,指向永遠(yuǎn)不變。即指向’a’,就不能改成指向’b’,指向一個(gè)list,就不能改成指向其他對(duì)象,但指向的這個(gè)list本身是可變的!
條件判斷
就是if
,elif
,else
, 看幾行代碼就懂了。
age = 3
if age >= 18:
print('adult')
elif age >= 6:
print('teenager')
else:
print('kid')
elif是else if的縮寫,完全可以有多個(gè)elif,所以if語(yǔ)句的完整形式就是:
if <條件判斷1>:
<執(zhí)行1>
elif <條件判斷2>:
<執(zhí)行2>
elif <條件判斷3>:
<執(zhí)行3>
else:
<執(zhí)行4>
if語(yǔ)句執(zhí)行有個(gè)特點(diǎn),它是從上往下判斷,如果在某個(gè)判斷上是True,把該判斷對(duì)應(yīng)的語(yǔ)句執(zhí)行后,就忽略掉剩下的elif和else。
只要判斷的條件是非零數(shù)值、非空字符串、非空l(shuí)ist等,就判斷為True,否則為False。
最后看一個(gè)簡(jiǎn)單的判斷00后的代碼:
s = input('birth: ')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00后')
循環(huán)
for…in
幾個(gè)典型的代碼:
打印list中的所有元素:
names = ['Michael', 'Bob', 'Tracy']
for name in names:
print(name)
累加list中的所有元素:
sum = 0
for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
sum = sum + x
print(sum)
利用range()也能達(dá)到循環(huán)的效果
list(range(5))
[0, 1, 2, 3, 4]
while
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
break
在循環(huán)中,break語(yǔ)句可以提前退出循環(huán)。
n = 1
while n <= 100:
if n > 10: # 當(dāng)n = 11時(shí),條件滿足,執(zhí)行break語(yǔ)句break# break語(yǔ)句會(huì)結(jié)束當(dāng)前循環(huán)print(n)
n = n + 1
print('END')
執(zhí)行上面的代碼可以看到,打印出1~10后,緊接著打印END,程序結(jié)束。
continue
在循環(huán)過(guò)程中,也可以通過(guò)continue語(yǔ)句,跳過(guò)當(dāng)前的這次循環(huán),直接開始下一次循環(huán)。
n = 0
while n < 10:
n = n + 1
if n % 2 == 0: # 如果n是偶數(shù),執(zhí)行continue語(yǔ)句
continue # continue語(yǔ)句會(huì)直接繼續(xù)下一輪循環(huán),后續(xù)的print()語(yǔ)句不會(huì)執(zhí)行
print(n)
執(zhí)行上面的代碼可以看到,打印的不再是1~10,而是1,3,5,7,9。
break語(yǔ)句可以在循環(huán)過(guò)程中直接退出循環(huán),而continue語(yǔ)句可以提前結(jié)束本輪循環(huán),并直接開始下一輪循環(huán)。這兩個(gè)語(yǔ)句通常都必須配合if語(yǔ)句使用。
字典 dict & set
dict
就是字典,有著key和value。先在字典的索引表里(比如部首表)查這個(gè)字對(duì)應(yīng)的頁(yè)碼,然后直接翻到該頁(yè),找到這個(gè)字。無(wú)論找哪個(gè)字,這種查找速度都非???,不會(huì)隨著字典大小的增加而變慢。
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
把數(shù)據(jù)放入dict的方法,除了初始化時(shí)指定外,還可以通過(guò)key放入:
>>> d['Adam'] = 67
>>> d['Adam']
67
由于一個(gè)key只能對(duì)應(yīng)一個(gè)value,所以,多次對(duì)一個(gè)key放入value,后面的值會(huì)把前面的值沖掉,如果key不存在,dict就會(huì)報(bào)錯(cuò):
>>> d['Jack'] = 90
>>> d['Jack']
90
>>> d['Jack'] = 88
>>> d['Jack']
88
要?jiǎng)h除一個(gè)key,用pop(key)
方法,對(duì)應(yīng)的value也會(huì)從dict中刪除:
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}
dict內(nèi)部存放的順序和key放入的順序是沒有關(guān)系的。
和list比較,dict有以下幾個(gè)特點(diǎn):
- 查找和插入的速度極快,不會(huì)隨著key的增加而變慢;
- 需要占用大量的內(nèi)存,內(nèi)存浪費(fèi)多。
而list相反:
- 查找和插入的時(shí)間隨著元素的增加而增加;
- 占用空間小,浪費(fèi)內(nèi)存很少。
所以,dict是用空間來(lái)?yè)Q取時(shí)間的一種方法。
dict的key必須是不可變對(duì)象?。?!通過(guò)key計(jì)算位置的算法稱為哈希算法(Hash),要保證hash的正確性,作為key的對(duì)象就不能變。 在Python中,字符串、整數(shù)等都是不可變的,因此,可以放心地作為key。而list是可變的,就不能作為key
set
set和dict類似,也是一組key的集合,但不存儲(chǔ)value。由于key不能重復(fù),所以,在set中,沒有重復(fù)的key。
要?jiǎng)?chuàng)建一個(gè)set,需要提供一個(gè)list作為輸入集合:
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
重復(fù)元素在set中自動(dòng)被過(guò)濾:
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
set可以看成數(shù)學(xué)意義上的無(wú)序和無(wú)重復(fù)元素的集合,因此,兩個(gè)set可以做數(shù)學(xué)意義上的交集、并集等操作:
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
set和dict的唯一區(qū)別僅在于沒有存儲(chǔ)對(duì)應(yīng)的value,set的原理和dict一樣,所以,同樣不可以放入可變對(duì)象。
可變不可變大家可能有點(diǎn)懵了,對(duì)于不變對(duì)象來(lái)說(shuō),調(diào)用對(duì)象自身的任意方法,也不會(huì)改變?cè)搶?duì)象自身的內(nèi)容。相反,這些方法會(huì)創(chuàng)建新的對(duì)象并返回,這樣,就保證了不可變對(duì)象本身永遠(yuǎn)是不可變的。看下面的代碼就懂了:
>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'
附上其他文章的鏈接:
本文內(nèi)容屬于筆記,大部分內(nèi)容源自 廖雪峰老師的博客, 非常推薦大家去他的網(wǎng)站學(xué)習(xí)!