Python的語法格式
Python是一種計(jì)算機(jī)編程語言,有著自己的一套語法格式固以。Python的語法格式非常簡(jiǎn)單,采用縮進(jìn)的方式:
# print absolute value of an integer:
a = 100
if a >= 0:
print(a)
else:
print(-a)
- 以
#
開頭的語句是注釋航厚,解釋器會(huì)自動(dòng)忽略。 - 當(dāng)語句以
:
結(jié)束時(shí)锰蓬,縮進(jìn)的語句視為代碼塊幔睬。
縮進(jìn)有利有弊,好處是強(qiáng)迫你寫出格式化的代碼芹扭,但沒有規(guī)定縮進(jìn)是幾個(gè)空格還是tab麻顶。按照約定俗成的習(xí)慣,應(yīng)該使用
4個(gè)空格
的縮進(jìn)舱卡。
縮進(jìn)的另一個(gè)好處是強(qiáng)迫你寫出縮進(jìn)較少的代碼辅肾,你會(huì)傾向于把很長(zhǎng)的一段代碼拆分成若干函數(shù),從而得到縮進(jìn)較少的代碼轮锥。
縮進(jìn)的壞處就是“復(fù)制-粘貼”功能失效了矫钓,當(dāng)我們重構(gòu)代碼時(shí),粘貼過去的代碼必須重新檢查縮進(jìn)是否正確舍杜。此外新娜,IDE很難像Java代碼那樣格式化Python代碼。
- Python程序是大小寫敏感的既绩,如果寫錯(cuò)了大小寫杯活,程序會(huì)報(bào)錯(cuò)。
Python的數(shù)據(jù)類型
在Python中熬词,能夠直接處理的數(shù)據(jù)類型有以下幾種:
整數(shù)
Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù)吸重,在程序中的表示方法和數(shù)學(xué)上的寫法一模一樣互拾,例如:1
,100
嚎幸,-8080
颜矿,0
,等等嫉晶。
計(jì)算機(jī)由于使用二進(jìn)制骑疆,所以,有時(shí)候用十六進(jìn)制表示整數(shù)比較方便替废,十六進(jìn)制用0x前綴和0-9
箍铭,a-f
表示,例如:0xff00
椎镣,0xa5b4c3d2
诈火,等等。
浮點(diǎn)數(shù)
浮點(diǎn)數(shù)也就是小數(shù)状答,之所以稱為浮點(diǎn)數(shù)冷守,是因?yàn)榘凑湛茖W(xué)記數(shù)法表示時(shí)刀崖,一個(gè)浮點(diǎn)數(shù)的小數(shù)點(diǎn)位置是可變的,比如拍摇,1.23x109和12.3x108是完全相等的亮钦。浮點(diǎn)數(shù)可以用數(shù)學(xué)寫法,如1.23
充活,3.14
蜂莉,-9.01
,等等堪唐。但是對(duì)于很大或很小的浮點(diǎn)數(shù)巡语,就必須用科學(xué)計(jì)數(shù)法表示,把10
用e
替代淮菠,1.23x109
就是1.23e9
男公,或者12.3e8
,0.000012
可以寫成1.2e-5
合陵,等等枢赔。
整數(shù)和浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部存儲(chǔ)的方式是不同的,整數(shù)運(yùn)算永遠(yuǎn)是精確的(除法難道也是精確的拥知?是的Lぐ荨),而浮點(diǎn)數(shù)運(yùn)算則可能會(huì)有四舍五入的誤差低剔。
字符串
字符串是以單引號(hào)'或雙引號(hào)"括起來的任意文本速梗,比如'abc'
,"xyz"
等等襟齿。請(qǐng)注意姻锁,''
或""
本身只是一種表示方式,不是字符串的一部分猜欺,因此位隶,字符串'abc'
只有a,b开皿,c
這3個(gè)字符涧黄。如果'
本身也是一個(gè)字符,那就可以用""
括起來赋荆,比如"I'm OK"
包含的字符是I笋妥,',m窄潭,空格挽鞠,O,K
這6個(gè)字符。
如果字符串內(nèi)部既包含'
又包含"怎么辦信认?可以用轉(zhuǎn)義字符\
來標(biāo)識(shí)材义,比如:
'I\'m \"OK\"!'
表示的字符串內(nèi)容是:
I'm "OK"!
轉(zhuǎn)義字符\可以轉(zhuǎn)義很多字符,比如\n
表示換行嫁赏,\t
表示制表符其掂,字符\
本身也要轉(zhuǎn)義,所以\\
表示的字符就是\
潦蝇,可以在Python的交互式命令行用print()
打印字符串看看:
>>> print('I\'m ok.')
I'm ok.
>>> print('I\'m learning\nPython.')
I'm learning
Python.
>>> print('\\\n\\')
\
\
如果字符串里面有很多字符都需要轉(zhuǎn)義款熬,就需要加很多\
,為了簡(jiǎn)化攘乒,Python還允許用r''
表示''
內(nèi)部的字符串默認(rèn)不轉(zhuǎn)義贤牛,可以自己試試:
>>> print('\\\t\\')
\ \
>>> print(r'\\\t\\')
\\\t\\
如果字符串內(nèi)部有很多換行,用\n
寫在一行里不好閱讀则酝,為了簡(jiǎn)化殉簸,Python允許用'''...'''
的格式表示多行內(nèi)容,可以自己試試:
>>> print('''line1
... line2
... line3''')
line1
line2
line3
上面是在交互式命令行內(nèi)輸入沽讹,注意在輸入多行內(nèi)容時(shí)般卑,提示符由>>>
變?yōu)?code>...,提示你可以接著上一行輸入爽雄。如果寫成程序蝠检,就是:
print('''line1
line2
line3''')
多行字符串'''...'''
還可以在前面加上r使用,請(qǐng)自行測(cè)試挚瘟。
布爾值
布爾值和布爾代數(shù)的表示完全一致叹谁,一個(gè)布爾值只有True、False兩種值乘盖,要么是True本慕,要么是False,在Python中侧漓,可以直接用True、False表示布爾值(請(qǐng)注意大小寫)监氢,也可以通過布爾運(yùn)算計(jì)算出來:
>>> True
True
>>> False
False
>>> 3 > 2
True
>>> 3 > 5
False
布爾值可以用and布蔗、or和not運(yùn)算泄伪。
and運(yùn)算是與運(yùn)算翩腐,只有所有都為True,and運(yùn)算結(jié)果才是True:
>>> True and True
True
>>> True and False
False
>>> False and False
False
>>> 5 > 3 and 3 > 1
True
or運(yùn)算是或運(yùn)算垛玻,只要其中有一個(gè)為True议街,or運(yùn)算結(jié)果就是True:
>>> True or True
True
>>> True or False
True
>>> False or False
False
>>> 5 > 3 or 1 > 3
True
not運(yùn)算是非運(yùn)算泽谨,它是一個(gè)單目運(yùn)算符,把True變成False,F(xiàn)alse變成True:
>>> not True
False
>>> not False
True
>>> not 1 > 2
True
布爾值經(jīng)常用在條件判斷中吧雹,比如:
if age >= 18:
print('adult')
else:
print('teenager')
空值
空值是Python里一個(gè)特殊的值骨杂,用None
表示。None
不能理解為0
雄卷,因?yàn)?code>0是有意義的搓蚪,而None
是一個(gè)特殊的空值。
此外丁鹉,Python還提供了列表妒潭、字典等多種數(shù)據(jù)類型,還允許創(chuàng)建自定義數(shù)據(jù)類型揣钦,我們后面會(huì)繼續(xù)講到雳灾。
變量
變量的概念基本上和初中代數(shù)的方程變量是一致的,只是在計(jì)算機(jī)程序中冯凹,變量不僅可以是數(shù)字谎亩,還可以是任意數(shù)據(jù)類型。
變量在程序中就是用一個(gè)變量名表示了谈竿,變量名必須是大小寫英文团驱、數(shù)字和_的組合,且不能用數(shù)字開頭空凸,比如:
a = 1
變量a是一個(gè)整數(shù)嚎花。
t_007 = 'T007'
變量t_007是一個(gè)字符串。
Answer = True
變量Answer是一個(gè)布爾值True呀洲。
在Python中紊选,等號(hào)=是賦值語句,可以把任意數(shù)據(jù)類型賦值給變量道逗,同一個(gè)變量可以反復(fù)賦值兵罢,而且可以是不同類型的變量,例如:
a = 123 # a是整數(shù)
print(a)
a = 'ABC' # a變?yōu)樽址?print(a)
這種變量本身類型不固定的語言稱之為動(dòng)態(tài)語言滓窍,與之對(duì)應(yīng)的是靜態(tài)語言卖词。靜態(tài)語言在定義變量時(shí)必須指定變量類型,如果賦值的時(shí)候類型不匹配吏夯,就會(huì)報(bào)錯(cuò)此蜈。例如Java是靜態(tài)語言,賦值語句如下(// 表示注釋):
int a = 123; // a是整數(shù)類型變量
a = "ABC"; // 錯(cuò)誤:不能把字符串賦給整型變量
和靜態(tài)語言相比噪生,動(dòng)態(tài)語言更靈活裆赵,就是這個(gè)原因。
請(qǐng)不要把賦值語句的等號(hào)等同于數(shù)學(xué)的等號(hào)跺嗽。比如下面的代碼:
x = 10
x = x + 2
如果從數(shù)學(xué)上理解x = x + 2那無論如何是不成立的战授,在程序中页藻,賦值語句先計(jì)算右側(cè)的表達(dá)式x + 2,得到結(jié)果12植兰,再賦給變量x份帐。由于x之前的值是10,重新賦值后钉跷,x的值變成12弥鹦。
最后,理解變量在計(jì)算機(jī)內(nèi)存中的表示也非常重要爷辙。當(dāng)我們寫:
a = 'ABC'
時(shí)彬坏,Python解釋器干了兩件事情:
在內(nèi)存中創(chuàng)建了一個(gè)'ABC'的字符串;
在內(nèi)存中創(chuàng)建了一個(gè)名為a的變量膝晾,并把它指向'ABC'栓始。
也可以把一個(gè)變量a賦值給另一個(gè)變量b,這個(gè)操作實(shí)際上是把變量b指向變量a所指向的數(shù)據(jù)血当,例如下面的代碼:
a = 'ABC'
b = a
a = 'XYZ'
print(b)
常量
所謂常量就是不能變的變量幻赚,比如常用的數(shù)學(xué)常數(shù)π就是一個(gè)常量。在Python中臊旭,通常用全部大寫的變量名表示常量:
PI = 3.14159265359
但事實(shí)上PI仍然是一個(gè)變量落恼,Python根本沒有任何機(jī)制保證PI不會(huì)被改變,所以离熏,用全部大寫的變量名表示常量只是一個(gè)習(xí)慣上的用法佳谦,如果你一定要改變變量PI的值,也沒人能攔住你滋戳。
最后解釋一下整數(shù)的除法為什么也是精確的钻蔑。在Python中,有兩種除法奸鸯,一種除法是/:
>>> 10 / 3
3.3333333333333335
/除法計(jì)算結(jié)果是浮點(diǎn)數(shù)咪笑,即使是兩個(gè)整數(shù)恰好整除,結(jié)果也是浮點(diǎn)數(shù):
>>> 9 / 3
3.0
還有一種除法是//娄涩,稱為地板除窗怒,兩個(gè)整數(shù)的除法仍然是整數(shù):
>>> 10 // 3
3
你沒有看錯(cuò),整數(shù)的地板除//永遠(yuǎn)是整數(shù)蓄拣,即使除不盡扬虚。要做精確的除法,使用/就可以弯蚜。
因?yàn)?/除法只取結(jié)果的整數(shù)部分,所以Python還提供一個(gè)余數(shù)運(yùn)算剃法,可以得到兩個(gè)整數(shù)相除的余數(shù):
>>> 10 % 3
1
無論整數(shù)做//除法還是取余數(shù)碎捺,結(jié)果永遠(yuǎn)是整數(shù),所以,整數(shù)運(yùn)算結(jié)果永遠(yuǎn)是精確的收厨。
字符串和編碼
在最新的Python 3版本中晋柱,字符串是以Unicode編碼的,也就是說诵叁,Python的字符串支持多語言雁竞,例如:
>>> 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)制這么寫str:
>>> '\u4e2d\u6587'
'中文'
兩種寫法完全是等價(jià)的。
由于Python的字符串類型是str侥锦,在內(nèi)存中以Unicode表示进栽,一個(gè)字符對(duì)應(yīng)若干個(gè)字節(jié)。如果要在網(wǎng)絡(luò)上傳輸恭垦,或者保存到磁盤上快毛,就需要把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通過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無法用ASCII編碼,因?yàn)橹形木幋a的范圍超過了ASCII編碼的范圍赶熟,Python會(huì)報(bào)錯(cuò)瑰妄。
在bytes中,無法顯示為ASCII字符的字節(jié)映砖,用\x##顯示间坐。
反過來,如果我們從網(wǎng)絡(luò)或磁盤上讀取了字節(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
可見莫矗,1個(gè)中文字符經(jīng)過UTF-8編碼后通常會(huì)占用3個(gè)字節(jié)飒硅,而1個(gè)英文字符只占用1個(gè)字節(jié)砂缩。
在操作字符串時(shí),我們經(jīng)常遇到str和bytes的互相轉(zhuǎ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編碼讀取回官,我們通常在文件開頭寫上這兩行:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
第一行注釋是為了告訴Linux/OS X系統(tǒng)曹宴,這是一個(gè)Python可執(zhí)行程序,Windows系統(tǒng)會(huì)忽略這個(gè)注釋歉提;
第二行注釋是為了告訴Python解釋器笛坦,按照UTF-8編碼讀取源代碼,否則苔巨,你在源代碼中寫的中文輸出可能會(huì)有亂碼版扩。
申明了UTF-8編碼并不意味著你的.py文件就是UTF-8編碼的,必須并且要確保文本編輯器正在使用UTF-8 without BOM編碼.
如果.py文件本身使用UTF-8編碼侄泽,并且也申明了# -- coding: utf-8 --礁芦,打開命令提示符測(cè)試就可以正常顯示中文。
格式化
最后一個(gè)常見的問題是如何輸出格式化的字符串悼尾。我們經(jīng)常會(huì)輸出類似'親愛的xxx你好柿扣!你xx月的話費(fèi)是xx,余額是xx'之類的字符串闺魏,而xxx的內(nèi)容都是根據(jù)變量變化的未状,所以,需要一種簡(jiǎn)便的格式化字符串的方式析桥。
py-str-format
在Python中司草,采用的格式化方式和C語言是一致的,用%實(shí)現(xiàn)泡仗,舉例如下:
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'
你可能猜到了埋虹,%運(yùn)算符就是用來格式化字符串的。在字符串內(nèi)部娩怎,%s表示用字符串替換搔课,%d表示用整數(shù)替換,有幾個(gè)%?占位符截亦,后面就跟幾個(gè)變量或者值爬泥,順序要對(duì)應(yīng)好旦事。如果只有一個(gè)%?,括號(hào)可以省略急灭。
常見的占位符有:
%d 整數(shù)
%f 浮點(diǎn)數(shù)
%s 字符串
%x 十六進(jìn)制整數(shù)
其中,格式化整數(shù)和浮點(diǎn)數(shù)還可以指定是否補(bǔ)0和整數(shù)與小數(shù)的位數(shù):
>>> '%2d-%02d' % (3, 1)
' 3-01'
>>> '%.2f' % 3.1415926
'3.14'
如果你不太確定應(yīng)該用什么谷遂,%s永遠(yuǎn)起作用葬馋,它會(huì)把任何數(shù)據(jù)類型轉(zhuǎn)換為字符串:
>>> 'Age: %s. Gender: %s' % (25, True)
'Age: 25. Gender: True'
有些時(shí)候,字符串里面的%是一個(gè)普通字符怎么辦肾扰?這個(gè)時(shí)候就需要轉(zhuǎn)義畴嘶,用%%來表示一個(gè)%:
>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'