Python 小結(jié)

最近項(xiàng)目當(dāng)中要用python來實(shí)現(xiàn)一些功能,于是就抓緊時(shí)間學(xué)習(xí)了一下python,順便將學(xué)習(xí)過程當(dāng)中的一些知識(shí)點(diǎn)記錄下來,方便隨時(shí)查閱:

1、我們先用 print 語句完成程序員們老生常談第一個(gè)編程實(shí)例,Hello World!

>>> print 'Hello World!'
Hello World!

2、函數(shù) abs()接受一個(gè)數(shù)值輸入,然后輸出這個(gè)數(shù)值的絕對(duì)值:

>>> abs(-4)
4
>>> abs(4)
4

3、在下面的例子中,我們把一個(gè)字符串賦值給變量 myString,先用 print 來顯示變量的內(nèi)容,之后用變量名稱來顯示。
核心筆記:在交互式解釋器中顯示變量的值
通常當(dāng)你想看變量?jī)?nèi)容時(shí),你會(huì)在代碼中使用 print 語句輸出。不過在交互式解釋器中,你可以用 print 語句顯示變量的字符串表示,或者僅使用變量名查看該變量的原始值。在下面的例子中,我們把一個(gè)字符串賦值給變量 myString,先用 print 來顯示變量的內(nèi)容,之后用變量名稱來顯示。

>>> myString = 'Hello World!'
>>> print myString
Hello World!
>>> myString
'Hello World!'
>>> myString = 'Hello World!'
>>> print myString
Hello World!
>>> myString
'Hello World!'

注意:在僅用變量名時(shí),輸出的字符串是被用單引號(hào)括起來了的。這是為了讓非字符串對(duì)
象也能以字符串的方式顯示在屏幕上--即它顯示的是該對(duì)象的字符串表示,而不僅僅是字符
串本身。引號(hào)表示你剛剛輸入的變量的值是一個(gè)字符串。

4、下劃線(_)在解釋器中有特別的含義,表示最后一個(gè)表達(dá)式的值。所以上面的代碼執(zhí)行之后,下劃線變量會(huì)包含字符串:

>>>_ 
Hello World!

5、Python 的 print 語句,與字符串格式運(yùn)算符( % )結(jié)合使用,可實(shí)現(xiàn)字符串替換功能,這一點(diǎn)和 C 語言中的 printf()函數(shù)非常相似:

>>> print "%s is number %d!" % ("Python", 1)
Python is number 1!

%s 表示由一個(gè)字符串來替換,而%d 表示由一個(gè)整數(shù)來替換,另外一個(gè)很常用的就是%f, 它表示由一個(gè)浮點(diǎn)數(shù)來替換。我們會(huì)在本章中看到更多類似的例子。Python 非常靈活,所以即使你將數(shù)字傳遞給 %s,也不會(huì)像其他要求嚴(yán)格的語言一樣引發(fā)嚴(yán)重后果。

6、Print 語句也支持將輸出重定向到文件。這個(gè)特性是從Python2.0 開始新增的。符號(hào) >> 用來重定向輸出,下面這個(gè)例子將輸出重定向到標(biāo)準(zhǔn)錯(cuò)誤輸出:

import sys
print >> sys.stderr, 'Fatal error: invalid input!'
import sys
print >> sys.stderr, 'Fatal error: invalid input!'

下面是一個(gè)將輸出重定向到日志文件的例子:

logfile = open('/tmp/mylog.txt', 'a')
print >> logfile, 'Fatal error: invalid input!'
logfile.close()

7、程序輸入和 內(nèi)建函數(shù)raw_input()
從用戶那里得到數(shù)據(jù)輸入的最容易的方法是使用 raw_input()內(nèi)建函數(shù)。 它讀取標(biāo)準(zhǔn)輸入,并將讀取到的數(shù)據(jù)賦值給指定的變量。 你可以使用 int() 內(nèi)建函數(shù)將用戶輸入的字符串轉(zhuǎn)換為整數(shù)。

>>> user = raw_input('Enter login name: ')
Enter login name: root                         
>>> print 'Your login is:', user
Your login is: root

上面這個(gè)例子只能用于文本輸入。 下面是輸入一個(gè)數(shù)值字符串(并將字符串轉(zhuǎn)換為整數(shù))的例子:

>>> num = raw_input('Now enter a number: ')
Now enter a number: 1024
>>> print 'Doubling your number: %d' % (int(num) * 2)
Doubling your number: 2048

