概念:
- 面向過(guò)程:
以指令為中心,由指令處理數(shù)據(jù)
如何月組織代碼解決問(wèn)題 - 面向?qū)ο?
以數(shù)據(jù)為中心,所有的處理代碼都圍繞數(shù)據(jù)展開(kāi)
如何設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)組織數(shù)據(jù),并提供對(duì)此類數(shù)據(jù)所允許操作 - Python 既面向過(guò)程,也面向?qū)ο缶幊?Python中,一切皆為對(duì)象
Pycharm快捷鍵及操作命令
- 注釋(取消注釋):CTRL+/
- 批量縮進(jìn):TAB
- 批量取消縮進(jìn):shift+TAB
- 恢復(fù)操作:CTRL+Z
- 查詢引用的庫(kù)內(nèi)置的方法(函數(shù)):dir(庫(kù)名)
- 查詢一個(gè)變量的數(shù)據(jù)類型: type(變量名)
- 求字符串、列表、元組梨睁、集合、字典長(zhǎng)度(元素個(gè)數(shù)):len(字符串名等)
求商取整
(商舍去小數(shù)只取整數(shù)),用雙斜杠,即雙除//,對(duì)比:
9//2=4
9/2=4.5
/除出來(lái)的結(jié)果為浮點(diǎn)
10/5=2.0
%除出來(lái)的結(jié)果為余數(shù)
10%3=1
10%5=0
乘/冪
2*3=6
2**3=8
轉(zhuǎn)義符\
- 反斜杠\為轉(zhuǎn)義符,讓其后的符號(hào)輸出本身,如:
print("I'm a sexy man! ")
結(jié)果為:
I'm a sexy man! - 字母r放的字符串引號(hào)前面,可以讓字符串內(nèi)的全部符號(hào)輸出本身,如:
print(r"你,\n給我等著...\n滾!")
結(jié)果為:
你,\n給我等著...\n滾!
對(duì)比下面:
print("你,\n給我等著...\n滾!")
結(jié)果為:
你,
給我等著...
滾!
四舍五入
收整函數(shù)ROUND(參數(shù)1,參數(shù)2),如:
round(1.23,1)=1.2
ROUND(1.23)=1
即該函數(shù)無(wú)第二個(gè)參數(shù)即是四舍五入取整
print用法詳解
- 說(shuō)明文檔
def print(*args, **kwargs): # known special case of print
"""
print(value, ..., sep=' ', end='\n', file=sys.stdout)
Prints the values to a stream, or to sys.stdout by default. Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
"""
即:print就是可以帶參數(shù)的.
-
參數(shù)end:
結(jié)尾符,默認(rèn)為回車:\n
print('hello1')
print('hello2', end="\n")
print('hello3')
print('hello4', end="") #這是空字符串
print('hello5')
print('hello6', end=" ") #這是空格
print('hello7')
結(jié)果為:
hello1
hello2
hello3
hello4hello5
hello6 hello7
-
參數(shù):sep
各個(gè)值之間的連接符昨寞,默認(rèn)是空格:" "
print('hello', 'hello', 'hello')
print('hello', 'hello', 'hello', sep=" ") #一個(gè)空格
print('hello', 'hello', 'hello', sep=" ") #兩個(gè)空格
print('hello', 'hello', 'hello', sep="+")
print('hello', 'hello', 'hello', sep="-")
print('hello', 'hello', 'hello', sep="+-*/")
結(jié)果為:
hello hello hello
hello hello hello
hello hello hello
hello+hello+hello
hello-hello-hello
hello+-*/hello+-*/hello
-
參數(shù):file
file參數(shù)就是把print的結(jié)果輸出到哪里去的作用。默認(rèn)是系統(tǒng)標(biāo)準(zhǔn)輸出,就是在交互shell里輸出援岩。
with open('print_output.txt','w') as f:
print('hello', 'hello', 'hello', sep="+-*/", file=f)
字符串和編碼:摘錄鏈接
因?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。
由于計(jì)算機(jī)是美國(guó)人發(fā)明的计雌,因此悄晃,最早只有127個(gè)字母被編碼到計(jì)算機(jī)里,也就是大小寫(xiě)英文字母凿滤、數(shù)字和一些符號(hào)妈橄,這個(gè)編碼表被稱為ASCII編碼,比如大寫(xiě)字母A的編碼是65翁脆,小寫(xiě)字母z的編碼是122眷蚓。
但是要處理中文顯然一個(gè)字節(jié)是不夠的,至少需要兩個(gè)字節(jié)反番,而且還不能和ASCII編碼沖突沙热,所以,中國(guó)制定了GB2312編碼罢缸,用來(lái)把中文編進(jìn)去篙贸。
你可以想得到的是,全世界有上百種語(yǔ)言枫疆,日本把日文編到Shift_JIS里爵川,韓國(guó)把韓文編到Euc-kr里,各國(guó)有各國(guó)的標(biāo)準(zhǔn)息楔,就會(huì)不可避免地出現(xiàn)沖突寝贡,結(jié)果就是,在多語(yǔ)言混合的文本中值依,顯示出來(lái)會(huì)有亂碼兔甘。
因此,Unicode應(yīng)運(yùn)而生鳞滨。Unicode把所有語(yǔ)言都統(tǒng)一到一套編碼里洞焙,這樣就不會(huì)再有亂碼問(wèn)題了。
Unicode標(biāo)準(zhǔn)也在不斷發(fā)展,但最常用的是用兩個(gè)字節(jié)表示一個(gè)字符(如果要用到非常偏僻的字符澡匪,就需要4個(gè)字節(jié))∪廴危現(xiàn)代操作系統(tǒng)和大多數(shù)編程語(yǔ)言都直接支持Unicode。
現(xiàn)在唁情,捋一捋ASCII編碼和Unicode編碼的區(qū)別:ASCII編碼是1個(gè)字節(jié)疑苔,而Unicode編碼通常是2個(gè)字節(jié)。
字母A用ASCII編碼是十進(jìn)制的65甸鸟,二進(jìn)制的01000001惦费;
字符0用ASCII編碼是十進(jìn)制的48,二進(jìn)制的00110000抢韭,注意字符'0'和整數(shù)0是不同的薪贫;
漢字中已經(jīng)超出了ASCII編碼的范圍,用Unicode編碼是十進(jìn)制的20013刻恭,二進(jìn)制的01001110 00101101瞧省。
你可以猜測(cè),如果把ASCII編碼的A用Unicode編碼鳍贾,只需要在前面補(bǔ)0就可以鞍匾,因此,A的Unicode編碼是00000000 01000001骑科。
新的問(wèn)題又出現(xiàn)了:如果統(tǒng)一成Unicode編碼橡淑,亂碼問(wèn)題從此消失了。但是咆爽,如果你寫(xiě)的文本基本上全部是英文的話梳码,用Unicode編碼比ASCII編碼需要多一倍的存儲(chǔ)空間,在存儲(chǔ)和傳輸上就十分不劃算伍掀。
所以掰茶,本著節(jié)約的精神,又出現(xiàn)了把Unicode編碼轉(zhuǎn)化為“可變長(zhǎng)編碼”的UTF-8編碼蜜笤。UTF-8編碼把一個(gè)Unicode字符根據(jù)不同的數(shù)字大小編碼成1-6個(gè)字節(jié)濒蒋,常用的英文字母被編碼成1個(gè)字節(jié),漢字通常是3個(gè)字節(jié)把兔,只有很生僻的字符才會(huì)被編碼成4-6個(gè)字節(jié)沪伙。如果你要傳輸?shù)奈谋景罅坑⑽淖址肬TF-8編碼就能節(jié)省空間:
| 字符 | ASCII | Unicode |UTF-8 |
|:--------:|:--------:|:-----------:|:--- -----:|
| A |01000001|00000000 01|00000101000001|
| 中 | x| 01001110 00101101| 111001001011100010101101 |
從上面的表格還可以發(fā)現(xiàn)县好,UTF-8編碼有一個(gè)額外的好處围橡,就是ASCII編碼實(shí)際上可以被看成是UTF-8編碼的一部分,所以缕贡,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續(xù)工作翁授。
搞清楚了ASCII拣播、Unicode和UTF-8的關(guān)系,我們就可以總結(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編碼塞赂。
用記事本編輯的時(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ì)有類似<meta charset="UTF-8" />的信息,表示該網(wǎng)頁(yè)正是用的UTF-8編碼仇哆。
Python的字符串編碼轉(zhuǎn)換
搞清楚了令人頭疼的字符編碼問(wèn)題后沦辙,我們?cè)賮?lái)研究Python的字符串。
在最新的Python 3版本中税产,字符串是以Unicode編碼的怕轿,也就是說(shuō)偷崩,Python的字符串支持多語(yǔ)言辟拷,例如:
print('包含中文的str')
包含中文的str
對(duì)于單個(gè)字符的編碼,Python提供了ord()函數(shù)獲取字符的整數(shù)表示阐斜,chr()函數(shù)把編碼轉(zhuǎn)換為對(duì)應(yīng)的字符:
ord('A')
65
ord('中')
20013
chr(66)
'B'
chr(25991)
'文'
如果知道字符的整數(shù)編碼衫冻,還可以用十六進(jìn)制這么寫(xiě)str:
'\u4e2d\u6587'
'中文'
兩種寫(xiě)法完全是等價(jià)的。
由于Python的字符串類型是str谒出,在內(nèi)存中以Unicode表示隅俘,一個(gè)字符對(duì)應(yīng)若干個(gè)字節(jié)。如果要在網(wǎng)絡(luò)上傳輸笤喳,或者保存到磁盤(pán)上为居,就需要把str變?yōu)橐宰止?jié)為單位的bytes。
Python對(duì)bytes類型的數(shù)據(jù)用帶b前綴的單引號(hào)或雙引號(hào)表示:
x = b'ABC'
要注意區(qū)分'ABC'和b'ABC'杀狡,前者是str蒙畴,后者雖然內(nèi)容顯示得和前者一樣,但bytes的每個(gè)字符都只占用一個(gè)字節(jié)呜象。
以Unicode表示的str通過(guò)encode()方法可以編碼為指定的bytes膳凝,例如:
'ABC'.encode('ascii')
b'ABC'
'中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
'中文'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
純英文的str可以用ASCII編碼為bytes,內(nèi)容是一樣的恭陡,含有中文的str可以用UTF-8編碼為bytes蹬音。含有中文的str無(wú)法用ASCII編碼,因?yàn)橹形木幋a的范圍超過(guò)了ASCII編碼的范圍休玩,Python會(huì)報(bào)錯(cuò)著淆。
在bytes中劫狠,無(wú)法顯示為ASCII字符的字節(jié),用\x##顯示牧抽。
反過(guò)來(lái)嘉熊,如果我們從網(wǎng)絡(luò)或磁盤(pán)上讀取了字節(jié)流,那么讀到的數(shù)據(jù)就是bytes扬舒。要把bytes變?yōu)閟tr阐肤,就需要用decode()方法:
b'ABC'.decode('ascii')
'ABC'
b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
'中文'
要計(jì)算str包含多少個(gè)字符,可以用len()函數(shù):
len('ABC')
3
len('中文')
2
len()函數(shù)計(jì)算的是str的字符數(shù)讲坎,如果換成bytes孕惜,len()函數(shù)就計(jì)算字節(jié)數(shù):
len(b'ABC')
3
len(b'\xe4\xb8\xad\xe6\x96\x87')
6
len('中文'.encode('utf-8'))
6
可見(jiàn),1個(gè)中文字符經(jīng)過(guò)UTF-8編碼后通常會(huì)占用3個(gè)字節(jié)晨炕,而1個(gè)英文字符只占用1個(gè)字節(jié)衫画。
在操作字符串時(shí)俐巴,我們經(jīng)常遇到str和bytes的互相轉(zhuǎn)換疑枯。為了避免亂碼問(wèn)題,應(yīng)當(dāng)始終堅(jiān)持使用UTF-8編碼對(duì)str和bytes進(jìn)行轉(zhuǎn)換糊昙。
由于Python源代碼也是一個(gè)文本文件费奸,所以弥激,當(dāng)你的源代碼中包含中文的時(shí)候,在保存源代碼時(shí)愿阐,就需要?jiǎng)?wù)必指定保存為UTF-8編碼微服。當(dāng)Python解釋器讀取源代碼時(shí),為了讓它按UTF-8編碼讀取缨历,我們通常在文件開(kāi)頭寫(xiě)上這兩行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注釋是為了告訴Linux/OS X系統(tǒng)以蕴,這是一個(gè)Python可執(zhí)行程序,Windows系統(tǒng)會(huì)忽略這個(gè)注釋辛孵;
第二行注釋是為了告訴Python解釋器丛肮,按照UTF-8編碼讀取源代碼,否則魄缚,你在源代碼中寫(xiě)的中文輸出可能會(huì)有亂碼宝与。
申明了UTF-8編碼并不意味著你的.py文件就是UTF-8編碼的,必須并且要確保文本編輯器正在使用UTF-8 without BOM
編碼:
摘錄自:鏈接