python濃縮(2)Python起步

本章對Python 的主要特性作一個快速介紹。python

在全部的交互示例中,你會看到Python 的主提示符( >>> )和次提示符( ... )。主提示符是解釋器告訴你它在等待你輸入下一個語句,次提示符告訴你解釋器正在等待你輸入當前語句的其它部分。程序員

語句和表達式(函數、算術表達式等):
shell

  • 語句使用關鍵字來組成命令,相似告訴解釋器一個命令;express

  • 表達式沒有關鍵字。它們能夠是使用數學運算符構成的算術表達式,也能夠是使用括號調用的函數;編程

2.1 程序輸出,print 語句及「Hello World!」

在交互式解釋器中,能夠用 print 語句顯示變量的字符串表示,或者僅使用變量名查看該變量的原始值。
數組

2.2 程序輸入和raw_input()內建函數

下劃線(_)在解釋器中有特別的含義,表示最後一個表達式的值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()

2.2 程序輸入和內建函數raw_input()

獲得數據輸入的方法是使用raw_input()內建函數。 它讀取標準輸入,並將讀取到的數據賦值給指定的變量。

注:內建函數int()將數值字符串轉換成整數值,這樣才能夠對它進行數學運算。

核心筆記:從交互式解釋器中得到幫助

若是須要獲得一個生疏函數的幫助,只須要對它調用內建函數help()

eg:help(raw_input);

核心風格: 一直在函數外作用戶交互操做

從用戶那裏獲得須要的數據, 而後調用函數處理, 從函數獲得返回值,而後顯示結果給用戶。

更重要的, 將函數分爲兩大類, 一類只作事, 不須要返回值(好比與用戶交互或設置變量的值), 另外一類則執行一些運算,最後返回結果。若是輸出就是函數的目的,那麼在函數體內使用 print 語句也是能夠接受的選擇.

2.3 註釋

  • Python 也使用 # 符號標示註釋;

  • 文檔字符串:你能夠在模塊、類或者函數的起始添加一個字符串,起到在線文檔的功能;與普通註釋不一樣,文檔字符串能夠在運行時訪問,也能夠用來自動生成文檔

2.4 運算符

標準算術運算符:+ - * / // % **

Python 有兩種除法運算符,單斜槓用做傳統除法,雙斜槓用做浮點除法(對結果進行四捨五入).

  • 傳統除法是指若是兩個操做數都是整數的話,它將執行是地板除(取比商小的最大整數);

  • 而浮點除法是真正的除法,無論操做數是什麼類型,浮點除法老是執行真正的除法【第五章詳細介紹】;

標準比較運算符:< <= > >= == != 

邏輯運算符:and or not

eg:

3 < 4 < 5

該例子在其餘語言中一般是不合法的,不過Python 支持這樣的表達式。它其實是下面表達式的縮寫:

>>> 3 < 4 and 4 < 5

2.5 變量和賦值

  • Python 中變量名規則與其它大多數高級語言同樣;

  • Python變量名是大小寫敏感的;

  • Python 是動態類型語言, 變量的類型和值在賦值那一刻被初始化;

  • Python 也支持增量賦值,也就是運算符和等號合併在一塊兒;

  • Python 不支持C 語言中的自增1 和自減1 運算符,會將 --n 解釋爲-(-n) 從而獲得 n;

2.6 數字

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

第五章詳細將介紹全部的數字類型。

2.7 字符串

Python 支持使用成對的單引號或雙引號,三引號(三個連續的單引號或者雙引號)能夠用來包含特殊字符。

  • 使用索引運算符( [ ] )和切片運算符( [ : ] )能夠獲得子字符串;

  • 字符串有其特有的索引規則:第一個字符的索引是 0,最後一個字符的索引是 -1;

  • 加號( + )用於字符串鏈接運算,星號( * )則用於字符串重複;

你能夠在第六章學到更多有關字符串的知識。

2.8 列表和元組

能保存任意數量任意類型的Python 對象。和數組同樣,經過從0 開始的數字索引訪問元素,可是列表和元組能夠存儲不一樣類型的對象

  • 列表和元組有幾處重要的區別。列表元素用中括號( [ ])包裹,元素的個數及元素的值能夠改變。

  • 元組元素用小括號(( ))包裹,不能夠更改(儘管他們的內容能夠)。元組能夠當作是隻讀的列表。

經過切片運算( [ ] 和 [ : ] )能夠獲得子集,這一點與字符串的使用方法同樣。

你能夠在第六章學到更多有關列表、元組以及字符串的知識。

2.9 字典

字典是Python 中的映射數據類型,由鍵-值(key-value)對構成。幾乎全部類型的Python 對象均可以用做鍵,不過通常仍是以數字或者字符串最爲經常使用。

值能夠是任意類型的Python 對象,字典元素用大括號({ })包裹。

在第七章中會詳細講解字典。

2.10 代碼塊及縮進對齊

代碼塊經過縮進對齊表達代碼邏輯而不是使用大括號。

2.11 if 語句

標準if 條件語句的語法以下:

if expression:
    if_suite

Python 還支持 else、elif (意指 「else-if 」)語句。

在第8 章你能夠學到更多有關 if, elif, else 條件語句的知識。

2.12 while 循環

while expression:
    while_suite

第8 章的循環一節進行詳細講解。

2.13 for 循環和range()內建函數

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

2.13 列表解析

你能夠在一行中使用一個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

2.15 文件和內建函數open() 、file()

如何打開文件: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 章, 咱們詳細介紹文件對象, 及它們的內建方法屬性, 以及如何訪問本地文件系統。 

2.16 錯誤和異常

編譯時會檢查語法錯誤, 不過 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 異常的知識。

2.17 函數

若是函數中沒有 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 章以瞭解更詳細的函數的信息。

2.18 類

類是面向對象編程的核心, 它扮演相關數據及邏輯的容器角色。它們提供了建立「真實」對象(也就是實例)的藍圖。

如何定義類

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 類和類實例。

2.19 模塊

模塊是一種組織形式, 它將彼此有關係的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.19 實用的函數

本章中, 咱們用到了不少實用的內建函數。咱們在表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 對象!)

相關文章
相關標籤/搜索