內(nèi)建函數(shù) int()將數(shù)值字符串轉(zhuǎn)換成整數(shù)值,這樣才可以對(duì)它進(jìn)行數(shù)學(xué)運(yùn)算。

8、在學(xué)習(xí) Python 的過程中,如果需要得到一個(gè)生疏函數(shù)的幫助,只需要對(duì)它調(diào)用內(nèi)建函數(shù)help()。通過用函數(shù)名作為 help()的參數(shù)就能得到相應(yīng)的幫助信息:

>>> help(raw_input)
Help on built-in function raw_input in module __builtin__:
raw_input(...)
raw_input([prompt]) -> string

9、range()函數(shù)經(jīng)常和 len()函數(shù)一起用于字符串索引。 在這里我們要顯示每一個(gè)元素及其索引值:

>>> foo = 'abc'
>>> for i in range(len(foo)):
... print foo[i], '(%d)' % i
a (0)
b (1)
c (2)

10、列表解析,你可以在一行中使用一個(gè) for 循環(huán)將所有值放到一個(gè)列表當(dāng)中:

>>> squared = [x ** 2 for x in range(4)]
>>> for i in squared:
... print i
0
1
4
9

列表解析甚至能做更復(fù)雜的事情, 比如挑選出符合要求的值放入列表:

>>> sqdEvens = [x ** 2 for x in range(8) if not x % 2]
>>> for i in sqdEvens:
... print i
0
4
16
36

11、列表和元組
可以將列表和元組當(dāng)成普通的“數(shù)組”,它能保存任意數(shù)量任意類型的 Python 對(duì)象。和數(shù)組一樣,通過從 0 開始的數(shù)字索引訪問元素,但是列表和元組可以存儲(chǔ)不同類型的對(duì)象。列表和元組有幾處重要的區(qū)別。列表元素用中括號(hào)( [ ])包裹,元素的個(gè)數(shù)及元素的值可以改變。元組元素用小括號(hào)(( ))包裹,不可以更改(盡管他們的內(nèi)容可以)。元組可以看成是只讀的列表。通過切片運(yùn)算( [ ] 和 [ : ] )可以得到子集,這一點(diǎn)與字符串的使用方法一樣。

>>> aList = [1, 2, 3, 4]
>>> aList
[1, 2, 3, 4]
>>> aList[0]
1
>>> aList[2:]
[3, 4]
>>> aList[:3]
[1, 2, 3]
>>> aList[1] = 5
>>> aList
[1, 5, 3, 4]

元組也可以進(jìn)行切片運(yùn)算,得到的結(jié)果也是元組(不能被修改):

