亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
1234下一頁
最近訪問板塊 發(fā)新帖
查看: 48380 | 回復: 33
打印 上一主題 下一主題

Python 指南 [復制鏈接]

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2005-05-31 16:43 |只看該作者 |倒序瀏覽
前言

目錄

1. 開胃菜

2. 使用Python解釋器

2.1 調用解釋器

2.1.1 傳遞參數(shù)

2.1.2 交互模式

2.2 解釋器及其工作模式

2.2.1 錯誤處理

2.2.2 執(zhí)行 Python 腳本

2.2.3 源程序編碼

2.2.4 交互環(huán)境的啟動文件

3.初步認識 Python

3.1 像使用計算器一樣使用Python

3.1.1 數(shù)值

3.1.2 字符串

3.1.3 Unicode 字符串

3.1.4 鏈表

3.2 開始編程

4. 流程控制

4.1 if 語法

4.2 for 語法

4.3 range() 函數(shù)

4.4 break 和 continue 語法以及 else 子句 在循環(huán)中的用法

4.5 pass 語法

4.6 定義函數(shù)

4.7 定義函數(shù)的進一步知識

4.7.1 定義參數(shù)變量

4.7.2 參數(shù)關鍵字

4.7.3 可變參數(shù)表

4.7.4 Lambda 形式

4.7.5 文檔字符串

5. 數(shù)據(jù)結構

5.1 深入鏈表

5.1.1 將鏈表作為堆棧來使用

5.1.2 將鏈表作為隊列來使用

5.1.3 函數(shù)化的編程工具

5.1.4 鏈表的內含(Comprehensions)

5.2 del 語法

5.3 Tuples 和 Sequences

5.4 字典(Dictionaries)

5.5 循環(huán)技巧

5.6 深入條件控制

5.7 Sequences 和其它類型的比較

6. 模塊

6.1 深入模塊

6.1.1 模塊搜索路徑

6.1.2 “編譯” Python 文件

6.2 標準模塊

6.3 dir() 函數(shù)

6.4 包

6.4.1 從包中導入所有內容(import * )

6.4.2 隱式包引用

6.4.3 包中的多重路徑

7. 輸入和輸出

7.1 格式化輸出

7.2 讀寫文件

7.2.1 文件對象的方法

7.2.2 pickle 模塊

8. 錯誤和異常

8.1 語法 Errors

8.2 異常

8.3 捕獲異常

8.4 釋放異常

8.5 用戶自定義異常

8.6 定義 Clean-up Actions

9. 類

9.1 有關術語的話題

9.2 Python 的作用域和命名空間

9.3 初識類

9.3.1 類定義語法

9.3.2 類對象

9.3.3 實例對象

9.3.4 方法對象

9.4 一些說明

9.5 繼承

9.5.1 多繼承

9.6 私有變量

9.7 補充

9.8 異常也是類

9.9 迭代子(Iterators)

9.10 發(fā)生器(Generators)

10. 接下來?

A. 交互式編輯和歷史回溯

A.1 行編輯

A.2 歷史回溯

A.3 快捷鍵綁定

A.4 注釋

B. 浮點計算:問題與極限

B.1 表達錯誤

C. 歷史和授權

C.1 本軟件的歷史

C.2 修改和使用Python的條件(Terms and conditions for accessing or otherwise using Python)

關于本文檔

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
2 [報告]
發(fā)表于 2005-05-31 16:44 |只看該作者

Python 指南

前言
Copyright & 2001, 2002, 2003 Python Software Foundation. All rights reserved.

Copyright & 2000 BeOpen.com. All rights reserved.

Copyright & 1995-2000 Corporation for National Research Initiatives. All rights reserved.

Copyright & 1991-1995 Stichting Mathematisch Centrum. All rights reserved.

See the end of this document for complete license and permissions information.

概要:
Python 是一種容易學習的強大語言。它包括了高效的高級數(shù)據(jù)結構,提供了一個簡單但很有有效的方式以便進行面向對象編程。Python 優(yōu)雅的語法,動態(tài)數(shù)據(jù)類型,以及它的解釋器,使其成為了大多數(shù)平臺上應用于各領域理想的腳本語言以及開發(fā)環(huán)境。

Python解釋器及其擴展標準庫的源碼和編譯版本可以從Python的Web站點http://www.python.org/及其所有鏡像站上免費獲得,并且可以自由發(fā)布。該站點上也提供了Python的一些第三方模塊,程序,工具,以及附加的文檔。

Python的解釋器很容易通過C或C++(或者其它可以由C來調用的語言)來實現(xiàn)功能和數(shù)據(jù)結構的擴展。因些Python 也很適于做為定制應用的一種擴展語言。

這個手冊介紹了一些Python語言及其系統(tǒng)的基本知識與根念。這有助于對Python有一個基本的認識,當然所有的例子都包括在里面了,所以這本手冊很適合離線閱讀。

需要有關標準對象和模塊的詳細介紹的話,請查詢Python 程序庫參考手冊 文檔。Python 參考手冊 提供了更多的關于語言方面的正式說明。需要編寫C或C++擴展,請閱讀 Python 解釋器的擴展和集成 以及Python/C API 參考手冊。這幾本書涵蓋了各個深度上的Python知識。

