變量和數據類型

1數據類型

一、整數

Python可以處理任意大小的整數,當然包括負整數,在Python程序中,整數的表示方法和數學上的寫法一模一樣,例如:1,100,-8080,0,等等。

計算機由於使用二進制,所以,有時候用十六進制表示整數比較方便,十六進制用0x前綴和0-9,a-f表示,例如:0xff00,0xa5b4c3d2,等等。

二、浮點數

浮點數也就是小數,之所以稱爲浮點數,是因爲按照科學記數法表示時,一個浮點數的小數點位置是可變的,比如,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,等等。

整數和浮點數在計算機內部存儲的方式是不同的,整數運算永遠是精確的(除法難道也是精確的?是的!),而浮點數運算則可能會有四捨五入的誤差。

三、字符串

字符串是以''或""括起來的任意文本,比如'abc'"xyz"等等。請注意,''""本身只是一種表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c這3個字符。

四、布爾值

布爾值和布爾代數的表示完全一致,一個布爾值只有True、False兩種值,要麼是True,要麼是False,在Python中,可以直接用TrueFalse表示布爾值(請注意大小寫),也可以通過布爾運算計算出來。

布爾值可以用and、or和not運算。

and運算是與運算,只有所有都爲 True,and運算結果纔是 True。

or運算是或運算,只要其中有一個爲 True,or 運算結果就是 True。

not運算是非運算,它是一個單目運算符,把 True 變成 False,False 變成 True。

五、空值

空值是Python裏一個特殊的值,用None表示。None不能理解爲0,因爲0是有意義的,而None是一個特殊的空值。

六、其他

此外,Python還提供了列表、字典等多種數據類型,還允許創建自定義數據類型,我們後面會繼續講到

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 + 200Python解釋器自動計算出結果300,但是,'100 + 200 ='是字符串而非數學公式,Python把它視爲字符串,請自行解釋上述打印結果。

輸入

如果要讓用戶從電腦輸入一些字符怎麼辦?Python提供了一個raw_input,可以讓用戶輸入字符串,並存放到一個變量裏。比如輸入用戶的名字:

<span style="background-color: rgb(255, 255, 255);">>>> name=raw_input()
wang ailing 
>>>print name
wang ailing</span>

帶提示行的輸入:

<span style="background-color: rgb(255, 255, 255);">>>> name=raw_input('please input your name:')
please input your name:wang ailing
>>>print name
wang ailing</span>

3註釋

Python的註釋以 # 開頭,後面的文字直到行尾都算註釋

4變量

Python程序中,變量是用一個變量名錶示,變量名必須是大小寫英文、數字和下劃線(_)的組合,且不能用數字開頭,比如:

變量t_007是一個字符串。

Python中,等號=是賦值語句,可以把任意數據類型賦值給變量,同一個變量可以反覆賦值,而且可以是不同類型的變量,例如:

a = 123    # a是整數

print a

a ='imooc'   # a變爲字符串

print a

這種變量本身類型不固定的語言稱之爲動態語言,與之對應的是靜態語言。

最後,理解變量在計算機內存中的表示也非常重要。當我們寫:a = 'ABC'時,Python解釋器幹了兩件事情:

1.在內存中創建了一個'ABC'的字符串;

2.在內存中創建了一個名爲a的變量,並把它指向'ABC'

也可以把一個變量a賦值給另一個變量b,這個操作實際上是把變量b指向變量a所指向的數據,例如下面的代碼:

a = 'ABC'

b = a

a = 'XYZ'

print b

最後一行打印出變量b的內容到底是'ABC'呢還是'XYZ'?如果從數學意義上理解,就會錯誤地得出ba相同,也應該是'XYZ',但實際上b的值是'ABC',讓我們一行一行地執行代碼,就可以看到到底發生了什麼事:

執行a = 'ABC',解釋器創建了字符串  'ABC'和變量 a,並把a指向 'ABC'


執行b = a,解釋器創建了變量 b,並把b指向 a 指向的字符串'ABC'


執行a = 'XYZ',解釋器創建了字符串'XYZ',並把a的指向改爲'XYZ',但b並沒有更改:


所以,最後打印變量b的結果自然是'ABC'了。

 

5字符串

前面我們講解了什麼是字符串。字符串可以用''或者""括起來表示。

如果字符串本身包含'怎麼辦?比如我們要表示字符串 I'm OK ,這時,可以用" "括起來表示:

"I'mOK"

類似的,如果字符串包含",我們就可以用' '括起來表示:

'Learn"Python" in imooc'

如果字符串既包含'又包含"怎麼辦?

這個時候,就需要對字符串的某些特殊字符進行轉義Python字符串用\進行轉義。

要表示字符串 Bob said "I'm OK".
由於 ' " 會引起歧義,因此,我們在它前面插入一個\表示這是一個普通字符,不代表字符串的起始,因此,這個字符串又可以表示爲

