Python變量及數據類型

1.Python中數據類型
Python中數據類型

計算機顧名思義就是可以做數學計算的機器,因此,計算機程序理所當然地可以處理各種數值。但是,計算機能處理的遠不止數值,還可以處理文本、圖形、音頻、視頻、網頁等各種各樣的數據,不同的數據,需要定義不同的數據類型。在Python中,能夠直接處理的數據類型有以下幾種:

一、整數

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

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

二、浮點數

浮點數也就是小數,之所以稱為浮點數,是因為按照科學記數法表示時,一個浮點數的小數點位置是可變的,比如,1.23x10^9 和12.3x10^8 是相等的。浮點數可以用數學寫法,如1.233.14-9.01,等等。但是對于很大或很小的浮點數,就必須用科學計數法表示,把10用e替代,1.23x10^9就是1.23e9,或者12.3e8,0.000012可以寫成1.2e-5,等等。

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

三、字符串

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

四、布爾值

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

布爾值可以用andornot運算。

and運算是與運算,只有所有都為 Trueand運算結果才是 True

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

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

五、空值

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

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

2.Python之print語句

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把它視為字符串,請自行解釋上述打印結果。

3.Python的注釋

任何時候,我們都可以給程序加上注釋。注釋是用來說明代碼的,給自己或別人看,而程序運行的時候,Python解釋器會直接忽略掉注釋,所以,有沒有注釋不影響程序的執行結果,但是影響到別人能不能看懂你的代碼。

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

# 這一行全部都是注釋...
print 'hello' # 這也是注釋

注釋還有一個巧妙的用途,就是一些代碼我們不想運行,但又不想刪除,就可以用注釋暫時屏蔽掉:

# 暫時不想運行下面一行代碼:
# print 'hello, python.'
4.Python中什么是變量
在Python中,變量的概念基本上和初中代數的方程變量是一致的。

例如,對于方程式 y=x*xx就是變量。當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所指向的<font color=#0099ff size=12 face="黑體">黑體</font>,例如下面的代碼:

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'
了。

5.Python中定義字符串

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

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

"I'm OK"

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

'Learn "Python" in imooc'

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

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

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

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

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

常用的轉義字符還有:

\n 表示換行
\t 表示一個制表符
\\ 表示 \ 字符本身
6.Python中raw字符串與多行字符串

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

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

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

因為不能區分\n不會被解釋成換行',"也不會被轉譯

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

'''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!'''
7.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'中文'

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

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

轉義:

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

多行:

u'''第一行
第二行'''
raw+多行:

ur'''Python的Unicode字符串支持"中文",
"日文",
"韓文"等多種語言'''

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

# -*- coding: utf-8 -*-
目的是告訴Python解釋器,用UTF-8編碼讀取源代碼。然后用Notepad++ 另存為... 并選擇UTF-8格式保存。

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

print u'''靜夜思
床前明月光,
疑是地上霜。
舉頭望明月,
低頭思故鄉。'''

我上面的代碼運行后報錯如下:

<pre>Traceback (most recent call last): File "index.py", line 7, in <module> 低頭思故鄉。''' UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

錯誤原因:編碼沖突(Unicode VS utf-8)
解釋:代碼編輯第一行的注釋#-*-coding:utf-8 -*-,表明以下Python代碼使用utf-8編碼,但是很多人把題目要求的輸出語句寫成print u'" ..."',這樣就又要讓解釋器使用Unicode編碼輸出,導致解碼出錯。我們應該記住以何種方式編碼就應以何種方式解碼,否則就很有可能出現編碼錯誤。

8.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(Java,objective-c等也是)的整數除法,即使除不盡,結果仍然是整數,余數直接被扔掉。不過,Python提供了一個求余的運算 % 可以計算余數:

11 % 4    # ==> 3

如果我們要計算11 / 4 的精確結果,按照“整數和浮點數混合運算的結果是浮點數”的法則,把兩個數中的一個變成浮點數再運算就沒問題了:

11.0 / 4    # ==> 2.75
9.Python中布爾類型

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

與運算:只有兩個布爾值都為 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中,布爾類型還可以與其他數據類型做 andornot運算,請看下面的代碼:
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'
要解釋上述結果,又涉及到 andor 運算的一條重要法則:短路計算。

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

  2. 在計算 a or b 時,如果 aTrue,則根據或運算法則,整個計算結果必定為 True,因此返回 a;如果 aFalse,則整個計算結果必定取決于b,因此返回 b

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

a = 'python'
print 'hello,', a or 'world' #hello,python

b = ''
print 'hello,', b or 'world' #hello,world
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容