本手冊不會涵蓋Python的所有功能,也不會去解釋所用到的所有相關的知識。相反,它介紹了許多Python中最引人注目的功能,這會對讀者掌握這門語言的風格大有幫助。讀過它后,你應該可以閱讀和編寫Python模塊和程序了,接下來你可以從Python 庫參考手冊中進一步學習Python復雜多變的庫和模塊了。

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
3 [報告]
發(fā)表于 2005-05-31 16:44 |只看該作者

Python 指南

1. 開胃菜
如果你寫過大規(guī)模的Shell腳本,應該會有過這樣的體會:你還非常想再加一些別的功能進去,但它已經太大、太慢、太復雜了;或者這個功能需要調用一個系統(tǒng)函數(shù),或者它只適合通過C來調用……通常這些問題還不足以嚴肅到需要用C重寫這個Shell;可能這個功能需要一些類似變長字符串或其它一些在Shell腳本中很容易找到的數(shù)據(jù)類型(比如文件名的有序列表),但它們用C來實現(xiàn)就要做大量的工作,或者,你對C還不是很熟悉。

另一種情況:可能你需要使用幾個C庫來工作,通常C的編寫/編譯/測試/重編譯周期太慢。你需要盡快的開發(fā)軟件。也許你需要寫一個使用擴展語言的程序,但不想設計一個語言,并為此編寫調試一個解釋器,然后再把它集成進你的程序。

遇到以上情況,Python可能就是你要找的語言。Python很容易上手,但它是一門真正的編程語言,提供了比Shell多的多的結構,支持大型程序。另一方面,它提供了比C更多的錯誤檢查,并且,做為一門高級語言,它擁有內置的高級數(shù)據(jù)類型,例如可變數(shù)組和字典,如果通過C來實現(xiàn)的話,這些工作可能讓你大干上幾天的時間。因為擁有更多的通用數(shù)據(jù)類型,Python適合比Awk甚至Perl更廣泛的問題領域,在其它的很多領域,Python至少比別的語言要易用得多。

Python可以讓你把自己的程序分隔成不同的模塊,這樣就可以在其它的Python程序中重用。這樣你就可以讓自己的程序基于一個很大的標準模塊集或者用它們做為示例來學習Python編程。Python中集成了一些類似文件I/O,系統(tǒng)調用,sockets,甚至像Tk這樣的用戶圖形接口。

Python是一門解釋型語言,因為不需要編譯和鏈接的時間,它可以幫你省下一些開發(fā)時間。解釋器可以交互式使用,這樣就可以很方便的測試語言中的各種功能,以便于編寫發(fā)布用的程序,或者進行自下而上的開發(fā)。還可以當它是一個隨手可用的計算器。

Python可以寫出很緊湊和可讀性很強的程序。用Python寫的程序通常比同樣的C或C++程序要短得多,這是因為以下幾個原因:

高級數(shù)據(jù)結構使你可以在一個單獨的語句中表達出很復雜的操作;

語句的組織依賴于縮進而不是begin/end塊;

不需要變量或參數(shù)聲明。

Python是可執(zhí)行的:如果你會用C語言寫程序,那就可以很容易的為解釋器添加新的集成模塊和功能,或者優(yōu)化瓶頸,使其達到最大速度,或者使Python能夠鏈接到所需的二進制架構上(比如某個專用的商業(yè)圖形庫)。等你真正熟悉這一切了,你就可以把Python集成進由C寫成的程序,把Python當做這個程序的擴展或命令行語言。

順便說一下,這個語言的名字來源于BBC的“Monty Python's Flying Circus”節(jié)目,和兇猛的爬蟲沒有任何關系。在文檔中引用Monty Python典故不僅是允許的,而且還受到鼓勵!

現(xiàn)在你已經了解了Python中所有激動人心的東西,大概你想仔細的試試它了。學習一門語言最好的辦法就是使用它,你會很樂于這樣做。

下一節(jié)中,我們會很機械的說明解釋器的用法。這沒有什么神秘的,不過有助于我們練習后面展示的例子。

本指南其它部分通過例子介紹了Python語言和系統(tǒng)的各種功能,開始是簡單表達式、語法和數(shù)據(jù)類型,接下來是函數(shù)和模塊,最后是諸如異常和自定義類這樣的高級內容。

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
4 [報告]
發(fā)表于 2005-05-31 16:45 |只看該作者

Python 指南

2. 使用Python解釋器
  
2.1 調用解釋器
通常Python的解釋器被安裝在目標機器的 /usr/local/bin/python 目錄下;把 /usr/local/bin 目錄放進你的UNIX Shell 的搜索路徑里,確保它可以通過輸入

python
來啟動。因為安裝路徑是可選的,所以也有可能安裝在其它位置,你可以與安裝Python的用戶或系統(tǒng)管理員聯(lián)系。(例如,/usr/local/python就是一個很常見的選擇)

輸入一個文件結束符(UNIX上是Ctrl+D,Windwos上是Ctrl+Z)解釋器會以0值退出(就是說,沒有什么錯誤,正常退出--譯者)。如果這沒有起作用,你可以輸入以下命令退出:“import sys; sys.exit()”。

解釋器的行編輯功能并不很復雜。裝在Unix上的解釋器可能會有GNU readline 庫支持,這樣就可以額外得到精巧的交互編輯和歷史記錄功能?赡軝z查命令行編輯器支持能力最方便的方式是在主提示符下輸入Ctrl+P。如果有嘟嘟聲(計算機揚聲器),說明你可以使用命令行編輯功能,從附錄 A 可以查到快捷鍵的介紹。如果什么也沒有發(fā)聲,或者P顯示了出來,說明命令行編輯功能不可用,你只有用退格鍵刪掉輸入的命令了。

