本章對Python 的主要特性作一個快速介紹。python
在全部的交互示例中,你會看到Python 的主提示符( >>> )和次提示符( ... )。主提示符是解釋器告訴你它在等待你輸入下一個語句,次提示符告訴你解釋器正在等待你輸入當前語句的其它部分。程序員
語句和表達式(函數、算術表達式等):
shell
語句使用關鍵字來組成命令,相似告訴解釋器一個命令;express
表達式沒有關鍵字。它們能夠是使用數學運算符構成的算術表達式,也能夠是使用括號調用的函數;編程
在交互式解釋器中,能夠用 print 語句顯示變量的字符串表示,或者僅使用變量名查看該變量的原始值。
數組
下劃線(_)在解釋器中有特別的含義,表示最後一個表達式的值。app
Python 的print 語句,與字符串格式運算符( % )結合使用,可實現字符串替換功能。函數
%s 表示由一個字符串來替換;%d 表示由一個整數來替換;%f表示由一個浮點數來替換;佈局
Print 語句也支持將輸出重定向到文件。符號 >> 用來重定向輸出,下面這個例子將輸出重定向到標準錯誤輸出:ui
import sys print >> sys.stderr, 'Fatal error: invalid input!' import sys print >> sys.stderr, 'Fatal error: invalid input!'
下面是一個將輸出重定向到日誌文件的例子:
logfile = open('/tmp/mylog.txt', 'a') print >> logfile, 'Fatal error: invalid input!' logfile.close()
獲得數據輸入的方法是使用raw_input()內建函數。 它讀取標準輸入,並將讀取到的數據賦值給指定的變量。
注:內建函數int()將數值字符串轉換成整數值,這樣才能夠對它進行數學運算。
核心筆記:從交互式解釋器中得到幫助
若是須要獲得一個生疏函數的幫助,只須要對它調用內建函數help():
eg:help(raw_input);
核心風格: 一直在函數外作用戶交互操做
從用戶那裏獲得須要的數據, 而後調用函數處理, 從函數獲得返回值,而後顯示結果給用戶。
更重要的, 將函數分爲兩大類, 一類只作事, 不須要返回值(好比與用戶交互或設置變量的值), 另外一類則執行一些運算,最後返回結果。若是輸出就是函數的目的,那麼在函數體內使用 print 語句也是能夠接受的選擇.
Python 也使用 # 符號標示註釋;
文檔字符串:你能夠在模塊、類或者函數的起始添加一個字符串,起到在線文檔的功能;與普通註釋不一樣,文檔字符串能夠在運行時訪問,也能夠用來自動生成文檔
標準算術運算符:+ - * / // % **
Python 有兩種除法運算符,單斜槓用做傳統除法,雙斜槓用做浮點除法(對結果進行四捨五入).
傳統除法是指若是兩個操做數都是整數的話,它將執行是地板除(取比商小的最大整數);
而浮點除法是真正的除法,無論操做數是什麼類型,浮點除法老是執行真正的除法【第五章詳細介紹】;
標準比較運算符:< <= > >= == !=
邏輯運算符:and or not
eg:
3 < 4 < 5
該例子在其餘語言中一般是不合法的,不過Python 支持這樣的表達式。它其實是下面表達式的縮寫:
>>> 3 < 4 and 4 < 5
Python 中變量名規則與其它大多數高級語言同樣;
Python變量名是大小寫敏感的;
Python 是動態類型語言, 變量的類型和值在賦值那一刻被初始化;
Python 也支持增量賦值,也就是運算符和等號合併在一塊兒;
Python 不支持C 語言中的自增1 和自減1 運算符,會將 --n 解釋爲-(-n) 從而獲得 n;
Python 支持五種基本數字類型,其中有三種是整數類型。
int (有符號整數)
long (長整數)
bool (布爾值)
float (浮點值)
complex (複數)
請不要將Python 的長整數與C 語言的長整數混淆。Python 的長整數所能表達的範圍遠遠超過C 語言的長整數, Python 長整數僅受限於用戶計算機的虛擬內存總數。若是你熟悉 Java, Python 的長整數相似於 Java 中的BigInteger 類型;整型與長整型正在逐步統一爲一種整數類型,從Python2.3 開始,不再會報整型溢出錯誤, 結果會自動的被轉換爲長整數,在將來版本的Python 中, 兩種整數類型將會無縫結合, 長整數後綴 「L」也會變得無關緊要;
布爾值是特殊的整數;
複數(包括-1 的平方根, 即所謂的虛數)在其它語言中一般不被直接支持(通常經過類來實現);
decimal, 用於十進制浮點數。舉例來講, 因爲在二進制表示中有一個無限循環片斷,數字1.1 沒法用二進制浮點數精確表示。所以, 數字1.1 實際上會被表示成:
>>> 1.1 1.1000000000000001 >>> print decimal.Decimal('1.1') 1.1
第五章詳細將介紹全部的數字類型。
Python 支持使用成對的單引號或雙引號,三引號(三個連續的單引號或者雙引號)能夠用來包含特殊字符。
使用索引運算符( [ ] )和切片運算符( [ : ] )能夠獲得子字符串;
字符串有其特有的索引規則:第一個字符的索引是 0,最後一個字符的索引是 -1;
加號( + )用於字符串鏈接運算,星號( * )則用於字符串重複;
你能夠在第六章學到更多有關字符串的知識。
能保存任意數量任意類型的Python 對象。和數組同樣,經過從0 開始的數字索引訪問元素,可是列表和元組能夠存儲不一樣類型的對象。
列表和元組有幾處重要的區別。列表元素用中括號( [ ])包裹,元素的個數及元素的值能夠改變。
元組元素用小括號(( ))包裹,不能夠更改(儘管他們的內容能夠)。元組能夠當作是隻讀的列表。
經過切片運算( [ ] 和 [ : ] )能夠獲得子集,這一點與字符串的使用方法同樣。
你能夠在第六章學到更多有關列表、元組以及字符串的知識。
字典是Python 中的映射數據類型,由鍵-值(key-value)對構成。幾乎全部類型的Python 對象均可以用做鍵,不過通常仍是以數字或者字符串最爲經常使用。
值能夠是任意類型的Python 對象,字典元素用大括號({ })包裹。
在第七章中會詳細講解字典。
代碼塊經過縮進對齊表達代碼邏輯而不是使用大括號。
標準if 條件語句的語法以下:
if expression: if_suite
Python 還支持 else、elif (意指 「else-if 」)語句。
在第8 章你能夠學到更多有關 if, elif, else 條件語句的知識。
while expression: while_suite
第8 章的循環一節進行詳細講解。
Python 中的for 循環與傳統的for 循環(計數器循環)不太同樣, 它更象shell 腳本里的foreach 迭代。Python 中的for 接受可迭代對象(例如序列或迭代器)做爲其參數,每次迭代其中一個元素.
print 語句默認會給每一行添加一個換行符。只要在print 語句的最後添加一個逗號(,), 就能夠改變它這種行爲,帶逗號的print 語句輸出的元素之間會自動添加一個空格.
另外,經過指定輸出格式, 程序員能夠最大程度的控制輸出佈局。它也能夠將全部數據放到一處輸出--只須要將數據放在格式化運算符右側的元組或字典中。
由於咱們不能改變 for 循環的行爲(迭代一個序列), 咱們能夠生成一個數字序列。range()內建函數接受一個數值範圍, 生成一個列表.
range()函數常常和len()函數一塊兒用於字符串索引.
>>> foo = 'abc' >>> for i in range(len(foo)): ... print foo[i], '(%d)' % i
不過, 這些循環有一個約束, 你要麼循環索引, 要麼循環元素。這致使了enumerate()函數的推出。 它同時作到了這兩點:
>>> for i, ch in enumerate(foo): ... print ch, '(%d)' % i
你能夠在一行中使用一個for 循環將全部值放到一個列表當中:
>>> squared = [x ** 2 for x in range(4)] >>> for i in squared: ... print i
列表解析甚至能作更復雜的事情, 好比挑選出符合要求的值放入列表:
>>> sqdEvens = [x ** 2 for x in range(8) if not x % 2] >>> >>> for i in sqdEvens: ... print i
如何打開文件:handle = open(file_name, access_mode = 'r')
file_name 變量包含咱們但願打開的文件的字符串名字;
access_mode 中 'r' 表示讀取,'w' 表示寫入, 'a' 表示添加。其它可能用到的標聲還有 '+' 表示讀寫, 'b'表示二進制訪問. 默認值爲 'r'。若是 open() 成功, 一個文件對象句柄會被返回。全部後續的文件操做都必須經過此文件句柄進行。當一個文件對象返回以後, 咱們就能夠訪問它的一些方法, 好比 readlines() 和close().
核心筆記:什麼是屬性?
屬性能夠是簡單的數據值, 也能夠是可執行對象, 好比函數和方法。哪些對象擁有屬性呢? 不少。 類, 模塊, 文件還有複數等等對象都擁有屬性。
filename = raw_input('Enter file name: ') fobj = open(filename, 'r') for eachLine in fobj: print eachLine, fobj.close()
一次讀入文件的全部行,而後關閉文件, 再迭代每一行輸出。這樣寫代碼的好處是可以快速完整的訪問文件。內容輸出和文件訪問沒必要交替進行。
上面的代碼適用於文件大小適中的文件。對於很大的文件來講, 會佔用太多的內存, 這時你最好一次讀一行。(下一節有一個好例子)
file()內建函數是最近才添加到Python 當中的。它的功能等同於 open(), 不過file()這個名字能夠更確切的代表它是一個工廠函數。(生成文件對象)相似int()生成整數對象,dict()生成字典對象。
在第9 章, 咱們詳細介紹文件對象, 及它們的內建方法屬性, 以及如何訪問本地文件系統。
編譯時會檢查語法錯誤, 不過 Python 也容許在程序運行時檢測錯誤。當檢測到一個錯誤,Python 解釋器就引起一個異常, 並顯示異常的詳細信息。程序員能夠根據這些信息迅速定位問題並進行調試, 並找出處理錯誤的辦法。
要給你的代碼添加錯誤檢測及異常處理, 只要將它們封裝在 try-except 語句當中。 try以後的代碼組, 就是你打算管理的代碼。 except 以後的代碼組, 則是你處理錯誤的代碼。
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
程序員也能夠經過使用 raise 語句故意引起一個異常。
在第10 章你能夠學到更多有關Python 異常的知識。
若是函數中沒有 return 語句, 就會自動返回 None 對象。
Python 是經過引用調用的。 這意味着函數內對參數的改變會影響到原始對象。不過事實上只有可變對象會受此影響, 對不可變對象來講, 它的行爲相似按值調用。
如何定義函數
def function_name([arguments]): "optional documentation string" function_suite
定義一個函數的語法由 def 關鍵字及緊隨其後的函數名再加上該函數須要的幾個參數組成。這個語句由一個冒號(:)結束, 以後是表明函數體的代碼組, eg:
def addMe2Me(x): 'apply + operation to argument' return (x + x)
加號運算符幾乎與全部數據類型工做, 不論是數值相加仍是序列合併。
如何調用函數
>>> addMe2Me(4.25) 8.5 >>> addMe2Me('Python') 'PythonPython' >>> addMe2Me([-1, 'abc']) [-1, 'abc', -1, 'abc']
注意一下, + 運算符在非數值類型中如何工做。
默認參數
>>> def foo(debug=True): ... 'determine if in debug mode with default argument' ... if debug: ... print 'in debug mode' ... print 'done' >>> foo() in debug mode done >>> foo(False) done
請閱讀第11 章以瞭解更詳細的函數的信息。
類是面向對象編程的核心, 它扮演相關數據及邏輯的容器角色。它們提供了建立「真實」對象(也就是實例)的藍圖。
如何定義類
class ClassName(base_class[es]): "optional documentation string" static_member_declarations method_declarations
能夠提供一個可選的父類或者說基類; 若是沒有合適的基類,那就使用 object 做爲基類。class 行以後是可選的文檔字符串, 靜態成員定義, 及方法定義。
class FooClass(object): """my very first class: FooClass""" version = 0.1 # class (data) attribute // 定義了一個靜態變量 version def __init__(self, nm='John Doe'): """constructor""" self.name = nm # class instance (data) attribute print 'Created a class instance for', nm def showname(self): """display instance attribute and class name""" print 'Your name is', self.name print 'My name is', self.__class__.__name__ def showver(self): """display class(static) attribute""" print self.version # references FooClass.version def addMe2Me(self, x): # does not use 'self' """apply + operation to argument""" return x + x
__init__() 方法有一個特殊名字, 全部名字開始和結束都有兩個下劃線的方法都是特殊方法。
當一個類實例被建立時, __init__() 方法會自動執行, 在類實例建立完畢後執行, 相似構建函數。它的目的是執行一些該對象的必要的初始化工做。經過建立本身的 __init__() 方法, 你能夠覆蓋默認的 __init__()方法(默認的方法什麼也不作),從而可以修飾剛剛建立的對象。在這個例子裏, 咱們初始化了一個名爲 name的類實例屬性(或者說成員)。這個變量僅在類實例中存在, 它並非實際類自己的一部分。__init__()須要一個默認的參數, 前一節中曾經介紹過。毫無疑問,你也注意到每一個方法都有的一個參數, self.什麼是 self ? 它是類實例自身的引用。其餘語言一般使用一個名爲 this 的標識符。
如何建立類實例
>>> foo1 = FooClass() Created a class instance for John Doe
類實例使用一樣的函數運算符調用一個函數或方法:
>>> foo1.showname() Your name is John Doe My name is __main__.FooClass >>> foo1.showver() 0.1 >>> print foo1.addMe2Me(5) 10 >>> print foo1.addMe2Me('xyz') xyzxyz
比較有趣的數據是類名字。在showname()方法中,咱們顯示 self.__class__.__name__ 變量的值。對一個實例來講, 這個變量表示實例化它的類的名字。(self.__class__引用實際的類)。在咱們的例子裏, 建立類實例時咱們並未傳遞名字參數, 所以默認參數 'John Doe' 就被自動使用。不使用默認值的示例以下:
>>> foo2 = FooClass('Jane Smith') Created a class instance for Jane Smith >>> foo2.showname() Your name is Jane Smith My name is FooClass
第十三章將詳細介紹Python 類和類實例。
模塊是一種組織形式, 它將彼此有關係的Python 代碼組織到一個個獨立文件當中。模塊能夠包含可執行代碼, 函數和類或者這些東西的組合。
當你建立了一個 Python 源文件,模塊的名字就是不帶 .py 後綴的文件名。一個模塊建立以後, 你能夠從另外一個模塊中使用 import 語句導入這個模塊來使用。
如何導入模塊
import module_name
如何訪問一個模塊函數或訪問一個模塊變量?一旦導入完成, 一個模塊的屬性(函數和變量)能夠經過熟悉的 .句點屬性標識法訪問。
module.function() module.variable
如今咱們再次提供 Hello World! 例子, 不過此次使用 sys 模塊中的輸出函數。
>>> import sys >>> 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的惟一的區別在於此次調用了標準輸出的 write()方法,不一樣於print 語句, write()不會自動在字符串後面添加換行符號,須要顯示指出。
核心筆記:什麼是「PEP」?
一個 PEP 就是一個 Python 加強提案, 這也是在新版Python 中增長新特性的方式。 它們不但提供了新特性的完整描述, 還有添加這些新特性的理由, 若是須要的話, 還會提供新的語法、 技術實現細節、向後兼容信息等等。在一個新特性被整合進Python 以前, 必須經過Python 開發社區, PEP 做者及實現者, 還有Python 的創始人, Guidovan Rossum(Python 終身的仁慈的獨裁者)的一致贊成。PEP1 闡述了PEP 的目標及書寫指南。在PEP0 中能夠找到全部的PEP。 PEP 索引的網址是: http://python.org/dev/peps.
關於模塊和導入, 你能夠在第12 章中獲得更多有用的信息。
本章中, 咱們用到了不少實用的內建函數。咱們在表2.1 中總結了這些函數, 而且提供了一些其它的有用函數。(注意咱們並無提供完整的使用語法,僅提供了咱們認爲可能對你有用的部分)
函數 描述
dir([obj]) 顯示對象的屬性,若是沒有提供參數, 則顯示全局變量的名字
help([obj]) 以一種整齊美觀的形式 顯示對象的文檔字符串, 若是沒有提供任何參數, 則會進入交互式幫助。
int(obj) 將一個對象轉換爲整數
len(obj) 返回對象的長度
open(fn, mode) 以 mode('r' = 讀, 'w'= 寫)方式打開一個文件名爲 fn 的文件
range([[start,]stop[,step]) 返回一個整數列表。起始值爲 start, 結束值爲 stop - 1; start默認值爲 0, step默認值爲1。
raw_input(str) 等待用戶輸入一個字符串, 能夠提供一個可選的參數 str 用做提示信息。
str(obj) 將一個對象轉換爲字符串
type(obj) 返回對象的類型(返回值自己是一個type 對象!)