>>> aTuple = ('robots', 77, 93, 'try')
>>> aTuple
('robots', 77, 93, 'try')
>>> aTuple[:3]
('robots', 77, 93)
>>> aTuple[1] = 5
Traceback (innermost last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment

12、字典
字典是 Python 中的映射數(shù)據(jù)類型,工作原理類似 Perl 中的關(guān)聯(lián)數(shù)組或者哈希表,由鍵-值(key-value)對(duì)構(gòu)成。幾乎所有類型的 Python 對(duì)象都可以用作鍵,不過一般還是以數(shù)字或者字符串最為常用。值可以是任意類型的 Python 對(duì)象,字典元素用大括號(hào)({ })包裹。

>>> aDict = {'host': 'earth'} # create dict
>>> aDict['port'] = 80 # add to dict
>>> aDict
{'host': 'earth', 'port': 80}
>>> aDict.keys()
['host', 'port']
>>> aDict['host']
'earth'
>>> for key in aDict:
... print key, aDict[key]
...
host earth
port 80

13、要給你的代碼添加錯(cuò)誤檢測(cè)及異常處理, 只要將它們封裝在 try-except 語句當(dāng)中。 try之后的代碼組, 就是你打算管理的代碼。 except 之后的代碼組, 則是你處理錯(cuò)誤的代碼。

try:
filename = raw_input('Enter file name: ')
fobj = open(filename, 'r')
for eachLine in fobj:
print eachLine, fobj.close()
except IOError, e:
print 'file open error:', e

14、文件和內(nèi)建函數(shù) open() 、file()
如何打開文件

handle = open(file_name, access_mode = 'r')

file_name 變量包含我們希望打開的文件的字符串名字, access_mode 中 'r' 表示讀取,'w' 表示寫入,
'a' 表示添加。其它可能用到的標(biāo)聲還有 '+' 表示讀寫, 'b'表示二進(jìn)制訪問. 如果未提供 access_mode ,
默認(rèn)值為 'r'。如果 open() 成功, 一個(gè)文件對(duì)象句柄會(huì)被返回。所有后續(xù)的文件操作都必須通過此文件
句柄進(jìn)行。當(dāng)一個(gè)文件對(duì)象返回之后, 我們就可以訪問它的一些方法, 比如 readlines() 和 close().
文件對(duì)象的方法屬性也必須通過句點(diǎn)屬性標(biāo)識(shí)法訪問(參閱下面的核心筆記)
核心筆記:什么是屬性?
屬性是與數(shù)據(jù)有關(guān)的項(xiàng)目, 屬性可以是簡(jiǎn)單的數(shù)據(jù)值, 也可以是可執(zhí)行對(duì)象, 比如函數(shù)
和方法。哪些對(duì)象擁有屬性呢? 很多。 類, 模塊, 文件還有復(fù)數(shù)等等對(duì)象都擁有屬性。
我如何訪問對(duì)象屬性? 使用句點(diǎn)屬性標(biāo)識(shí)法。 也就是說在對(duì)象名和屬性名之間加一個(gè)句
點(diǎn): object.attribute

下面有一些代碼, 提示用戶輸入文件名, 然后打開一個(gè)文件, 并顯示它的內(nèi)容到屏幕上:

filename = raw_input('Enter file name: ')
fobj = open(filename, 'r')
for eachLine in fobj:
print eachLine,
fobj.close()

15、我們的代碼中另一個(gè)有趣的語句是我們又一次在 print 語句中使用逗號(hào)來抑制自動(dòng)生成的換行符號(hào)。

16、python注釋
一、python單行注釋符號(hào)(#)
井號(hào)(#)常被用作單行注釋符號(hào),在代碼中使用#時(shí),它右邊的任何數(shù)據(jù)都會(huì)被忽略,當(dāng)做是注釋。print 1 #輸出1#號(hào)右邊的內(nèi)容在執(zhí)行的時(shí)候是不會(huì)被輸出的。
二、批量、多行注釋符號(hào)
在python中也會(huì)有注釋有很多行的時(shí)候,這種情況下就需要批量多行注釋符了。多行注釋是用三引號(hào)''' '''包含的,例如:

python 多行注釋符
可能有的人會(huì)說這不是和多行字符串混淆了嗎,但是我看到的許多程序員也是這么用的,使用時(shí)候注意區(qū)分下就好。
三、python中文注釋方法
在python編寫代碼的時(shí)候,避免不了會(huì)出現(xiàn)或是用到中文,這時(shí)候你需要在文件開頭加上中文注釋。比如創(chuàng)建一個(gè)python list,在代碼上面注釋上它的用途,如果開頭不聲明保存編碼的格式是什么,那么它會(huì)默認(rèn)使用ASKII碼保存文件,這時(shí)如果你的代碼中有中文就會(huì)出錯(cuò)了,即使你的中文是包含在注釋里面的。所以加上中文注釋很重要。#coding=utf-8或者:#coding=gbk玩蛇網(wǎng)Python之家提示:以上兩種都可以代表中文注釋,我看過的更多人使用urf-8這種的比較多。
一個(gè)好的程序員,為代碼加注釋是必須要作的。但要確保注釋要說的都是重要的事情,像看一眼就知道是干什么的,無用的代碼是不需要加注釋的。

17、模塊是一種組織形式, 它將彼此有關(guān)系的 Python 代碼組織到一個(gè)個(gè)獨(dú)立文件當(dāng)中。模塊可以包含可執(zhí)行代碼, 函數(shù)和類或者這些東西的組合。當(dāng)你創(chuàng)建了一個(gè) Python 源文件,模塊的名字就是不帶 .py 后綴的文件名。一個(gè)模塊創(chuàng)建之后, 你可以從另一個(gè)模塊中使用 import 語句導(dǎo)入這個(gè)模塊來使用。
如何導(dǎo)入模塊

import module_name

如何訪問一個(gè)模塊函數(shù)或訪問一個(gè)模塊變量一旦導(dǎo)入完成, 一個(gè)模塊的屬性(函數(shù)和變量)可以通過熟悉的 .句點(diǎn)屬性標(biāo)識(shí)法訪問。

module.function()
module.variable

現(xiàn)在我們?cè)俅翁峁?Hello World! 例子, 不過這次使用 sys 模塊中的輸出函數(shù)。

>>> import sys
Edit By Vheavens
Edit By Vheavens                              
>>> sys.stdout.write('Hello World!\n')
Hello World!
>>> sys.platform
'win32'
>>> sys.version
'2.4.2 (#67, Sep 28 2005, 10:51:12) [MSC v.1310 32 bit(Intel)]'```
這些代碼的輸出與我們使用 print 語句完全相同。** 唯一的區(qū)別在于這次調(diào)用了標(biāo)準(zhǔn)輸出的 write()方法,而且這次需要顯式的在字符串中提供換行字符, 不同于 print 語句, write()不會(huì)自動(dòng)在字符串后面添加換行符號(hào)。**

17、什么是“PEP”?
在本書中你會(huì)經(jīng)??吹?PEP 這個(gè)字眼。 一個(gè) PEP 就是一個(gè) Python 增強(qiáng)提案(Python Enhancement Proposal), 這也是在新版 Python 中增加新特性的方式。

18、實(shí)用的函數(shù)
本章中, 我們用到了很多實(shí)用的內(nèi)建函數(shù)。我們?cè)诒?2.1 中總結(jié)了這些函數(shù), 并且提供了一些其它的有用函數(shù)。(注意我們并沒有提供完整的使用語法,僅提供了我們認(rèn)為可能對(duì)你有用的部分)
表 2.1 對(duì)新 Python 程序員有用的內(nèi)建函數(shù)

函數(shù) 描述
dir([obj]) 顯示對(duì)象的屬性,如果沒有提供參數(shù), 則顯示全局變量的名字
help([obj]) 以一種整齊美觀的形式 顯示對(duì)象的文檔字符串, 如果沒有提供任何參數(shù), 則會(huì)進(jìn)入交互式幫助。
int(obj) 將一個(gè)對(duì)象轉(zhuǎn)換為整數(shù)
len(obj) 返回對(duì)象的長(zhǎng)度
open(fn, mode) 以 mode('r' = 讀, 'w'= 寫)方式打開一個(gè)文件名為 fn 的文件
range([[ start ,] stop [, step ]) 返回一個(gè)整數(shù)列表。起始值為 start, 結(jié)束值為 stop - 1; start默認(rèn)值為 0, step默認(rèn)值為1。
raw_input(str) 等待用戶輸入一個(gè)字符串, 可以提供一個(gè)可選的參數(shù) str 用作提示信息。
str(obj) 將一個(gè)對(duì)象轉(zhuǎn)換為字符串
type(obj) 返回對(duì)象的類型(返回值本身是一個(gè) type 對(duì)象!)```

19、一行過長(zhǎng)的語句可以使用反斜杠( \ ) 分解成幾行,如下例:

# check conditions
if (weather_is_hot == 1) and \
(shark_warnings == 0):
send_goto_beach_mesg_to_pager()```
在含有小括號(hào)、中括號(hào)、花括號(hào)時(shí)可以多行書寫。另外就是三引號(hào)包括下的字符串也可以跨行書寫。

display a string with triple quotes

print'''hi there, this is a long message for you
that goes over multiple lines... you will find
out soon that triple quotes in Python allows
this kind of fun! it is like a day on the beach!'''

set some variables

go_surf, get_a_tan_while, boat_size, toll_money = (1,'windsurfing', 40.0, -2.00)```
如果要在使用反斜線換行和使用括號(hào)元素?fù)Q行作一個(gè)選擇,我們推薦使用括號(hào),這樣可讀性會(huì)更好。

20、縮進(jìn)相同的一組語句構(gòu)成一個(gè)代碼塊,我們稱之代碼組。像 if、while、def 和 class 這樣的復(fù)合語句,首行以關(guān)鍵字開始,以冒號(hào)( : )結(jié)束,Python 使用縮進(jìn)來分隔代碼組。代碼的層次關(guān)系是通過同樣深度的空格或制表符縮進(jìn)體現(xiàn)的。同一代碼組的代碼行必須嚴(yán)格左對(duì)齊(左邊有同樣多的空格或同樣多的制表符),如果不嚴(yán)格遵守這個(gè)規(guī)則,同一組的代碼就可能被當(dāng)成另一個(gè)組,甚至?xí)?dǎo)致語法錯(cuò)誤。