解釋器的操作有些像Unix Shell:使用終端設備做為標準輸入來調用它時,解釋器交互的解讀和執(zhí)行命令,通過文件名參數(shù)或以文件做為標準輸入設備時,它從文件中解讀并執(zhí)行腳本。

啟動解釋器的第三個方法是“python -c command [arg] ...”,這種方法可以在命令行中直接執(zhí)行語句,等同于Shell的 -c選項。因為Python語句通常會包括空格之類的特殊字符,所以最好把整個語句用雙引號包起來。

注意“python file”和“python <file”是有區(qū)別的。對于后一種情況,程序中類似于調用 input() 和raw_input()這樣的輸入請求,來自于確定的文件。因為在解析器開始執(zhí)行之前,文件已經完全讀入,所以程序指向文件尾。在前一種情況(這通常是你需要的)它們從來自于任何聯(lián)接到Python解釋器的標準輸入,無論它們是文件還是其它設備。

使用腳本文件時,經常會運行腳本然后進入交互模式。這也可以通過在腳本之前加上-i參數(shù)來實現(xiàn)。(如果腳本來自標準輸入,就不能這樣運行,與前一段提到的原因一樣。)

  
2.1.1 參數(shù)傳遞
調用解釋器時,腳本名和附加參數(shù)之傳入一個名為sys.argv的字符串列表。沒有腳本和參數(shù)時,它至少也有一個元素:sys.argv[0]此時為空字符串。腳本名指定為‘ - ’(表示標準輸入)時,sys.argv[0]被設置為‘ - ’,使用 -c 指令時,sys.argv[0]被設定為‘ -c ’。 -c 命令之后的參數(shù)不會被 Python 解釋器的選項處理機制所截獲,而是留在sys.argv 中,供腳本命令操作。

  
2.1.2 交互模式
從tty讀取命令時,我們稱解釋器工作于交互模式。這種模式下它根據(jù)主提示符來執(zhí)行,主提示符通常標識為三個大于號(“>;>;>; ”);繼續(xù)的部分被稱為從屬提示符,由三個點標識(“... ”)。在第一行之前,解釋器打印歡迎信息、版本號和授權提示:

