Python筆記(二)——Python中的基本語句、變數和資料型別
目錄
一、python的基本語句
1.1 print語句
與Python2版本相比,Python3有部分語句做了更改,比如print語句中,3版本要比2多一對括號
print語句可以向螢幕上輸出指定的文字。比如輸出'hello, world',用程式碼實現如下:
>>> print ('hello, world')
注意:
1.當我們在Python互動式環境下編寫程式碼時,>>>
是Python直譯器的提示符,不是程式碼的一部分。
2.當我們在文字編輯器中編寫程式碼時,千萬不要自己新增 >>>。
print語句也可以跟上多個字串,用逗號“,”隔開,就可以連成一串輸出:
>>> print 'The quick brown fox', 'jumps over', 'the lazy dog' The quick brown fox jumps over the lazy dog
print會依次列印每個字串,遇到逗號“,”會輸出一個空格,因此,輸出的字串是這樣拼起來的:
print也可以列印整數,或者計算結果:
>>> print (300)
300 #執行結果
>>> print (100 + 200 )
300 #執行結果
因此,我們可以把計算100 + 200的結果列印得更漂亮一點:
>>> print ('100 + 200 =', 100 + 200 )
100 + 200 = 300 #執行結果
注意: 對於100 + 200,Python直譯器自動計算出結果300,但是,'100 + 200 ='是字串而非數學公式,Python把它視為字串,請自行解釋上述列印結果。
任務
請用兩種方式打印出 hello, python.
1.2 python的註釋
任何時候,我們都可以給程式加上註釋。註釋是用來說明程式碼的,給自己或別人看,而程式執行的時候,Python直譯器會直接忽略掉註釋,所以,有沒有註釋不影響程式的執行結果,但是影響到別人能不能看懂你的程式碼。
Python的註釋以 #
開頭,後面的文字直到行尾都算註釋
# 這一行全部都是註釋...
print ('hello') # 這也是註釋
註釋還有一個巧妙的用途,就是一些程式碼我們不想執行,但又不想刪除,就可以用註釋暫時遮蔽掉:
# 暫時不想執行下面一行程式碼:
# print ('hello, python.')
二、資料型別
在Python中,能夠直接處理的資料型別有以下幾種:
2.1、整數
Python可以處理任意大小的整數,當然包括負整數,在Python程式中,整數的表示方法和數學上的寫法一模一樣,例如:1
,100
,-8080
,0
,等等。
計算機由於使用二進位制,所以,有時候用十六進位制表示整數比較方便,十六進位制用0x
字首和0-9,a-f表示,例如:0xff00
,0xa5b4c3d2
,等等。
2.2、浮點數
浮點數也就是小數,之所以稱為浮點數,是因為按照科學記數法表示時,一個浮點數的小數點位置是可變的,比如,1.23x10^9和12.3x10^8是相等的。浮點數可以用數學寫法,如1.23
,3.14
,-9.01
,等等。但是對於很大或很小的浮點數,就必須用科學計數法表示,把10用e替代,1.23x10^9就是1.23e9,或者12.3e8,0.000012可以寫成1.2e-5,等等。
整數和浮點數在計算機內部儲存的方式是不同的,整數運算永遠是精確的(除法難道也是精確的?是的!),而浮點數運算則可能會有四捨五入的誤差。
2.3、字串
字串是以''
或""
括起來的任意文字,比如'abc',"xyz"等等。請注意,' '或" "本身只是一種表示方式,不是字串的一部分,因此,字串'abc'
只有a,b,c
這3個字元。
2.4、布林值
布林值和布林代數的表示完全一致,一個布林值只有True
、False
兩種值,要麼是True
,要麼是False
,在Python中,可以直接用True
、False
表示布林值(請注意大小寫),也可以通過布林運算計算出來。
布林值可以用and
、or
和not
運算。
and
運算是與運算,只有所有都為 True,and運算結果才是 True。
or
運算是或運算,只要其中有一個為 True,or 運算結果就是 True。
not
運算是非運算,它是一個單目運算子,把 True 變成 False,False 變成 True。
2.5、空值
空值是Python裡一個特殊的值,用None
表示。None不能理解為0,因為0是有意義的,而None是一個特殊的空值。
此外,Python還提供了列表、字典等多種資料型別,還允許建立自定義資料型別,我們後面會繼續講到
在編輯器中,完成以下任務:
1. 計算十進位制整數 45678 和十六進位制整數 0x12fd2 之和。
2. 請用字串表示出Learn Python in imooc。
3. 請計算以下表達式的布林值(注意==表示判斷是否相等):
100 < 99
0xff == 255
注意:使用print命令
1)print可以把結果打印出來:
print 45678 + 0x12fd2
2) print 'Learn Python in imooc'
或者:
print "Learn Python in imooc"
3)print 100 < 99
print 0xff == 255
結果:
False
True
三、Python中的變數
在Python中,變數的概念基本上和初中代數的方程變數是一致的。
例如,對於方程式 y=x*x
,x
就是變數。當x=2
時,計算結果是4
,當x=5
時,計算結果是25
。
只是在計算機程式中,變數不僅可以是數字,還可以是任意資料型別。
在Python程式中,變數是用一個變數名錶示,變數名必須是大小寫英文、數字和下劃線(_)的組合,且不能用數字開頭,比如:
a = 1
變數a
是一個整數。
t_007 = 'T007'
變數t_007
是一個字串。
在Python中,等號=
是賦值語句,可以把任意資料型別賦值給變數,同一個變數可以反覆賦值,而且可以是不同型別的變數,例如:
a = 123 # a是整數
print (a)
a = 'imooc' # a變為字串
print (a)
這種變數本身型別不固定的語言稱之為動態語言,與之對應的是靜態語言。
靜態語言在定義變數時必須指定變數型別,如果賦值的時候型別不匹配,就會報錯。例如Java是靜態語言,賦值語句如下(// 表示註釋):
int a = 123; // a是整數型別變數
a = "mooc"; // 錯誤:不能把字串賦給整型變數
和靜態語言相比,動態語言更靈活,就是這個原因。
請不要把賦值語句的等號等同於數學的等號。比如下面的程式碼:
x = 10
x = x + 2
如果從數學上理解x = x + 2那無論如何是不成立的,在程式中,賦值語句先計算右側的表示式x + 2,得到結果12,再賦給變數x。由於x之前的值是10,重新賦值後,x的值變成12。
最後,理解變數在計算機記憶體中的表示也非常重要。當我們寫:a = 'ABC'
時,Python直譯器幹了兩件事情:
1. 在記憶體中建立了一個'ABC'
的字串;
2. 在記憶體中建立了一個名為a
的變數,並把它指向'ABC'
。
也可以把一個變數a賦值給另一個變數b,這個操作實際上是把變數b指向變數a所指向的資料,例如下面的程式碼:
a = 'ABC'
b = a
a = 'XYZ'
print (b)
最後一行打印出變數b的內容到底是'ABC'呢還是'XYZ'?如果從數學意義上理解,就會錯誤地得出b和a相同,也應該是'XYZ',但實際上b的值是'ABC',讓我們一行一行地執行程式碼,就可以看到到底發生了什麼事:
執行a = 'ABC'
,直譯器建立了字串 'ABC'和變數 a,並把a指向 'ABC':
執行b = a
,直譯器建立了變數 b,並把b指向 a 指向的字串'ABC':
執行a = 'XYZ'
,直譯器建立了字串'XYZ',並把a的指向改為'XYZ',但b並沒有更改:
所以,最後列印變數b
的結果自然是'ABC'
了。
上面例子的具體實現:
四、Python中定義字串
前面我們講解了什麼是字串。字串可以用''
或者""
括起來表示。
a、 如果字串本身包含'
怎麼辦?比如我們要表示字串 I'm OK
,這時,可以用" "
括起來表示:
"I'm OK"
b、類似的,如果字串包含"
,我們就可以用' '
括起來表示:
'Learn "Python" in imooc'
c、如果字串既包含'
又包含"
怎麼辦?
這個時候,就需要對字串的某些特殊字元進行“轉義”,Python字串用\
進行轉義。
要表示字串 Bob said "I'm OK".
由於 ' 和 " 會引起歧義,因此,我們在它前面插入一個\
表示這是一個普通字元,不代表字串的起始,因此,這個字串又可以表示為
'Bob said \"I\'m OK\".'
注意:轉義字元 \ 不計入字串的內容中。
常用的轉義字元還有:
\n 表示換行
\t 表示一個製表符
\\ 表示
\ 字元本身
任務
請將下面兩行內容用Python的字串表示並打印出來:
>>> s1 = 'Python was started in 1989 by "Guido".\nPython is free and easy to learn.'
>>> s2 = 'Python was started in 1989 by \"Guido\".\nPython is free and easy to learn.'
>>> print ('s1= \n",s1,"\ns2= \n",s2)
s1=
Python was started in 1989 by "Guido".
Python is free and easy to learn.
s2=
Python was started in 1989 by "Guido".
Python is free and easy to learn.
五、Python中raw字串與多行字串
如果一個字串包含很多需要轉義的字元,對每一個字元都進行轉義會很麻煩。為了避免這種情況,我們可以在字串前面加個字首r
,表示這是一個 raw 字串,裡面的字元就不需要轉義了。例如:
r'\(~_~)/ \(~_~)/'
但是r'...'
表示法不能表示多行字串,也不能表示包含'
和 "
的字串(為什麼?)
如果要表示多行字串,可以用'''...'''
表示:
'''Line 1
Line 2
Line 3'''
上面這個字串的表示方法和下面的是完全一樣的:
'Line 1\nLine 2\nLine 3'
還可以在多行字串前面新增r
,把這個多行字串也變成一個raw字串:
r'''Python is created by "Guido".
It is free and easy to learn.
Let's start learn Python in imooc!'''
任務
請把下面的字串用
r'''...'''
的形式改寫,並用print打印出來:'\"To be, or not to be\": that is the question.\nWhether it\'s nobler in the mind to suffer.'
六、Python中Unicode字串
字串還有一個編碼問題。
因為計算機只能處理數字,如果要處理文字,就必須先把文字轉換為數字才能處理。最早的計算機在設計時採用8個位元(bit)作為一個位元組(byte),所以,一個位元組能表示的最大的整數就是255(二進位制11111111=十進位制255),0 - 255被用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母 A 的編碼是65,小寫字母 z 的編碼是122。
如果要表示中文,顯然一個位元組是不夠的,至少需要兩個位元組,而且還不能和ASCII編碼衝突,所以,中國製定了GB2312編碼,用來把中文編進去。
類似的,日文和韓文等其他語言也有這個問題。為了統一所有文字的編碼,Unicode應運而生。Unicode把所有語言都統一到一套編碼裡,這樣就不會再有亂碼問題了。
Unicode通常用兩個位元組表示一個字元,原有的英文編碼從單位元組變成雙位元組,只需要把高位元組全部填為0就可以。
因為Python的誕生比Unicode標準釋出的時間還要早,所以最早的Python只支援ASCII編碼,普通的字串'ABC'在Python內部都是ASCII編碼的。
Python在後來添加了對Unicode的支援,以Unicode表示的字串用u'...'表示,比如:
print (u'中文')
中文
注意: python2中不加 u ,中文就不能正常顯示。
python3沒這個問題
Unicode字串除了多了一個u
之外,與普通字串沒啥區別,轉義字元和多行表示法仍然有效:
轉義:
u'中文\n日文\n韓文'
多行:
u'''第一行
第二行'''
raw+多行(適用於Python2中):
ur'''Python的Unicode字串支援"中文",
"日文",
"韓文"等多種語言'''
如果中文字串在Python環境下遇到 UnicodeDecodeError,這是因為.py檔案儲存的格式有問題。可以在第一行添加註釋
# -*- coding: utf-8 -*-
目的是告訴Python直譯器,用UTF-8編碼讀取原始碼。然後用Notepad++ 另存為... 並選擇UTF-8格式儲存。
注:在python2中有上面這句話後,下面就不要加u了
任務
用多行Unicode字串表示下面的唐詩並列印:
靜夜思
床前明月光,
疑是地上霜。
舉頭望明月,
低頭思故鄉。
注:python3中在輸出多行字串時有u和沒u效果一樣
七、Python中整數和浮點數
Python支援對整數和浮點數直接進行四則混合運算,運算規則和數學上的四則運算規則完全一致。
基本的運算:
1 + 2 + 3 # ==> 6
4 * 5 - 6 # ==> 14
7.5 / 8 + 2.1 # ==> 3.0375
使用括號可以提升優先順序,這和數學運算完全一致,注意只能使用小括號,但是括號可以巢狀很多層:
(1 + 2) * 3 # ==> 9
(2.2 + 3.3) / (1.5 * (9 - 0.3)) # ==> 0.42145593869731807
和數學運算不同的地方是,Python的整數運算結果仍然是整數,浮點數運算結果仍然是浮點數:
1 + 2 # ==> 整數 3
1.0 + 2.0 # ==> 浮點數 3.0
但是整數和浮點數混合運算的結果就變成浮點數了:
1 + 2.0 # ==> 浮點數 3.0
為什麼要區分整數運算和浮點數運算呢?這是因為整數運算的結果永遠是精確的,而浮點數運算的結果不一定精確,因為計算機記憶體再大,也無法精確表示出無限迴圈小數,比如0.1
換成二進位制表示就是無限迴圈小數。
那整數的除法運算遇到除不盡的時候,結果難道不是浮點數嗎?我們來試一下:
11 / 4 # ==> 2
令很多初學者驚訝的是,Python的整數除法,即使除不盡,結果仍然是整數,餘數直接被扔掉。不過,Python提供了一個求餘的運算 % 可以計算餘數:
11 % 4 # ==> 3
如果我們要計算 11 / 4 的精確結果,按照“整數和浮點數混合運算的結果是浮點數”的法則,把兩個數中的一個變成浮點數再運算就沒問題了:
11.0 / 4 # ==> 2.75
任務
請計算 2.5 + 10 / 4 ,並解釋計算結果為什麼不是期望的 5.0 ?
請修復上述運算,使得計算結果是 5.0
計算 2.5 + 10 / 4 時,根據優先順序,Python首先計算 10 / 4,由於這兩個數都是整數,因此計算結果為 2。
然後,繼續計算 2.5 + 2,得到最終計算結果 4.5。
因此,我們需要注意運算順序,並不是存在浮點數計算結果就一定是準確的浮點數。
參考程式碼:
print 2.5 + 10.0 / 4
八、Python中布林型別
我們已經瞭解了Python支援布林型別的資料,布林型別只有True
和False
兩種值,但是布林型別有以下幾種運算:
與運算:只有兩個布林值都為 True 時,計算結果才為 True。
True and True # ==> True
True and False # ==> False
False and True # ==> False
False and False # ==> False
或運算:只要有一個布林值為 True,計算結果就是 True。
True or True # ==> True
True or False # ==> True
False or True # ==> True
False or False # ==> False
非運算:把True變為False,或者把False變為True:
not True # ==> False
not False # ==> True
布林運算在計算機中用來做條件判斷,根據計算結果為True或者False,計算機可以自動執行不同的後續程式碼。
在Python中,布林型別還可以與其他資料型別做 and、or和not運算,請看下面的程式碼:
a = True
print (a and 'a=T' or 'a=F')
計算結果不是布林型別,而是字串 'a=T',這是為什麼呢?
因為Python把0
、空字串''
和None
看成 False,其他數值和非空字串都看成 True,所以:
True and 'a=T' 計算結果是 'a=T'
繼續計算 'a=T' or 'a=F' 計算結果還是 'a=T'
要解釋上述結果,又涉及到 and 和 or 運算的一條重要法則:短路計算。
1. 在計算 a and b
時,如果 a 是 False,則根據與運演算法則,整個結果必定為 False,因此返回 a;如果 a 是 True,則整個計算結果必定取決與 b,因此返回 b。
2. 在計算 a or b
時,如果 a 是 True,則根據或運演算法則,整個計算結果必定為 True,因此返回 a;如果 a 是 False,則整個計算結果必定取決於 b,因此返回 b。
所以Python直譯器在做布林運算時,只要能提前確定計算結果,它就不會往後算了,直接返回結果。
任務
請執行如下程式碼,並解釋列印的結果:
a = 'python' print ('hello,', a or 'world') b = '' print ('hello,', b or 'world')