'Bob said\"I\'m OK\".'

注意:轉義字符 \不計入字符串的內容中。

常用的轉義字符還有:

\n 表示換行

\t 表示一個製表符

\\ 表示 \字符本身

 

6raw字符串和多行字符串

如果一個字符串包含很多需要轉義的字符,對每一個字符都進行轉義會很麻煩。爲了避免這種情況,我們可以在字符串前面加個前綴,表示這是一個 raw 字符串,裏面的字符就不需要轉義了。例如:

r'\(~_~)/\(~_~)/'

但是r'...'表示法不能表示多行字符串,也不能表示包含' "的字符串(爲什麼?)

如果要表示多行字符串,可以用'''...'''表示:

'''Line 1

Line 2

Line 3'''

上面這個字符串的表示方法和下面的是完全一樣的:

'Line 1\nLine2\nLine 3'

還可以在多行字符串前面添加 r ,把這個多行字符串也變成一個raw字符串

r'''Python iscreated by "Guido".

It is free andeasy to learn.

Let's startlearn Python in imooc!'''

注意’’’’’’第一個要緊跟字符,不能之間有回車什麼的,要不就有相應輸出

7Unicode字符串

因爲計算機只能處理數字,如果要處理文本,就必須先把文本轉換爲數字才能處理。最早的計算機在設計時採用8個比特(bit)作爲一個字節(byte),所以,一個字節能表示的最大的整數就是255(二進制11111111=十進制255),0 - 255被用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼,比如大寫字母 的編碼是65,小寫字母 的編碼是122

如果要表示中文,顯然一個字節是不夠的,至少需要兩個字節,而且還不能和ASCII編碼衝突,所以,中國製定了GB2312編碼,用來把中文編進去。

類似的,日文和韓文等其他語言也有這個問題。爲了統一所有文字的編碼,Unicode應運而生。Unicode把所有語言都統一到一套編碼裏,這樣就不會再有亂碼問題了。

Unicode通常用兩個字節表示一個字符,原有的英文編碼從單字節變成雙字節,只需要把高字節全部填爲0就可以。

因爲Python的誕生比Unicode標準發佈的時間還要早,所以最早的Python只支持ASCII編碼,普通的字符串'ABC'Python內部都是ASCII編碼的。

Python在後來添加了對Unicode的支持,以Unicode表示的字符串用u'...'表示,比如:

print u'中文'

中文

注意: 不加 u,中文就不能正常顯示。

Unicode字符串除了多了一個 u 之外,與普通字符串沒啥區別,轉義字符和多行表示法仍然有效:

轉義:

u'中文\n日文\n韓文'

多行:

u'''第一行

第二行'''

raw+多行:

ur'''PythonUnicode字符串支持"中文",

"日文",

"韓文"等多種語言'''

如果中文字符串在Python環境下遇到 UnicodeDecodeError,這是因爲.py文件保存的格式有問題。可以在第一行添加註釋

# -*- coding: utf-8 -*-

目的是告訴Python解釋器,用UTF-8編碼讀取源代碼。然後用Notepad++另存爲... 並選擇UTF-8格式保存。

 

8整數和浮點數

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

 

9布爾類型

我們已經瞭解了Python支持布爾類型的數據,布爾類型只有TrueFalse兩種值,但是布爾類型有以下幾種運算:

與運算:只有兩個布爾值都爲 True時,計算結果才爲 True

True andTrue   # ==> True

True andFalse   # ==> False

False andTrue   # ==> False

False andFalse   # ==> False

或運算:只要有一個布爾值爲 True,計算結果就是 True

True orTrue   # ==> True

True orFalse   # ==> True

False orTrue   # ==> True

False orFalse   # ==> False

非運算:把True變爲False,或者把False變爲True

not True   # ==> False

not False   # ==> True

布爾運算在計算機中用來做條件判斷,根據計算結果爲True或者False,計算機可以自動執行不同的後續代碼。

Python中,布爾類型還可以與其他數據類型做 andornot運算,請看下面的代碼:

a = True

print a and'a=T' or 'a=F'

計算結果不是布爾類型,而是字符串 'a=T',這是爲什麼呢?

因爲Python0空字符串''None看成 False其他數值非空字符串都看成 True,所以:

True and 'a=T' 計算結果是 'a=T'

繼續計算 'a=T' or 'a=F'計算結果還是 'a=T'

要解釋上述結果,又涉及到 and or 運算的一條重要法則:短路計算

1. 在計算 aand b 時,如果 a False,則根據與運算法則,整個結果必定爲 False,因此返回 a;如果 a True,則整個計算結果必定取決與 b,因此返回 b

2.在計算 aor b 時,如果 a True,則根據或運算法則,整個計算結果必定爲 True,因此返回 a;如果 a False,則整個計算結果必定取決於 b,因此返回 b

所以Python解釋器在做布爾運算時,只要能提前確定計算結果,它就不會往後算了,直接返回結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章