python
Python 2.3 (#1, Jul 30 2003, 23:22:59)
[GCC 3.2 20020927 (prerelease)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>;>;>;
輸入多行結構時需要從屬提示符了,例如,下面這個 if 語句:

>;>;>; the_world_is_flat = 1
>;>;>; if the_world_is_flat:
...     print "Be careful not to fall off!"
...
Be careful not to fall off!
  
2.2 解釋器及其環(huán)境
  
2.2.1 錯誤處理
有錯誤發(fā)生時,解釋器打印一個錯誤信息和棧跟蹤(監(jiān)視)器?。交互模式下,它返回主提示符,如果從文件輸入執(zhí)行,它在打印棧跟蹤器后以非零狀態(tài)退出。(異?梢杂蓆ry語句中的except子句來控制,這樣就不會出現(xiàn)上文中的錯誤信息)有一些非常致命的錯誤會導致非零狀態(tài)下退出,這由通常由內部矛盾和內存溢出造成。所有的錯誤信息都寫入標準錯誤流;命令中執(zhí)行的普通輸出寫入標準輸出。

在主提示符或附屬提示符輸入中斷符(通常是Control-C or DEL)就會取消當前輸入,回到主命令行。2.1執(zhí)行命令時輸入一個中斷符會拋出一個 KeyboardInterrupt 異常,它可以被try句截獲。

  
2.2.2 執(zhí)行Python腳本
BSD系統(tǒng)中,Python腳本可以像Shell腳本那樣直接執(zhí)行,只要在腳本文件開頭寫一行命令,指定文件和模式:

#! /usr/bin/env python
(將用戶路徑通知解釋器) “#!”必須是文件的前兩個字符,在某些平臺上,第一行必須以Unix風格的行結束符(“\n”)結束,不能用Mac(“\r”)或Windows(“\r\n”)的結束符。注意,“#”是Python中是行注釋的起始符。

腳本可以通過 chmod 命令指定執(zhí)行模式和許可權。

$ chmod +x myscript.py
2.2.3 源程序編碼
Python的源文件可以通過編碼使用 ASCII 以外的字符集。 最好的做法是在 #! 行后面用一個特殊的注釋行來定義字符集。

# -*- coding: iso-8859-1 -*-
根據(jù)這個聲明,Python會將文件中的字符盡可能的從指定的編碼轉為Unicode,在本例中,這個字符集是 iso-8859-1 。在 Python 庫參考手冊 中可以找到可用的編碼列表(根據(jù)我的實驗,中文似乎只能用cp-936或utf-8,不直接支持GB,GBK,GB-18030或ISO-10646--譯者注)。

如果你的文件編輯器支持UTF-8格式,并且可以保存UTF-8標記(aka BOM - Byte Order Mark),你可以用這個來代替編碼聲明(看來至少Jext還不支持這樣做,而Vim,我還沒找到它的編碼設置在哪里,還是老老實實的用注釋行指定源代碼的編碼吧--譯者注)。IDLE可以通過設定Options/General/Default Source Encoding/UTF-8 來支持它。需要注意的是舊版Python不支持這個標記(Python 2.2或更早的版本),也同樣不能使操作系統(tǒng)支持#!文件。

使用UTF-8內碼(無論是用標記還是編碼聲明),我們可以在字符串和注釋中使用世界上的大部分語言。標識符中不能使用非 ASCII 字符集。為了正確顯示所有的字符,你一定要在編輯器中將文件保存為UTF-8格式,而且要使用支持文件中所有字符的字體。

  
2.2.4 交互式環(huán)境的啟動文件
使用Python解釋器的時候,我們可能需要在每次解釋器啟動時執(zhí)行一些命令。你可以在一個文件中包含你想要執(zhí)行的命令,設定一個名為PYTHONSTARTUP 的環(huán)境變量來指定這個文件。這類似于Unix shell的.profile文件。

這個文件在交互會話期是只讀的,當Python從腳本中解讀文件或以終端做為外部命令源時則不會如此(盡管它們的行為很像是處在交互會話期。)它與解釋器執(zhí)行的命令處在同一個命名空間,所以由它定義或引用的一切可以在解釋器中不受限制的使用。你也可以在這個文件中改變sys.ps1和sys.ps2指令。

如果你想要在當前目錄中執(zhí)行附加的啟動文件,你可以在全局啟動文件中加入類似以下的代碼:“if os.path.isfile('.pythonrc.py'): execfile('.pythonrc.py')”。 如果你想要在某個腳本中使用啟動文件,必須要在腳本中寫入這樣的語句:

import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    execfile(filename)

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
5 [報告]
發(fā)表于 2005-05-31 16:45 |只看該作者

Python 指南

3. Python的非正式介紹
在后面的例子中,區(qū)分輸入和輸出的方法是看是否有提示符(“>;>;>; ”和“.. ”):想要重復這些例子的話,你就要在提示符顯示后輸入所有的一切;沒有以提示符開始的行,是解釋器輸出的信息。需要注意的是示例中的從屬提示符用于多行命令的結束,它表示你需要輸入一個空行。

本手冊中的很多示例都包括注釋,甚至有一些在交互提示符中折行。Python中的注釋以符號“#”起始,一直到當前行的結尾。注釋可能出現(xiàn)在一行的開始,也可能跟在空格或程序代碼之后,但不會出現(xiàn)在字符串中,字符串中的#號只代表#號。

示例:

# this is the first comment
SPAM = 1                 # and this is the second comment
                         # ... and now a third!
STRING = "# This is not a comment."
  
3.1 初步認識Python
讓我們試驗一些簡單的Python命令。啟動解釋器然后等待主提示符“>;>;>; ”出現(xiàn)(這用不了太久)。

  
3.1.1 數(shù)值
解釋器的行為就像是一個計算器。你可以向它輸入一個表達式,它會返回結果。表達式的語法簡明易懂:+,-,*,/和大多數(shù)語言中的用法一樣(比如C或Pascal),括號用于分組。例如:

>;>;>; 2+2
4
>;>;>; # This is a comment
... 2+2
4
>;>;>; 2+2  # and a comment on the same line as code
4
>;>;>; (50-5*6)/4
5
>;>;>; # Integer division returns the floor:
... 7/3
2
>;>;>; 7/-3
-3
像c一樣,等號(“=”)用于給變量賦值。被分配的值是只讀的。

>;>;>; width = 20
>;>;>; height = 5*9
>;>;>; width * height
900
同一個值可以同時賦給幾個變量:

>;>;>; x = y = z = 0  # Zero x, y and z
>;>;>; x
0
>;>;>; y
0
>;>;>; z
0
Python完全支持浮點數(shù),不同類型的操作數(shù)混在一起時,操作符會把整型轉化為浮點數(shù)。

>;>;>; 3 * 3.75 / 1.5
7.5
>;>;>; 7.0 / 2
3.5
復數(shù)也同樣得到了支持,虛部由一個后綴“j”或者“J”來表示。帶有非零實部的復數(shù)記為“(real+imagj)”,或者也可以通過“complex(real, imag)”函數(shù)創(chuàng)建。

>;>;>; 1j * 1J
(-1+0j)
>;>;>; 1j * complex(0,1)
(-1+0j)
>;>;>; 3+1j*3
(3+3j)
>;>;>; (3+1j)*3
(9+3j)
>;>;>; (1+2j)/(1+1j)
(1.5+0.5j)
復數(shù)總是由實部和虛部兩部分浮點數(shù)來表示?赡軓 z.real 和 z.imag 得到復數(shù)z的實部和虛部。

>;>;>; a=1.5+0.5j
>;>;>; a.real
1.5
>;>;>; a.imag
0.5
用于向浮點數(shù)和整型轉化的函數(shù)(float(), int() 和 long())不能對復數(shù)起作用--沒有什么方法可以將復數(shù)轉化為實數(shù)?梢允褂胊bs(z)取得它的模,也可以通過z.real得到它的實部。

>;>;>; a=3.0+4.0j
>;>;>; float(a)
Traceback (most recent call last):
  File "<stdin>;", line 1, in ?
TypeError: can't convert complex to float; use e.g. abs(z)
>;>;>; a.real
3.0
>;>;>; a.imag
4.0
>;>;>; abs(a)  # sqrt(a.real**2 + a.imag**2)
5.0
>;>;>;
交互模式下,最近一次表達式輸出保存在_變量中。這意味著把Python當做桌面計算器使用時,它可以更容易的進行連續(xù)計算,例如:

>;>;>; tax = 12.5 / 100
>;>;>; price = 100.50
>;>;>; price * tax
12.5625
>;>;>; price + _
113.0625
>;>;>; round(_, 2)
113.06
>;>;>;
這個變量對于用戶來說是只讀的。不要試圖去給它賦值--由于Python的語法效果,你只會創(chuàng)建一個同名的局部變量覆蓋它。

  
3.1.2 字符串
除了數(shù)值,Python還可以通過幾種不同的方法操作字符串。字符串用單引號或雙引號標識:

>;>;>; 'spam eggs'
'spam eggs'
>;>;>; 'doesn\'t'
"doesn't"
>;>;>; "doesn't"
"doesn't"
>;>;>; '"Yes," he said.'
'"Yes," he said.'
>;>;>; "\"Yes,\" he said."
'"Yes," he said.'
>;>;>; '"Isn\'t," she said.'
'"Isn\'t," she said.'
字符串可以通過幾種方式分行?梢栽谛屑臃葱备茏鰹槔^續(xù)符,這表示下一行是當前行的邏輯沿續(xù)。

hello = "This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
    Note that whitespace at the beginning of the line is\
significant."

print hello
注意換行用 \n 來表示;反斜杠后面的新行標識(newline,縮寫“n”)會轉換為換行符,示例會按如下格式打。

This is a rather long string containing
several lines of text just as you would do in C.
    Note that whitespace at the beginning of the line is significant.
然而,如果我們創(chuàng)建一個“raw”行,\n序列就不會轉為換行,示例源碼最后的反斜杠和換行符n都會做為字符串中的數(shù)據(jù)處理。如下所示:

hello = r"This is a rather long string containing\n\
several lines of text much as you would do in C."

print hello
會打印為:

This is a rather long string containing\n\
several lines of text much as you would do in C.
或者,字符串可以用一對三重引號”””或'''來標識。三重引號中的字符串在行尾不需要換行標記,所有的格式都會包括在字符串中。

print """
Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
"""
produces the following output:

Usage: thingy [OPTIONS]
     -h                        Display this usage message
     -H hostname               Hostname to connect to
解釋器打印出來的字符串與它們輸入的形式完全相同:內部的引號,用反斜杠標識的引號和各種怪字符,都精確的顯示出來。如果字符串中包含單引號,不包含雙引號,可以用雙引號引用它,反之可以用單引號。(后面介紹的print語句,可以可以用來寫沒有引號和反斜杠的字符串)。

字符串可以用+號聯(lián)接(或者說粘合),也可以用*號循環(huán)。

>;>;>; word = 'Help' + 'A'
>;>;>; word
'HelpA'
>;>;>; '<' + word*5 + '>;'
'<HelpAHelpAHelpAHelpAHelpA>;'
兩個字符串值之間的聯(lián)接是自動的,上例第一行可以寫成“word = 'Help' 'A'”這種方式只對字符串值有效,任何字符串表達式都不適用這種方法。

>;>;>; import string
>;>;>; 'str' 'ing'                   #  <-  This is ok
'string'
>;>;>; string.strip('str') + 'ing'   #  <-  This is ok
'string'
>;>;>; string.strip('str') 'ing'     #  <-  This is invalid
  File "<stdin>;", line 1, in ?
    string.strip('str') 'ing'
                            ^
SyntaxError: invalid syntax
字符串可以用下標(索引)查詢;就像C一樣,字符串的第一個字符下標是0。這里沒有獨立的字符類型,字符僅僅是大小為一的字符串。就像在Icon中那樣,字符串的子串可以通過切片標志來表示:兩個由冒號隔開的索引。

>;>;>; word[4]
'A'
>;>;>; word[0]
'He'
>;>;>; word[2]
'lp'
切片索引可以使用默認值;省略前一個索引表示0,省略后一個索引表示被切片的字符串的長度。

>;>;>; word[]    # The first two characters
'He'
>;>;>; word[2:]    # All but the first two characters
'lpA'
和C字符串不同,Python字符串不能改寫。按字符串索引賦值會產生錯誤。

>;>;>; word[0] = 'x'
Traceback (most recent call last):
  File "<stdin>;", line 1, in ?
TypeError: object doesn't support item assignment
>;>;>; word[] = 'Splat'
Traceback (most recent call last):
  File "<stdin>;", line 1, in ?
TypeError: object doesn't support slice assignment
然而,可以通過簡單有效的組合方式生成新的字符串:

>;>;>; 'x' + word[1:]
'xelpA'
>;>;>; 'Splat' + word[4]
'SplatA'
切片操作有一個很有用的不變性: s[] + s[i:] 等于s。

>;>;>; word[] + word[2:]
'HelpA'
>;>;>; word[] + word[3:]
'HelpA'
退化的切片索引被處理的很優(yōu)美:過大的索引代替為字符串大小,下界比上界大的返回空字符串。

>;>;>; word[1]
'elpA'
>;>;>; word[10:]
''
>;>;>; word[2]
''
索引可以是負數(shù),計數(shù)從右邊開始,例如:

>;>;>; word[-1]     # The last character
'A'
>;>;>; word[-2]     # The last-but-one character
'p'
>;>;>; word[-2:]    # The last two characters
'pA'
>;>;>; word[:-2]    # All but the last two characters
'Hel'
不過-0還是0,所以它不是從右邊計數(shù)的!

>;>;>; word[-0]     # (since -0 equals 0)
'H'
越界的負切片索引會被截斷,不過不要嘗試在前元素索引(非切片的)中這樣做:

>;>;>; word[-100:]
'HelpA'
>;>;>; word[-10]    # error
Traceback (most recent call last):
  File "<stdin>;", line 1, in ?
IndexError: string index out of range
理解切片的最好方式是把索引視為兩個字符之間的點,第一個字符的左邊是0,字符串中第n個字符的右邊是索引n,例如:

+---+---+---+---+---+
| H | e | l | p | A |
+---+---+---+---+---+
0   1   2   3   4   5
-5  -4  -3  -2  -1
第一行是字符串中給定的0到5各個索引的位置,第二行是對應的負索引。從i到j的切片由這兩個標志之間的字符組成。

對于非負索引,切片長度就是兩索引的差。例如,word[1]的長度是2。

內置函數(shù) len() 返回字符串長度:

>;>;>; s = 'supercalifragilisticexpialidocious'
>;>;>; len(s)
34
  
3.1.3 Unicode 字符串
從Python2.0開始,程序員們可以使用一種新的數(shù)據(jù)類型來存儲文本數(shù)據(jù):Unicode 對象。它可以用于存儲多種Unicode數(shù)據(jù)(請參閱 http://www.unicode.org/ ),并且,通過必要時的自動轉換,它可以與現(xiàn)有的字符串對象良好的結合。

Unicode針對現(xiàn)代和舊式的文本中所有的字符提供了一個序列。以前,字符只能使用256個序號,文本通常通過綁定代碼頁來與字符映射。這很容易導致混亂,特別是軟件的國際化(internationalization--通常寫做“i18n”--“i”+18 characters +“n”)。Unicode通過為所有字符定義一個統(tǒng)一的代碼頁解決了這個問題。

Python中定義一個Unicode字符串和定義一個普通字符串一樣簡單:

>;>;>; u'Hello World !'
u'Hello World !'
引號前小寫的“u”表示這里創(chuàng)建的是一個Unicode字符串。如果你想加入一個特殊字符,可以使用Python的 Unicode-Escape 編碼。如下例所示:

>;>;>; u'Hello\u0020World !'
u'Hello World !'
被替換的 \u0020 標識表示在給定位置插入編碼值為 0x0020 的 Unicode字符(空格符)。

其它字符也會被直接解釋成對應的Unicode碼。如果你有一個在西方國家常用的Latin-1編碼字符串,你可以發(fā)現(xiàn)Unicode字符集的前256個字符與Lation-1的對應字符編碼完全相同。

另外,有一種與普通字符串相同的行模式。想要使用Python的Raw-Unicode-Escape 編碼,你需要在字符串的引號前加上 ur 前綴。如果在小寫“u”前可能有不止一個反斜杠,它只會把那些單獨的 \uXXXX 轉化為Unicode字符。

>;>;>; ur'Hello\u0020World !'
u'Hello World !'
>;>;>; ur'Hello\\u0020World !'
u'Hello\\\\u0020World !'
行模式在你需要輸入很多個反斜杠時很有用,可能會用于正規(guī)表達式。

作為這些編碼標準的一部分,Python提供了一個完備的方法集用于從已知的編碼集創(chuàng)建Unicode字符串。

內置函數(shù)unicode() 提供了訪問(編碼和解碼)所有已注冊的Unicode編碼的方法。它能轉換眾所周知的 Latin-1, ASCII, UTF-8, 和 UTF-16。后面的兩個可變長編碼字符集用一個或多個byte存儲Unicode字符。默認的字符集是 ASCII ,它只處理0到127的編碼,拒絕其它的字符并返回一個錯誤。當一個Unicode字符串被打印、寫入文件或通過str()轉化時,它們被替換為默認的編碼。

>;>;>; u"abc"
u'abc'
>;>;>; str(u"abc"
'abc'
>;>;>; u"&amp;&amp;ü"
u'\xe4\xf6\xfc'
>;>;>; str(u"&amp;&amp;ü"
Traceback (most recent call last):
  File "<stdin>;", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(12
要把一個Unicode字符串用指定的字符集轉化成8位字符串,可以使用Unicode對象提供的encode()方法,它有一個參數(shù)用以指定編碼名稱。編碼名稱小寫。

>;>;>; u"&amp;&amp;ü".encode('utf-8')
'\xc3\xa4\xc3\xb6\xc3\xbc'
如果你有一個特定編碼的字符串,想要把它轉為Unicode字符集,,可以使用uncode()函數(shù),它以編碼名做為第二個參數(shù)。

>;>;>; unicode('\xc3\xa4\xc3\xb6\xc3\xbc', 'utf-8')
u'\xe4\xf6\xfc'
  
3.1.4 鏈表
Python 已經有了幾個復合數(shù)據(jù)類型,用于組織其它的值。最通用的是鏈表,它寫為中括之間用逗號分隔的一列值(子項),鏈表的子項不一定是同一類型的值。

>;>;>; a = ['spam', 'eggs', 100, 1234]
>;>;>; a
['spam', 'eggs', 100, 1234]
像字符串一樣,鏈表也以零開始,可以被切片,聯(lián)接,等等:

>;>;>; a[0]
'spam'
>;>;>; a[3]
1234
>;>;>; a[-2]
100
>;>;>; a[1:-1]
['eggs', 100]
>;>;>; a[] + ['bacon', 2*2]
['spam', 'eggs', 'bacon', 4]
>;>;>; 3*a[] + ['Boe!']
['spam', 'eggs', 100, 'spam', 'eggs', 100, 'spam', 'eggs', 100, 'Boe!']
與不變的字符串不同,鏈表可以改變每個獨立元素的值:

>;>;>; a
['spam', 'eggs', 100, 1234]
>;>;>; a[2] = a[2] + 23
>;>;>; a
['spam', 'eggs', 123, 1234]
可以進行切片操作,甚至還可以改變鏈表的大。

>;>;>; # Replace some items:
... a[0] = [1, 12]
>;>;>; a
[1, 12, 123, 1234]
>;>;>; # Remove some:
... a[0] = []
>;>;>; a
[123, 1234]
>;>;>; # Insert some:
... a[1] = ['bletch', 'xyzzy']
>;>;>; a
[123, 'bletch', 'xyzzy', 1234]
>;>;>; a[] = a     # Insert (a copy of) itself at the beginning
>;>;>; a
[123, 'bletch', 'xyzzy', 1234, 123, 'bletch', 'xyzzy', 1234]
內置函數(shù)len()也同樣可以用于鏈表:

>;>;>; len(a)
8
它也可以嵌套鏈表(在鏈表中創(chuàng)建其它鏈表),例如:

>;>;>; q = [2, 3]
>;>;>; p = [1, q, 4]
>;>;>; len(p)
3
>;>;>; p[1]
[2, 3]
>;>;>; p[1][0]
2
>;>;>; p[1].append('xtra')     # See section 5.1
>;>;>; p
[1, [2, 3, 'xtra'], 4]
>;>;>; q
[2, 3, 'xtra']
注意最后一個例子,p[1]和q實際上指向同一個對象!我們在后面會講到對象語法。

  
3.2 開始編程
當然,我們可以用Python做比2加2更復雜的事。例如,我們可以用以下的方法輸出菲波那契(Fibonacci)序列的子序列:

>;>;>; # Fibonacci series:
... # the sum of two elements defines the next
... a, b = 0, 1
>;>;>; while b < 10:
...       print b
...       a, b = b, a+b
...
1
1
2
3
5
8
示例中介紹了一些新功能:

第一行包括了復合參數(shù):變量a和b同時被賦值為0和1。最后一行又一次使用了這種技術,證明了在賦值之前表達式右邊先進行了運算。右邊的表達式從左到右運算。

while循環(huán)運行在條件為真時執(zhí)行。在Python中,類似于C任何非零值為真,零為假。 這個條件也可以用于字符串或鏈表,事實上于對任何序列類型,長度非零時為真,空序列為假。示例所用的是一個簡單的比較。標準的比較運算符寫法和C相同: < (小于),>; (大于),== (等于),<= (小于等于),>;=(大于等于)和!= (不等于)。

循環(huán)體是縮進的:縮進是Python對語句分組的方法。 Python仍沒有提供一個智能編輯功能所以你要在每一個縮進行輸入一個tab或(一個或多個)空格。 實際上你可能會準備更為復雜的文本編輯器來編寫你的Python程序,大多數(shù)文本編輯器都提供了自動縮進功能。交互式的輸入一個復雜語句時,需要用一個空行表示完成(因為解釋器沒辦法猜出你什么時候輸入最后一行)。需要注意的是每一行都要有相同的空字符來標識這是同一個語句塊。

print語句打印給定表達式的值。它與你僅僅輸入你需要的表達式(就像前面的計算器示例)不同,它可以同時輸出多個表達式。字符串輸出時沒有引號,各項之間用一個空格分開,你可以很容易區(qū)分它們,如下所示:

>;>;>; i = 256*256
>;>;>; print 'The value of i is', i
The value of i is 65536
print語句末尾的逗號避免了輸出中的換行:

>;>;>; a, b = 0, 1
>;>;>; while b < 1000:
...     print b,
...     a, b = b, a+b
...
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
需要注意的是,如果最后一行仍沒有寫完,解釋器會在它打印下一個命令時插入一個新行。

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
6 [報告]
發(fā)表于 2005-05-31 16:49 |只看該作者

Python 指南

4. 其它流程控制工具
除了前面介紹的 while 語句,Python 還從別的語言中借鑒了一些流程控制功能,并有所改變。

  
4.1 if 語句
也許最有句的語句類型是 if 語句。例如:

>;>;>; x = int(raw_input("lease enter an integer: ")
>;>;>; if x < 0:
...      x = 0
...      print 'Negative changed to zero'
... elif x == 0:
...      print 'Zero'
... elif x == 1:
...      print 'Single'
... else:
...      print 'More'
...
可能會有 0 或很多個 elif 部分,else 是可選的。關鍵字“elif ” 是“ else if ”的縮寫,這個可以有效避免過深的縮進。if ... elif ... elif ... 序列用于替代其它語言中的 switch 或 case 語句。

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
7 [報告]
發(fā)表于 2005-05-31 16:51 |只看該作者

Python 指南

您的帖子中有論壇禁止發(fā)表的詞匯或內容!

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
8 [報告]
發(fā)表于 2005-05-31 16:52 |只看該作者

Python 指南

4.3 range() 函數(shù)
如果你需要一個數(shù)值序列,內置函數(shù)range()可能會很有用,它生成一個等差級數(shù)鏈表。

>;>;>; range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
range(10)生成了一個包含10個值的鏈表,它準確的用鏈表的索引值填充了這個長度為10的列表,所生成的鏈表中不包括范圍中的結束值。也可以讓range操作從另一個數(shù)值開始,或者可以指定一個不同的步進值(甚至是負數(shù),有時這也被稱為“步長”):

>;>;>; range(5, 10)
[5, 6, 7, 8, 9]
>;>;>; range(0, 10, 3)
[0, 3, 6, 9]
>;>;>; range(-10, -100, -30)
[-10, -40, -70]
需要迭代鏈表索引的話,如下所示結合使用range()和len():

>;>;>; a = ['Mary', 'had', 'a', 'little', 'lamb']
>;>;>; for i in range(len(a)):
...     print i, a
...
0 Mary
1 had
2 a
3 little
4 lamb

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
9 [報告]
發(fā)表于 2005-05-31 16:52 |只看該作者

Python 指南

4.4 break 和 continue 語句, 以及循環(huán)中的 else 子句
break語句和C中的類似,用于跳出最近的一級for或while循環(huán)。

continue 語句是從C中借鑒來的,它表示循環(huán)繼續(xù)執(zhí)行下一次迭代。

循環(huán)可以有一個else子句;它在循環(huán)迭代完整個列表(對于for)或執(zhí)行條件為false(對于while)時執(zhí)行,但循環(huán)被break中止的情況下不會執(zhí)行。以下搜索素數(shù)的示例程序演示了這個子句:

>;>;>; for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...            print n, 'equals', x, '*', n/x
...            break
...     else:
...          # loop fell through without finding a factor
...          print n, 'is a prime number'
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
  
4.5 pass 語句
pass 語句什么也不做。它用于那些語法上必須要有什么語句,但程序上什么也不要做的場合,例如:

>;>;>; while True:
...       pass # Busy-wait for keyboard interrupt
...

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
10 [報告]
發(fā)表于 2005-05-31 16:54 |只看該作者

Python 指南

4.6 定義函數(shù)
我們可以編寫一個函數(shù)來生成有給定上界的菲波那契數(shù)列:

>;>;>; def fib(n):    # write Fibonacci series up to n
...     """rint a Fibonacci series up to n."""
...     a, b = 0, 1
...     while b < n:
...         print b,
...         a, b = b, a+b
...
>;>;>; # Now call the function we just defined:
... fib(2000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
關鍵字def 引入了一個函數(shù)定義。在其后必須跟有函數(shù)名和包括形式參數(shù)的圓括號。函數(shù)體語句從下一行開始,必須是縮進的。函數(shù)體的第一行可以是一個字符串值,這個字符串是該函數(shù)的 文檔字符串,也可稱作docstring。  

有些文檔字符串工具可以在線處理或打印文檔,或讓用戶交互的瀏覽代碼;在你的代碼中加入文檔字符串是一個好的作法,應該養(yǎng)成習慣。

調用函數(shù)時會為局部變量引入一個新的符號表。所有的局部變量都存儲在這個局部符號表中。引用參數(shù)時,會先從局部符號表中查找,然后是全局符號表,然后是內置命名表。因此,全局參數(shù)雖然可以被引用,但它們不能在函數(shù)中直接賦值(除非它們用global語句命名)。

函數(shù)引用的實際參數(shù)在函數(shù)調用時引入局部符號表,因此,實參總是傳值調用(這里的值總是一個對象引用,而不是該對象的值)。4.1 一個函數(shù)被另一個函數(shù)調用時,一個新的局部符號表在調用過程中被創(chuàng)建。

函數(shù)定義在當前符號表中引入函數(shù)名。作為用戶定義函數(shù),函數(shù)名有一個為解釋器認可的類型值。這個值可以賦給其它命名,使其能句做為一個函數(shù)來使用。這就像一個重命名機制:

>;>;>; fib
<function object at 10042ed0>;
>;>;>; f = fib
>;>;>; f(100)
1 1 2 3 5 8 13 21 34 55 89
你可能認為fib不是一個函數(shù)(function),而是一個過程(procedure)。Python和C一樣,過程只是一個沒有返回值的函數(shù)。實際上,從技術上講,過程也有一個返回值,雖然是一個不討人喜歡的。這個值被稱為 None (這是一個內置命名)。如果一個值只是None的話,通常解釋器不會寫一個None出來,如果你真想要看它的話,可以這樣做:

>;>;>; print fib(0)
None
以下示列演示了如何從函數(shù)中返回一個包含菲波那契數(shù)列的數(shù)值鏈表,而不是打印它:

>;>;>; def fib2(n): # return Fibonacci series up to n
...     """Return a list containing the Fibonacci series up to n."""
...     result = []
...     a, b = 0, 1
...     while b < n:
...         result.append(b)    # see below
...         a, b = b, a+b
...     return result
...
>;>;>; f100 = fib2(100)    # call it
>;>;>; f100                # write the result
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
和以前一樣,這個例子演示了一些新的Python功能:
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP