python轉(zhuǎn)義字符:\
python用r' '表示' '默認(rèn)不轉(zhuǎn)義
示例:
print(r'\\\t\\')
結(jié)果:
\\\\\t\\\
python用%%來表示一個%
如果字符串內(nèi)部有很多換行图云,用\n寫在一行里不好閱讀衷佃,為了簡化惊窖,Python允許用'''...'''的格式表示多行內(nèi)容呀洲。
示例
print('''line1 ... line2 ... line3'')
結(jié)果
line1 line2 line3
上面是在交互式命令行內(nèi)輸入豫喧,注意在輸入多行內(nèi)容時,提示符由>>>變?yōu)?..吼具,提示你可以接著上一行輸入赡勘。
由于Python的字符串類型是str,在內(nèi)存中以Unicode表示楼熄,一個字符對應(yīng)若干個字節(jié)忆绰。如果要在網(wǎng)絡(luò)上傳輸,或者保存到磁盤上可岂,就需要把str變?yōu)橐宰止?jié)為單位的bytes错敢。
Python對bytes類型的數(shù)據(jù)用帶b前綴的單引號或雙引號表示:
x = 'ABC'
要注意區(qū)分'ABC'和b'ABC',前者是str缕粹,后者雖然內(nèi)容顯示得和前者一樣稚茅,但bytes的每個字符都只占用一個字節(jié)。
以Unicode表示的str通過encode()方法可以編碼為指定的bytes致开,例如:
x = 'ABC'.encode("ascii") y = '中文'.encode('utf-8') z = '中文'.encode('ascii')//含有中文的str無法用ASCII編碼峰锁,因為中文編碼的范圍超過了ASCII編碼的范圍,Python會報錯双戳。 print('x=',x, 'y=',y, )
結(jié)果:
x= b'ABC' y= b'\xe4\xb8\xad\xe6\x96\x87'
純英文的str可以用ASCII編碼為bytes虹蒋,內(nèi)容是一樣的糜芳,含有中文的str可以用UTF-8編碼為bytes。含有中文的str無法用ASCII編碼魄衅,因為中文編碼的范圍超過了ASCII編碼的范圍峭竣,Python會報錯。
如果我們從網(wǎng)絡(luò)或磁盤上讀取了字節(jié)流晃虫,那么讀到的數(shù)據(jù)就是bytes皆撩。要把bytes變?yōu)閟tr,就需要用decode()方法:
x = b'ABC'.decode('ascii') y = b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') print('x=',x, 'y=',y, )
結(jié)果:
x= ABC y= 中文
len()函數(shù)計算的是str的字符數(shù)哲银,如果換成bytes扛吞,len()函數(shù)就計算字節(jié)數(shù):
a = len(b'ABC') b = len('ABC') c = len(b'\xe4\xb8\xad\xe6\x96\x87') d = len('中文'.encode('utf-8')) print(a, b, c, d)
結(jié)果:
3 3 6 6
可見,1個中文字符經(jīng)過UTF-8編碼后通常會占用3個字節(jié)荆责,而1個英文字符只占用1個字節(jié)滥比。
由于Python源代碼也是一個文本文件,所以做院,當(dāng)你的源代碼中包含中文的時候盲泛,在保存源代碼時,就需要務(wù)必指定保存為UTF-8編碼键耕。當(dāng)Python解釋器讀取源代碼時寺滚,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注釋是為了告訴Linux/OS X系統(tǒng)屈雄,這是一個Python可執(zhí)行程序村视,Windows系統(tǒng)會忽略這個注釋;
第二行注釋是為了告訴Python解釋器酒奶,按照UTF-8編碼讀取源代碼蓖议,否則,你在源代碼中寫的中文輸出可能會有亂碼讥蟆。
1.list
Python內(nèi)置的一種數(shù)據(jù)類型是列表:list勒虾。list是一種有序的集合,可以隨時添加和刪除其中的元素瘸彤。
比如修然,列出班里所有同學(xué)的名字,就可以用一個list表示:
classmates = ['chenli', 'yyy', 'haha']//方括號是list质况,可以更改 print(classmates)
結(jié)果:
['chenli', 'yyy', 'haha']
如果要取最后一個元素愕宋,除了計算索引位置外,還可以用-1做索引结榄,直接獲取最后一個元素:
classmates = ['chenli', 'yyy', 'haha'] print(classmates[-1])
結(jié)果:
haha
list是一個可變的有序表中贝,所以,可以往list中追加元素到末尾:
也可以把元素插入到指定的位置臼朗,比如索引號為1的位置:
要刪除list末尾的元素邻寿,用pop()方法:
要刪除指定位置的元素蝎土,用pop(i)方法,其中i是索引位置:
示例:
classmates = ['chenli', 'yyy', 'haha'] print(classmates) x = len(classmates) print(x) classmates.append('wangwu')//在list末尾追加元素 print(classmates) classmates.insert(1, 'zhangsan')//在list指定位置增加元素 print(classmates) classmates.pop()//刪除list末尾的元素 print(classmates) classmates.pop(2)//刪除list指定位置的元素 print(classmates)
結(jié)果:
['chenli', 'yyy', 'haha'] 3 ['chenli', 'yyy', 'haha', 'wangwu'] ['chenli', 'zhangsan', 'yyy', 'haha', 'wangwu'] ['chenli', 'zhangsan', 'yyy', 'haha'] ['chenli', 'zhangsan', 'haha']
list元素也可以是另一個list绣否,比如:
classmates = ['chenli', 'yyy', 'haha'] print(classmates) a = ['hh', classmates, 'dayouzi'] print(a)
結(jié)果:
['chenli', 'yyy', 'haha'] ['hh', ['chenli', 'yyy', 'haha'], 'dayouzi']
要拿到'yyy'可以寫classmates[1]或者a[1][1]誊涯,因此s可以看成是一個二維數(shù)組,類似的還有三維蒜撮、四維……數(shù)組暴构,不過很少用到。
示例:
[chenli', 'yyy', 'haha'] yyy yyy
2段磨、tuple
另一種有序列表叫元組:tuple取逾。tuple和list非常類似,但是tuple一旦初始化就不能修改苹支,比如同樣是列出同學(xué)的名字:
classmates = ('chenli', 'yyy', 'haha')//圓括號是tuple菌赖,不能更改 print(classmates)
結(jié)果:
('chenli', 'yyy', 'haha')
現(xiàn)在,classmates這個tuple不能變了沐序,它也沒有append(),insert()這樣的方法堕绩。其他獲取元素的方法和list是一樣的策幼,你可以正常地使用classmates[0],classmates[-1]奴紧,但不能賦值成另外的元素特姐。
不可變的tuple有什么意義?因為tuple不可變黍氮,所以代碼更安全唐含。如果可能,能用tuple代替list就盡量用tuple沫浆。
但是捷枯,要定義一個只有1個元素的tuple,如果你這么定義:
a = (1) print(a)
結(jié)果:
1
這里的1是數(shù)字1专执,不是定義的tuple淮捆。要是定義只有一個元素的tuple,應(yīng)該在元素后面加一個逗號本股,防止歧義攀痊。
a = (1,) print(a)
結(jié)果:
(1,)
最后來看一個“可變的”tuple:
t = ('a', 'b', ['A', 'B']) print(t) t[2][0] = 'X' t[2][1] = 'Y' print(t)
結(jié)果:
('a', 'b', ['A', 'B']) ('a', 'b', ['X', 'Y'])
這個tuple定義的時候有3個元素,分別是'a'拄显,'b'和一個list苟径。不是說tuple一旦定義后就不可變了嗎?怎么后來又變了躬审?
別急棘街,我們先看看定義的時候tuple包含的3個元素:
當(dāng)我們把list的元素'A'和'B'修改為'X'和'Y'后蟆盐,tuple變?yōu)椋?br>
表面上看,tuple的元素確實變了蹬碧,但其實變的不是tuple的元素舱禽,而是list的元素。tuple一開始指向的list并沒有改成別的list恩沽,所以誊稚,tuple所謂的“不變”是說,tuple的每個元素罗心,指向永遠(yuǎn)不變里伯。即指向'a',就不能改成指向'b'渤闷,指向一個list疾瓮,就不能改成指向其他對象,但指向的這個list本身是可變的飒箭!
理解了“指向不變”后狼电,要創(chuàng)建一個內(nèi)容也不變的tuple怎么做?那就必須保證tuple的每一個元素本身也不能變弦蹂。
3肩碟、條件判斷
if <條件判斷1>: <執(zhí)行1> elif <條件判斷2>: <執(zhí)行2> elif <條件判斷3>: <執(zhí)行3> else: <執(zhí)行4>
if語句執(zhí)行有個特點,它是從上往下判斷凸椿,如果在某個判斷上是True削祈,把該判斷對應(yīng)的語句執(zhí)行后,就忽略掉剩下的elif和else脑漫,所以髓抑,請測試并解釋為什么下面的程序打印的是teenager:
age = 20 if age >= 6: print('teenager') elif age >= 18: print('adult') else: print('kid')
結(jié)果:
teenager
if判斷條件還可以簡寫,比如寫:
x = 20 if x: print(True)
結(jié)果:
True
input()返回的數(shù)據(jù)類型是str优幸,str不能直接和整數(shù)比較吨拍,必須先把str轉(zhuǎn)換成整數(shù)。Python提供了int()函數(shù)來完成這件事情:
只要x是非零數(shù)值网杆、非空字符串密末、非空list等,就判斷為True跛璧,否則為False严里。
3、循環(huán)
python有兩種循環(huán)追城,第一種是for...in 循環(huán)刹碾,依次把list或tuple中的每個元素迭代出來。
sum = 0 for x in list(range(101)): sum += x print(sum)
結(jié)果:
5050
如果要計算1-100的整數(shù)之和座柱,從1寫到100有點困難迷帜,幸好Python提供一個range()函數(shù)物舒,可以生成一個整數(shù)序列,再通過list()函數(shù)可以轉(zhuǎn)換為list戏锹。比如range(5)生成的序列是從0開始小于5的整數(shù)冠胯。
第二種循環(huán)是while循環(huán),只要條件滿足锦针,就不斷循環(huán)荠察,條件不滿足時退出循環(huán)。
total = 0 n = 100 while n > 0: total += n n = n - 1 print(total)
結(jié)果:
5050
4奈搜、dict
Python內(nèi)置了字典:dict的支持悉盆,dict全稱dictionary,在其他語言中也稱為map馋吗,使用鍵-值(key-value)存儲焕盟,具有極快的查找速度。
要避免key不存在的錯誤宏粤,有兩種辦法脚翘,一是通過in判斷key是否存在:
二是通過dict提供的get方法,如果key不存在绍哎,可以返回None来农,或者自己指定的value:
# -*- coding: utf-8 -*- d = {'chenli': 90, 'HAH': 80, 'YYU': 99} print(d['YYU']) print('wangwu' in d) print(d.get('wangwu', -1))
結(jié)果:
99 False -1
要刪除一個key,用pop(key)方法蛇摸,對應(yīng)的value也會從dict中刪除:
# -*- coding: utf-8 -*- d = {'chenli': 90, 'HAH': 80, 'YYU': 99} print(d) d.pop('chenli') print(d)
結(jié)果:
{'chenli': 90, 'HAH': 80, 'YYU': 99} {'HAH': 80, 'YYU': 99}
請務(wù)必注意,dict內(nèi)部存放的順序和key放入的順序是沒有關(guān)系的灿巧。
和list比較赶袄,dict有以下幾個特點:
查找和插入的速度極快,不會隨著key的增加而變慢抠藕;
需要占用大量的內(nèi)存饿肺,內(nèi)存浪費多。
而list相反:
查找和插入的時間隨著元素的增加而增加盾似;
占用空間小敬辣,浪費內(nèi)存很少。
所以零院,dict是用空間來換取時間的一種方法溉跃。
dict可以用在需要高速查找的很多地方,在Python代碼中幾乎無處不在告抄,正確使用dict非常重要撰茎,需要牢記的第一條就是dict的key必須是不可變對象。
5打洼、set
set和dict類似龄糊,也是一組key的集合逆粹,但不存儲value。由于key不能重復(fù)炫惩,所以僻弹,在set中,沒有重復(fù)的key他嚷。
要創(chuàng)建一個set蹋绽,需要提供一個list作為輸入集合:
# -*- coding: utf-8 -*- s = set([1, 2, 3]) print(s)
結(jié)果:
{1, 2, 3}
注意,傳入的參數(shù)[1, 2, 3]是一個list爸舒,而顯示的{1, 2, 3}只是告訴你這個set內(nèi)部有1蟋字,2,3這3個元素扭勉,顯示的順序也不表示set是有序的鹊奖。。
重復(fù)元素在set中自動被過濾:
# -*- coding: utf-8 -*- s = set([1, 2, 3, 3, 4, 2]) print(s)
結(jié)果:
{1, 2, 3, 4}
通過add(key)方法可以添加元素到set中涂炎,可以重復(fù)添加忠聚,但不會有效果:
通過remove(key)方法可以刪除元素:
set可以看成數(shù)學(xué)意義上的無序和無重復(fù)元素的集合,因此唱捣,兩個set可以做數(shù)學(xué)意義上的交集两蟀、并集等操作:
# -*- coding: utf-8 -*- s = set([1, 2, 3, 3, 4, 2]) s1 = set([1, 2, 3, ]) print(s) s.add(6) print(s) s.remove(3) print(s) s2 = s print(s1 & s2) print(s1 | s2)
結(jié)果:
{1, 2, 3, 4} {1, 2, 3, 4, 6} {1, 2, 4, 6} {1, 2} {1, 2, 3, 4, 6}