21、核心風(fēng)格:縮進(jìn)四個(gè)空格寬度,避免使用制表符,沒有縮進(jìn)的代碼塊是最高層次的,別稱做腳本的“main”部分。

22、分號(hào)( ; )允許你將多個(gè)語句寫在同一行上,語句之間用分號(hào)隔開,而這些語句也不能在這行開始一個(gè)新的代碼塊。這里有一個(gè)例子:

import sys; x = 'foo'; sys.stdout.write(x + '\n')

必須指出一點(diǎn), 同一行上書寫多個(gè)語句會(huì)大大降低代碼的可讀性,Python 雖然允許但不提倡你這么做。

23、關(guān)鍵字列表和 iskeyword()函數(shù)都放入了 keyword模塊以便查閱

>>> import keyword
>>> keyword.iskeyword('class')
True
>>> keyword.kwlist
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec',
 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise',
 'return', 'try', 'while', 'with', 'yield']
>>> len(keyword.kwlist)
31```

24、專用下劃線標(biāo)識(shí)符
Python 用下劃線作為變量前綴和后綴指定特殊變量。稍后我們會(huì)發(fā)現(xiàn),對(duì)于程序來說,其中的有些變量是非常有用的,而其他的則是未知或無用的。這里對(duì) Python 中下劃線的特殊用法做了總結(jié):
- \_xxx 不用'from module import *'導(dǎo)入
- \_\_xxx\_\_系統(tǒng)定義名字
- \_\_xxx 類中的私有變量名
核心風(fēng)格:避免用下劃線作為變量名的開始
因?yàn)橄聞澗€對(duì)解釋器有特殊的意義,而且是內(nèi)建標(biāo)識(shí)符所使用的符號(hào),我們建議程序員避免用下劃線作為變量名的開始。一般來講,變量名_xxx 被看作是“私有的”,在模塊或類外不可以使用。當(dāng)變量是私有的時(shí)候,用_xxx 來表示變量是很好的習(xí)慣。因?yàn)樽兞棵鸰_xxx__對(duì)Python 來說有特殊含義,對(duì)于普通的變量應(yīng)當(dāng)避免這種命名風(fēng)格。

25、**只有一個(gè)模塊,也就是包含主程序的模塊會(huì)被直接執(zhí)行,或由用戶通過命令行執(zhí)行,或作為批處理執(zhí)行, 或由 Unix cron 任務(wù)定時(shí)執(zhí)行,或通過 Web 服務(wù)器調(diào)用,或通過 GUI 執(zhí)行。 通常只有主程序模塊中有大量的頂級(jí)可執(zhí)行代碼,所有其它被導(dǎo)入的模塊只應(yīng)該有很少的頂級(jí)執(zhí)行代碼,所有的功能代碼都應(yīng)該封裝在函數(shù)或類當(dāng)中。**

26、核心筆記:__name__ 指示模塊應(yīng)如何被加載
**由于主程序代碼無論模塊是被導(dǎo)入還是被直接執(zhí)行都會(huì)運(yùn)行, 我們必須知道模塊如何決定運(yùn)行方向。一個(gè)應(yīng)用程序可能需要導(dǎo)入另一個(gè)應(yīng)用程序的一個(gè)模塊,以便重用一些有用的代碼(否則就只能用拷貝粘貼那種非面向?qū)ο蟮挠薮朗侄危?。這種情況下,你只想訪問那些位于其它應(yīng)用程序中的代碼,而不是想運(yùn)行那個(gè)應(yīng)用程序。因此一個(gè)問題出現(xiàn)了,“Python 是否有一種方法能在運(yùn)行時(shí)檢測(cè)該模塊是被導(dǎo)入還是被直接執(zhí)行呢?” 答案就是......(鼓聲雷動(dòng)).....沒錯(cuò)! __name__ 系統(tǒng)變量就是正確答案。如果模塊是被導(dǎo)入, __name__ 的值為模塊名字如果模塊是被直接執(zhí)行, __name__ 的值為 '__main__'**

27、del 語句能夠直接釋放資源

28、當(dāng)變量被賦值給另外一個(gè)對(duì)象時(shí),原對(duì)象的引用計(jì)數(shù)也會(huì)自動(dòng)減 1:

foo = 'xyz'
bar = foo
foo = 123```
當(dāng)字符串對(duì)象"xyz"被創(chuàng)建并賦值給 foo 時(shí), 它的引用計(jì)數(shù)是 1. 當(dāng)增加了一個(gè)別名 bar時(shí), 引用計(jì)數(shù)變成了 2. 不過當(dāng) foo 被重新賦值給整數(shù)對(duì)象 123 時(shí), xyz 對(duì)象的引用計(jì)數(shù)自動(dòng)減 1,又重新變成了 1.

29、總結(jié)一下,一個(gè)對(duì)象的引用計(jì)數(shù)在以下情況會(huì)減少:

  • 一個(gè)本地引用離開了其作用范圍。比如 foobar()(參見上一下例子)函數(shù)結(jié)束時(shí)。
  • 對(duì)象的別名被顯式的銷毀。
    del y # or del x
  • 對(duì)象的一個(gè)別名被賦值給其它的對(duì)象
    x = 123
  • 對(duì)象被從一個(gè)窗口對(duì)象中移除
    myList.remove(x)
  • 窗口對(duì)象本身被銷毀
    del myList # or goes out-of-scope

30、del 語句
Del 語句會(huì)刪除對(duì)象的一個(gè)引用,它的語法是:
del obj1[, obj2[,... objN]]
例如,在上例中執(zhí)行 del y 會(huì)產(chǎn)生兩個(gè)結(jié)果:

  • 從現(xiàn)在的名字空間中刪除 y
  • x 的引用計(jì)數(shù)減一
    引申一步, 執(zhí)行 del x 會(huì)刪除該對(duì)象的最后一個(gè)引用, 也就是該對(duì)象的引用計(jì)數(shù)會(huì)減為0, 這會(huì)導(dǎo)致該對(duì)象從此“無法訪問”或“無法抵達(dá)”。 從此刻起, 該對(duì)象就成為垃圾回收機(jī)制的回收對(duì)象。 注意任何追蹤或調(diào)試程序會(huì)給一個(gè)對(duì)象增加一個(gè)額外的引用, 這會(huì)推遲該對(duì)象被回收的時(shí)間。

31、異常處理
捕捉異常可以使用try/except語句。
try/except語句用來檢測(cè)try語句塊中的錯(cuò)誤,從而讓except語句捕獲異常信息并處理。
如果你不想在異常發(fā)生時(shí)結(jié)束你的程序,只需在try里捕獲它。
語法:
以下為簡(jiǎn)單的try....except...else的語法:

try:
<語句>        #運(yùn)行別的代碼
except <名字>:
<語句>        #如果在try部份引發(fā)了'name'異常
except <名字>,<數(shù)據(jù)>:
<語句>        #如果引發(fā)了'name'異常,獲得附加的數(shù)據(jù)
else:
<語句>        #如果沒有異常發(fā)生```

下面是簡(jiǎn)單的例子,它打開一個(gè)文件,在該文件中的內(nèi)容寫入內(nèi)容,且并未發(fā)生異常:

!/usr/bin/python

-- coding: UTF-8 --

try:
fh = open("testfile", "w")
fh.write("這是一個(gè)測(cè)試文件,用于測(cè)試異常!!")
except IOError:
print "Error: 沒有找到文件或讀取文件失敗"
else:
print "內(nèi)容寫入文件成功"
fh.close()
以上程序輸出結(jié)果:
$ python test.py
內(nèi)容寫入文件成功
$ cat testfile # 查看寫入的內(nèi)容
這是一個(gè)測(cè)試文件,用于測(cè)試異常!!```

使用except而不帶任何異常類型
你可以不帶任何異常類型使用except,如下實(shí)例:

try:
    正常的操作
   ......................
except:
    發(fā)生異常,執(zhí)行這塊代碼
   ......................
else:
    如果沒有異常執(zhí)行這塊代碼```
以上方式try-except語句捕獲所有發(fā)生的異常。但這不是一個(gè)很好的方式,我們不能通過該程序識(shí)別出具體的異常信息。因?yàn)樗东@所有的異常。
**使用except而帶多種異常類型**
你也可以使用相同的except語句來處理多個(gè)異常信息,如下所示:

try:
正常的操作
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
發(fā)生以上多個(gè)異常中的一個(gè),執(zhí)行這塊代碼
......................
else:
如果沒有異常執(zhí)行這塊代碼
try-finally 語句
try-finally 語句無論是否發(fā)生異常都將執(zhí)行最后的代碼。
try:
<語句>
finally:
<語句> #退出try時(shí)總會(huì)執(zhí)行
raise```

異常的參數(shù)
一個(gè)異??梢詭蠀?shù),可作為輸出的異常信息參數(shù)。你可以通過except語句來捕獲異常的參數(shù),如下所示:

try:
    正常的操作
   ......................
except ExceptionType, Argument:
    你可以在這輸出 Argument 的值...```
變量接收的異常值通常包含在異常的語句中。在元組的表單中變量可以接收一個(gè)或者多個(gè)值。元組通常包含錯(cuò)誤字符串,錯(cuò)誤數(shù)字,錯(cuò)誤位置。
**實(shí)例**
以下為單個(gè)異常的實(shí)例:

!/usr/bin/python

-- coding: UTF-8 --

定義函數(shù)

def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "參數(shù)沒有包含數(shù)字\n", Argument

調(diào)用函數(shù)

temp_convert("xyz");```
以上程序執(zhí)行結(jié)果如下:

$ python test.py 
參數(shù)沒有包含數(shù)字
invalid literal for int() with base 10: 'xyz'```
**觸發(fā)異常**
我們可以使用raise語句自己觸發(fā)異常,raise語法格式如下:

raise [Exception [, args [, traceback]]]```
語句中Exception是異常的類型(例如,NameError)參數(shù)是一個(gè)異常參數(shù)值。該參數(shù)是可選的,如果不提供,異常的參數(shù)是"None"。最后一個(gè)參數(shù)是可選的(在實(shí)踐中很少使用),如果存在,是跟蹤異常對(duì)象。
實(shí)例
一個(gè)異??梢允且粋€(gè)字符串,類或?qū)ο蟆?Python的內(nèi)核提供的異常,大多數(shù)都是實(shí)例化的類,這是一個(gè)類的實(shí)例的參數(shù)。
定義一個(gè)異常非常簡(jiǎn)單,如下所示:

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 觸發(fā)異常后,后面的代碼就不會(huì)再執(zhí)行```
**注意**:為了能夠捕獲異常,"except"語句必須有用相同的異常來拋出類對(duì)象或者字符串。例如我們捕獲以上異常,"except"語句如下所示:

try:
正常邏輯
except "Invalid level!":
觸發(fā)自定義異常
else:
其余代碼
實(shí)例

!/usr/bin/python

-- coding: UTF-8 --

定義函數(shù)

def mye( level ):
if level < 1:
raise Exception("Invalid level!", level)
# 觸發(fā)異常后,后面的代碼就不會(huì)再執(zhí)行

try:
mye(0) // 觸發(fā)異常
except "Invalid level!":
print 1
else:
print 2```
執(zhí)行以上代碼,輸出結(jié)果為:

$ python test.py 
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    mye(0)
  File "test.py", line 7, in mye
    raise Exception("Invalid level!", level)
Exception: ('Invalid level!', 0)```

32、通過調(diào)用 type()函數(shù)你能夠得到特定對(duì)象的類型信息:

type(42)
<type 'int'>```
我們仔細(xì)研究一下這個(gè)例子,請(qǐng)注意看 type 函數(shù)有趣的返回值。我們得到一個(gè)簡(jiǎn)潔的輸出結(jié)果<type 'int'>。不過你應(yīng)當(dāng)意識(shí)到它并不是一個(gè)簡(jiǎn)簡(jiǎn)單單的告訴你 42 是個(gè)整數(shù)這樣的字符串。您看到的<type 'int'>實(shí)際上是一個(gè)類型對(duì)象,碰巧它輸出了一個(gè)字符串來告訴你它是個(gè) int 型對(duì)象。
現(xiàn)在你該問自己了,那么類型對(duì)象的類型是什么?來, 我們?cè)囼?yàn)一下:

>>> type(type(42))
<type 'type'>```
沒錯(cuò),所有類型對(duì)象的類型都是 type,它也是所有 Python 類型的根和所有 Python 標(biāo)準(zhǔn)類的默認(rèn)元類(metaclass)。

33、核心筆記:布爾值
Python 有一個(gè)特殊的類型,被稱作 Null 對(duì)象或者 NoneType,它只有一個(gè)值,那就是 None。它不支持任何運(yùn)算也沒有任何內(nèi)建方法。如果非常熟悉 C 語言,和 None 類型最接近的 C 類型就是 void,None 類型的值和 C 的 NULL 值非常相似(其他類似的對(duì)象和值包括 Perl 的 undef 和Java 的 void 類型與 null 值)。

None 沒有什么有用的屬性,它的布爾值總是 False。

所有標(biāo)準(zhǔn)對(duì)象均可用于布爾測(cè)試,同類型的對(duì)象之間可以比較大小。每個(gè)對(duì)象天生具有布爾 True 或 False 值??諏?duì)象、值為零的任何數(shù)字或者 Null 對(duì)象 None 的布爾值都是 False。
下列對(duì)象的布爾值是 False。
-  None
-  False (布爾類型)
-  所有的值為零的數(shù):                   
-  0 (整型)
-  (浮點(diǎn)型)
-  0L (長(zhǎng)整型)
-  0.0+0.0j (復(fù)數(shù))
-  "" (空字符串)
-  [] (空列表)
-  () (空元組)
- {} (空字典)

值不是上面列出來的任何值的對(duì)象的布爾值都是 True,例如 non-empty、 non-zero 等等。
用戶創(chuàng)建的類實(shí)例如果定義了 nonzero(\_\_nonzero_\_())或 length(\_\_len__())且值為 0,那
么它們的布爾值就是 False。

34、python查詢所有內(nèi)建函數(shù)
dir(\_\_builtins__)

35、repr(obj) 或 `obj` 返回一個(gè)對(duì)象的字符串表示

36、str()和 repr() (及 `` 運(yùn)算符)
內(nèi)建函數(shù) str() 和 repr() 或反引號(hào)運(yùn)算符(``) 可以方便的以字符串的方式獲取對(duì)象的內(nèi)容、類型、數(shù)值屬性等信息。str()函數(shù)得到的字符串可讀性好, 而 repr()函數(shù)得到的字符串通常可以用來重新獲得該對(duì)象, 通常情況下 obj == eval(repr(obj)) 這個(gè)等式是成立的。這兩個(gè)函數(shù)接受一個(gè)對(duì)象做為其參數(shù), 返回適當(dāng)?shù)淖址?。在下面的例子里?我們會(huì)隨機(jī)取一些 Python 對(duì)象來查看他們的字符串表示。

str(4.53-2j)
'(4.53-2j)'

str(1)
'1'

str(2e10)
'20000000000.0'

str([0, 5, 9, 9])
'[0, 5, 9, 9]'

repr([0, 5, 9, 9])
'[0, 5, 9, 9]'

[0, 5, 9, 9]
'[0, 5, 9, 9]'```
盡管 str(),repr()和``運(yùn)算在特性和功能方面都非常相似, 事實(shí)上 repr() 和 `` 做的是完全一樣的事情,它們返回的是一個(gè)對(duì)象的“官方”字符串表示, 也就是說絕大多數(shù)情況下可以通過求值運(yùn)算(使用 eval()內(nèi)建函數(shù))重新得到該對(duì)象,但 str()則有所不同。str() 致力于生成一個(gè)對(duì)象的可讀性好的字符串表示,它的返回結(jié)果通常無法用于 eval()求值, 但很適合用于 print 語句輸出。需要再次提醒一下的是, 并不是所有 repr()返回的字符串都能夠用eval()內(nèi)建函數(shù)得到原來的對(duì)象:

>>> eval(`type(type))`)
File "<stdin>", line 1
eval(`type(type))`)
^
SyntaxError: invalid syntax    ```       
也就是說 repr() 輸出對(duì) Python 比較友好, 而 str()的輸出對(duì)人比較友好。雖然如此,很多情況下這三者的輸出仍然都是完全一樣的。
**核心筆記:為什么我們有了 repr()還需要``?
在 Python 學(xué)習(xí)過程中,你偶爾會(huì)遇到某個(gè)運(yùn)算符和某個(gè)函數(shù)是做同樣一件事情。之所以如
此是因?yàn)槟承﹫?chǎng)合函數(shù)會(huì)比運(yùn)算符更適合使用。舉個(gè)例子, 當(dāng)處理類似函數(shù)這樣的可執(zhí)行對(duì)象
或根據(jù)不同的數(shù)據(jù)項(xiàng)調(diào)用不同的函數(shù)處理時(shí),函數(shù)就比運(yùn)算符用起來方便。另一個(gè)例子就是雙
星號(hào)(\**)乘方運(yùn)算和 pow()內(nèi)建函數(shù),x \*\* y 和 pow(x,y) 執(zhí)行的都是 x 的 y 次方。**
譯者注:事實(shí)上 Python 社區(qū)目前已經(jīng)不鼓勵(lì)繼續(xù)使用``運(yùn)算符。

37、Python 不支持方法或函數(shù)重載, 因此你必須自己保證調(diào)用的就是你想要的函數(shù)或?qū)ο蟆?/code>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容