python學習筆記比較全(上)

--------------------------------------------------------


python學習筆記比較全(上)


python學習筆記比較全

複製代碼

注:本筆記基於python2.6而編輯,儘量的偏向3.x的語法

Python的特色

1.簡單

2.易學

3.免費、開源

4.高層語言: 封裝內存管理等

5.可移植性: 程序如果避免使用依賴於系統的特性,那麼無需修改就可以在任何平臺上運行

6.解釋性: 直接從源代碼運行程序,不再需要擔心如何編譯程序,使得程序更加易於移植。

7.面向對象: 支持面向過程的編程也支持面向對象的編程。

8.可擴展性: 需要保密或者高效的代碼,可以用C或C++編寫,然後在Python程序中使用它們。

9.可嵌入性: 可以把Python嵌入C/C++程序,從而向你的程序用戶提供腳本功能。

10.豐富的庫: 包括正則表達式、文檔生成、單元測試、線程、數據庫、網頁瀏覽器、CGI、FTP、

電子郵件、XML、XML-RPC、HTML、WAV文件、密碼系統、GUI(圖形用戶界面)、Tk和其他與系統有關的操作。

除了標準庫以外,還有許多其他高質量的庫,如wxPython、Twisted和Python圖像庫等等。

11.概括: Python確實是一種十分精彩又強大的語言。它合理地結合了高性能與使得編寫程序簡單有趣的特色。

12.規範的代碼: Python採用強制縮進的方式使得代碼具有極佳的可讀性。

Python 下載地址

http://www.python.org/download/

Python 安裝:

windows時,運行安裝文件之後,還需要配置環境變量,在環境變量的“Path”後面加上英文的分號及python安裝目錄

如:“;C:\\promg\\python2.6”

不配置環境變量的話,沒法在命令行直接使用python

有兩種使用Python運行你的程序的方式

1.使用交互式的帶提示符的解釋器

直接雙擊運行“python.exe”,在裡面輸入內容,如: print 'haha...'

2.使用源文件

在Python的安裝目錄下,建一個批處理(test.bat),寫入:

@echo off

python.exe test.py

pause

而“test.py”裡面的內容是需要執行的程序

Python命令行選項

選項 作用

-c cmd 在命令行直接執行python代碼。如python -c 'print "hello world"'。

-d 腳本編譯後從解釋器產生調試信息。同PYTHONDEBUG=1。

-E 忽略環境變量。

-h 顯示python命令行選項幫助信息。

-i 腳本執行後馬上進入交互命令行模式。同PYTHONINSPECT=1。

-O 在執行前對解釋器產生的字節碼進行優化。同 PYTHONOPTIMIZE=1。

-OO 在執行前對解釋器產生的字節碼進行優化,並刪除優化代碼中的嵌入式文檔字符串。

-Q arg 除法規則選項,-Qold(default),-Qwarn,-Qwarnall,-Qnew。

-S 解釋器不自動導入site.py模塊。

-t 當腳本的tab縮排格式不一致時產生警告。

-u 不緩衝stdin、stdout和stderr,默認是緩衝的。同PYTHONUNBUFFERED=1。

-v 產生每個模塊的信息。如果兩個-v選項,則產生更詳細的信息。同PYTHONVERBOSE=x。

-V 顯示Python的版本信息。

-W arg 出錯信息控制。(arg is action:message:category:module:lineno)

-x 忽略源文件的首行。要在多平臺上執行腳本時有用。

file 執行file裡的代碼。

- 從stdin裡讀取執行代碼。

easy_install

這是個很常用的python安裝工具

可以直接安裝ez_setup.py腳本(下載網址: http://peak.telecommunity.com/dist/ez_setup.py):

python ez_setup.py

windows 下的使用:

安裝:

下載: http://peak.telecommunity.com/dist/ez_setup.py

執行: python ez_setup.py

使用:

easy_install.exe -U %modal% # %modal% 是模塊名

linux 下:

安裝:

sudo apt-get install python-setuptools

或者:

wget -q http://peak.telecommunity.com/dist/ez_setup.py

sudo python ez_setup.py

使用:

sudo easy_install 模塊名

安裝完後,最好確保easy_install所在目錄已經被加到PATH環境變量裡:

Windows: C:\\Python25\\Scripts

Linux: /usr/local/bin

不能使用easy_install的特殊情況:

a、安裝默認版本的MySQL-python會報錯,需要指定版本如下:easy_install "MySQL-python==1.2.2"

b、有些包直接easy_install會失敗,需要自行下載安裝:

wxpython,pil要下載exe安裝程序

robotide因為在pypi上找不到,要下載後再easy_install

通過easy_install安裝軟件,相關安裝信息會保存到easy-install.pth文件裡,路徑類似如下形式:

Windows:C:\\Python25\\Lib\\site-packages\\easy-install.pth

Linux:/usr/local/lib/python25/site-packages/easy-install.pth

如果想刪除通過easy_install安裝的軟件包,比如說:MySQL-python,可以執行命令:

easy_install -m MySQL-python

此操作會從easy-install.pth文件裡把MySQL-python的相關信息抹去,剩下的egg文件,你可以手動刪除。

版本問題

python3.0版本較之前的有很大變動,而且不向下兼容。

Python 2.6作為一個過渡版本,基本使用了Python 2.x的語法和庫,同時考慮了向Python 3.0的遷移。即2.6版本兼容2.x和3.0的語法

Python 2.6保持了對之前版本的全兼容,而且還包含了Python 3.0的新玩意(一些新特性需要通過“from __future__ import”來啟用)。

如,在Python2.6要使用3.0的打印,得寫上“ from __future__ import print_function”

基於早期Python版本而能正常運行於Python 2.6並無警告的程序可以通過一個2 to 3的轉換工具無縫遷移到Python 3.0。

部分函數和語句的改變

最引人注意的改變是print語句沒有了,取而代之的是print函數

同樣的還有exec語句,已經改為exec()函數。去除了<>,全部改用!=。

在python2.x版本中

#!/usr/bin/env python

# 或者上句寫: #!/usr/bin/python

print "Hello, world!"

或者:

import sys

sys.stdout.write("Hello, world\\n")

在python3.x中

print('Hello world!')

用迭代器來替代列表

一些知名的API將不再返回列表。

而字典的dict.iterkeys()、dict.itervalues()和dict.iteritems()方法將會移除,而你可以使用.keys()、.values()和.items(),它們會返回更輕量級的、類似於集合的容器對象,而不是返回一個列表來複制鍵值。

這樣做的優點是,可以直接在鍵和條目上進行集合操作,而不需要再複製一次。

整型數

移除了含糊的除法符號('/'),而只返回浮點數。

在以前的版本中,如果參數是int或者是long的話,就會返回相除後結果的向下取整(floor),而如果參數是float或者是complex的話,那麼就會返回相除後結果的一個恰當的近似。

在2.6版本中可以通過from __future__ import division來啟用這項特性。

python2 to python3 問題

1.print 語句

2.x 3.x 說明

① print print() # 輸出一個空白行

② print 1 print(1) # 輸出一個單獨的值

③ print 1, 2 print(1, 2) # 輸出多個值,以空格分割

④ print 1, 2, print(1, 2, end=' ') # 輸出時取消在末尾輸出回車符。

⑤ print >>sys.stderr, 1, 2 print(1, 2, file=sys.stderr) # 把輸出重定向到一個管道

2.被重命名或者重新組織的模塊

1)http

在Python 3裡,幾個相關的HTTP模塊被組合成一個單獨的包,即http。

2.x 3.x

① import httplib import http.client # http.client 模塊實現了一個底層的庫,可以用來請求HTTP資源,解析HTTP響應。

② import Cookie import http.cookies # http.cookies 模塊提供一個蟒樣的(Pythonic)接口來獲取通過HTTP頭部(HTTP header)Set-Cookie發送的cookies

③ import cookielib import http.cookiejar # 常用的流行的瀏覽器會把cookies以文件形式存放在磁盤上,http.cookiejar 模塊可以操作這些文件。

④ import BaseHTTPServer import http.server # http.server 模塊實現了一個基本的HTTP服務器

import SimpleHTTPServer

import CGIHttpServer

2)urllib

Python 2有一些用來分析,編碼和獲取URL的模塊,但是這些模塊就像老鼠窩一樣相互重疊。在Python 3裡,這些模塊被重構、組合成了一個單獨的包,即urllib。

2.x 3.x

① import urllib import urllib.request, urllib.parse, urllib.error

② import urllib2 import urllib.request, urllib.error

③ import urlparse import urllib.parse

④ import robotparser import urllib.robotparser

⑤ from urllib import FancyURLopener from urllib.request import FancyURLopener

from urllib import urlencode from urllib.parse import urlencode

⑥ from urllib2 import Request from urllib.request import Request

from urllib2 import HTTPError from urllib.error import HTTPError

以前,Python 2裡的 urllib 模塊有各種各樣的函數,包括用來獲取數據的 urlopen(),還有用來將URL分割成其組成部分的 splittype(), splithost()和 splituser()函數。

在python3的 urllib 包裡,這些函數被組織得更有邏輯性。2to3將會修改這些函數的調用以適應新的命名方案。

在Python 3裡,以前的 urllib2 模塊被併入了 urllib 包。同時,以 urllib2 裡各種你最喜愛的東西將會一個不缺地出現在Python 3的 urllib 模塊裡,比如 build_opener()方法, Request 對象, HTTPBasicAuthHandler 和 friends 。

Python 3裡的 urllib.parse 模塊包含了原來Python 2裡 urlparse 模塊所有的解析函數。

urllib.robotparse 模塊解析 robots.txt 文件。

處理HTTP重定向和其他狀態碼的 FancyURLopener 類在Python 3裡的 urllib.request 模塊裡依然有效。 urlencode()函數已經被轉移到了 urllib.parse 裡。

Request 對象在 urllib.request 裡依然有效,但是像HTTPError這樣的常量已經被轉移到了 urllib.error 裡。

3)dbm

所有的DBM克隆(DBM clone)現在在單獨的一個包裡,即dbm。如果你需要其中某個特定的變體,比如GNU DBM,你可以導入dbm包中合適的模塊。

2.x 3.x

① import dbm import dbm.ndbm

② import gdbm import dbm.gnu

③ import dbhash import dbm.bsd

④ import dumbdbm import dbm.dumb

⑤ import anydbm import dbm

import whichdb

4)xmlrpc

XML-RPC是一個通過HTTP協議執行遠程RPC調用的輕重級方法。一些XML-RPC客戶端和XML-RPC服務端的實現庫現在被組合到了獨立的包,即xmlrpc。

2.x 3.x

① import xmlrpclib import xmlrpc.client

② import DocXMLRPCServer import xmlrpc.server

import SimpleXMLRPCServer

5)其他模塊

2.x 3.x

① try: import io

import cStringIO as StringIO # 在Python 2裡,你通常會這樣做,首先嚐試把cStringIO導入作為StringIO的替代,如果失敗了,再導入StringIO。

except ImportError: # 不要在Python 3裡這樣做;io模塊會幫你處理好這件事情。它會找出可用的最快實現方法,然後自動使用它。

import StringIO

② try: import pickle

import cPickle as pickle # 在Python 2裡,導入最快的pickle實現也與上邊 io 相似。在Python 3裡,pickle模塊會自動為你處理,所以不要再這樣做。

except ImportError:

import pickle

③ import __builtin__ import builtins

④ import copy_reg import copyreg # copyreg模塊為用C語言定義的用戶自定義類型添加了pickle模塊的支持。

⑤ import Queue import queue # queue模塊實現一個生產者消費者隊列(multi-producer, multi-consumer queue)。

⑥ import SocketServer import socketserver # socketserver模塊為實現各種socket server提供了通用基礎類。

⑦ import ConfigParser import configparser # configparser模塊用來解析INI-style配置文件。

⑧ import repr import reprlib # reprlib 模塊重新實現了內置函數 repr(),並添加了對字符串表示被截斷前長度的控制。

⑨ import commands import subprocess # subprocess 模塊允許你創建子進程,連接到他們的管道,然後獲取他們的返回值。

builtins模塊包含了在整個Python語言裡都會使用的全局函數,類和常量。重新定義builtins模塊裡的某個函數意味著在每處都重定義了這個全局函數。這聽起來很強大,但是同時也是很可怕的。

註釋

“#”後面的內容

數據類型

共4種: 整數、長整數、浮點數和複數。

1.整數,如:2

2.長整數,如:22L # 長整數不過是大一些的整數。Python 3已經取消這種類型,被int取代了。

3.浮點數,如:3.23 和 52.3E-4 # E標記表示10的冪。在這裡,52.3E-4表示52.3 * 10-4。

4.複數,如:(-5+4j) 和 (2.3-4.6j)

在Python 2和Python 3的變化:

1.八進制(octal)數:

Python 2: x = 0755 # 0開頭

Python 3: x = 0o755 # 0o開頭

2.long 類型

Python 2有為非浮點數準備的 int 和 long 類型。 int 類型的最大值不能超過 sys.maxint,而且這個最大值是平臺相關的。

整數可以通過在數字的末尾附上一個L來定義長整型,顯然,它比 int 類型表示的數字範圍更大。

Python 3裡,只有一種整數類型 int,大多數情況下,它很像Python 2裡的長整型。

由於已經不存在兩種類型的整數,所以就沒有必要使用特殊的語法去區別他們。

由於 long 類型在Python 3的取消,引起以下改變

Python 2 Python 3 說明

① x = 1000000000000L x = 1000000000000 # 十進制的普通整數

② x = 0xFFFFFFFFFFFFL x = 0xFFFFFFFFFFFF # 十六進制的普通整數

③ long(x) int(x) # long()函數沒有了。可以使用int()函數強制轉換一個變量到整型。

④ type(x) is long type(x) is int # 檢查一個變量是否是整型

⑤ isinstance(x, long) isinstance(x, int) # 也可以使用 isinstance()函數來檢查數據類型

3.sys.maxint(sys.maxsize)

由於長整型和整型被整合在一起了, sys.maxint常量不再精確。

因為這個值對於檢測特定平臺的能力還是有用處的,所以它被Python 3保留,並且重命名為 sys.maxsize。

Python 2 Python 3

① from sys import maxint from sys import maxsize # maxint變成了maxsize。

② a_function(sys.maxint) a_function(sys.maxsize) # 所有的sys.maxint都變成了sys.maxsize。

int 是 types.IntType 的代名詞

print(id(int)) # 打印如:505210872

import types;print(id(types.IntType)) # 打印如:505210872

標識符的命名

變量是標識符的例子。 標識符 是用來標識 某樣東西 的名字。在命名標識符的時候,你要遵循這些規則:

1.標識符的第一個字符必須是字母表中的字母(大寫或小寫)或者一個下劃線(‘_’)。

2.標識符名稱的其他部分可以由字母(大寫或小寫)、下劃線(‘_’)或數字(0-9)組成。

3.標識符名稱是對大小寫敏感的。例如,myname和myName不是一個標識符。

有效 標識符名稱的例子有i、__my_name、name_23和a1b2_c3。

無效 標識符名稱的例子有2things、this is spaced out和my-name。

邏輯行與物理行

物理行是在編寫程序時文本的一行。邏輯行是程序的一個語句。

Python假定每個 物理行 對應一個 邏輯行 。 他希望每行都只使用一個語句,這樣使得代碼更加易讀。

1. 如果你想要在一個物理行中使用多於一個邏輯行,那麼你需要使用分號(;)來特別地標明這種用法。

分號表示一個邏輯行/語句的結束。

如: i = 5; print i; # 強烈建議你堅持在每個物理行只寫一句邏輯行。 讓程序見不到分號,而更容易閱讀。

2. 明確的行連接

在多個物理行中寫一個邏輯行,行結尾用反斜槓標明

如: s = 'This is a string. \\

This continues the string.'

# 上面這兩行是一個邏輯行,打印是: This is a string. This continues the string.

print \\

i

# 上面這兩行也是一個邏輯行, 等同於: print i

3. 暗示的行連接

在多個物理行中寫一個邏輯行,行結尾不需要使用反斜槓標明。

這種情況出現在邏輯行中使用了圓括號、方括號或波形括號的時候。

4. 縮進

行首的空白是重要的。在邏輯行首的空白(空格和tab符)用來決定邏輯行的縮進層次,從而用來決定語句的分組。

同一層次的語句必須有相同的縮進。每一組這樣的語句稱為一個塊。

不要混合使用tab符和空格來縮進,因為這在跨越不同的平臺的時候,無法正常工作。強烈建議只使用一種風格來縮進。

語法規則

1.縮進規則

一個模塊的界限,完全是由每行的首字符在這一行的位置來決定的(而不是花括號{})。這一點曾經引起過爭議。

不過不可否認的是,通過強制程序員們縮進,Python確實使得程序更加清晰和美觀。

在邏輯行首的空白(空格和tab)用來決定邏輯行的縮進層次,從而用來決定語句的分組。錯誤的縮進會引發錯誤。

注意: 強制縮進的問題,最常見的情況是tab符和空格的混用會導致錯誤,而這是用肉眼無法分別的。

2.變量沒有類型

使用變量時只需要給它們賦值。 不需要聲明或定義數據類型。

3.單語句塊

如果你的語句塊只包含一句語句,那麼你可以在條件語句或循環語句的同一行指明它。如: if 1!=2: print('Yes')

強烈建議不要使用這種縮略方法。這會破壞Python清晰美觀的代碼風格,違背設計者的初衷。

如果是在Python解釋器輸入,它的把提示符會改變為...以表示語句還沒有結束。這時按回車鍵用來確認語句已經完整了。然後,Python完成整個語句的執行,並且返回原來的提示符來等待下一句輸入。

運算符與表達式:

運算符

運算符 名稱 說明

+ 加 兩個對象相加,也可以字符串拼接

- 減 得到負數或是一個數減去另一個數

* 乘 兩個數相乘 或是返回一個被重複若干次的字符串

** 冪 返回x的y次冪

/ 除 x除以y

// 取整除 返回商的整數部分

% 取模 返回除法的餘數 # 8%3得到2。 -25.5%2.25得到1.5

<< 左移 把一個數的二進制向左移一定數目 # 2 << 2得到8

>> 右移 把一個數的二進制向右移一定數目 # 11 >> 1得到5

& 按位與 數的按位與 # 5 & 3得到1。

| 按位或 數的按位或 # 5 | 3得到7。

^ 按位異或 數的按位異或 # 5 ^ 3得到6

~ 按位翻轉 x的按位翻轉是-(x+1) # ~5得到6。

< 小於 返回x是否小於y

> 大於 返回x是否大於y

<= 小於等於 返回x是否小於等於y

>= 大於等於 返回x是否大於等於y

== 等於 比較對象是否相等

!= 不等於 比較兩個對象是否不相等(python3刪除了“<>”符號)

not 布爾“非” 如果x為True,返回False。如果x為False,它返回True。 # x = True; not x返回False。

and 布爾“與” 如果x為False,x and y返回False,否則它返回y的計算值。 # x=False; y=True; x and y返回False。

or 布爾“或” 如果x是True,它返回True,否則它返回y的計算值。# x = True; y = False; x or y返回True。

in, not in 成員測試 (由類裡面的 __contains__ 函數指定返回值)

is, is not 同性測試 (兩值的 is 運算是判斷引用,與“==”的比較有所不同)

說明:

1.加號“+”:有數學相加,也有字符串拼接作用,注意:不能字符串和數字相加。如: 3 + 5得到8; 'a' + 'b'得到'ab'。

2.乘號“*”:兩個數相乘,也可以把字符串重複拼接若干次,如: 2 * 3得到6; 'la' * 3得到'lalala'。

3.冪“**” :這種寫法,其他語言好像沒見到過,如: 3 ** 4得到81(即3 * 3 * 3 * 3)

4.除號“/”:整數的除法得到整數結果,浮點數的得到浮點數,如:4/3得到1(返回相除後結果的向下取整(floor)); 4.0/3或4/3.0得到1.333...

注意:Python 3.0開始,移除了含糊的除法符號('/'),而只返回浮點數。如:4/3得到1.333...

5.取整除“//”:將兩數相除,然後對結果取整,如: 7 // 3得到2; 4 // 3.0得到1.0

6.比較運算符:所有比較運算符返回1表示真,返回0表示假。這分別與特殊的變量 True 和 False 等價。注意大小寫。

如果兩個操作數都是數字,它們首先被轉換為一個共同的類型(如double)。否則,它總是返回 False 。

5 < 3返回0(即False); 而3 < 5返回1(即True)。比較可以被任意連接: 3 < 5 < 7返回True。

大於、小於、小於等於、大於等於時:數字跟數字可以比較,字符串跟字符串可以比較,但數字不能跟字符串比較。

等於、不等於時: 數字跟數字可以比較,字符串跟字符串可以比較,數字跟字符串比較返回 False (表示不相等)

等於: Python 使用“==”來做比較,用“=”來賦值。但不允許內嵌的賦值,所以不會出現你本以為在做比較而意外的寫成賦值的情況。

7.布爾運算: and 和 or 都是短路運算,沒有非短路運算的運算符。

短路運算:當前面一個表達式可以決定結果時,後面的語句不用再判斷。非短路運算時,還照樣判斷後面的。

注意:在 and or 運算中,空字符串'',數字0,空列表[],空字典{},空元組(), None,在邏輯運算中都被當作假來處理。

8.and 和 or 的特殊用法:

由於語言的鬆散性,用 and 和 or 在賦值語句時有判斷作用。

1) or 用在賦值語句裡,返回第一個邏輯為真的值, 沒有邏輯為真的返回最後一個。(如下這寫法比較常用)

如:ss = False or None or 0 or '' or -1 or 'sss'; print(ss) # 打印:-1 (-1作if判斷時返回 True)

設定預設值的寫法: edittype = edittype or "text"; # 如果 edittype 之前有值,則取之前的值; 之前為空,則取默認值

2) and 用在賦值語句裡,與 or 剛好相反,返回第一個邏輯為假的值, 沒有邏輯為假的返回最後一個。

如: a = 0 and 1; print(a) # 打印: 0

a = 2 and 1; print(a) # 打印: 1

應用: valid = True; valid = valid and checkLength(name, 16); valid = valid and checkLength(name, 16); # 如果前面的驗證不通過,則後面的不再驗證

簡便的記憶是: and 偏 False, or 偏 True

要理解 and 和 or 的這種寫法,得考慮到它的短路運算特性。它是在做邏輯判斷,但返回的是前或後一個的值,而不是返回 True 或 False 。

9.三目運算符:

Python 沒有三目運算符“cond ? a : b”,但可以使用 and 和 or 來代替(需理解前面的 and 和 or 的特殊用法),如下:

1) c = cond and a or b # 這多數情況下是正確的,但當 a 是空字符串''、數字0等邏輯運算為假的情況下會出錯。

2) c = (cond and [a] or [b])[0] # 即使 a或者b為一個邏輯假的值,將他放入集合中後,就為真了,也就是[False] [None]都不為假。

3) c = (b, a)[cond and 1 or 0] # 注意 a和b的位置是顛倒的,將表達式結果轉成1和0來作為元組下標而選擇結果。

4) c = a if cond else b # 使用 if else 寫條件(python特有的寫法,建議使用,前3種寫法難理解也容易出錯)

10.自增,自減:

Python 沒有“++”和“--”兩個語法,自增自減時只能寫: i = i + 1 或者 i += 1, 不能用 i++

這在一定程度上避免出錯,因為新手經常搞錯“++”放前面還是放後面; 但這也導致 for 循環的寫法與其它語言很不同

11.switch/case 語句

Python現在不支持這語句,但可以用 range(N) 生成一個 列表

12.一次性的多比較

“ if (0 < n < 4000) ”這種寫法在python是允許的,它等價於“ if ((0 < n) and (n < 4000)) ”但前者更適合閱讀。

運算符優先級

下面這個表給出Python的運算符優先級,從最低的優先級(最鬆散地結合)到最高的優先級(最緊密地結合)。

在一個表達式中,Python會首先計算下表中較下面的運算符,然後在計算列在下表上部的運算符。

在下表中列在同一行的運算符具有 相同優先級 。例如,+和-有相同的優先級。

建議使用圓括號來分組運算符和操作數,以便能夠明確地指出運算的先後順序,使程序儘可能地易讀。例如,2 + (3 * 4)顯然比2 + 3 * 4清晰。

運算符 描述

lambda Lambda表達式

or 布爾“或”

and 布爾“與”

not x 布爾“非”

in,not in 成員測試

is,is not 同一性測試

,>=,!=,== 比較

| 按位或

^ 按位異或

& 按位與

<> 移位

+,- 加法與減法

*,/,% 乘法、除法與取餘

+x,-x 正負號

~x 按位翻轉

** 指數

x.attribute 屬性參考

x[index] 下標

x[index:index] 尋址段

f(arguments...) 函數調用

(experession,...) 綁定或元組顯示

[expression,...] 列表顯示

{key:datum,...} 字典顯示

'expression,...' 字符串轉換

計算順序

默認地,運算符優先級表決定了哪個運算符在別的運算符之前計算。然而,如果要改變它們的計算順序,得使用圓括號。

例如,你想要在一個表達式中讓加法在乘法之前計算,那麼你就得寫成類似(2 + 3) * 4的樣子。

結合規律

運算符通常由左向右結合,即具有相同優先級的運算符按照從左向右的順序計算。例如,2 + 3 + 4被計算成(2 + 3) + 4。

一些如賦值運算符那樣的運算符是由右向左結合的,即a = b + c被處理為a = (b + c)。

對象

Python 將 "一切皆對象" 貫徹得非常徹底,不區分什麼 "值類型" 和 "引用類型"。所謂變量,實質就是一個通用類型指針 (PyObject*),它僅僅負責指路,至於目標是誰,一概不管。

Python Object 對象的自身結構了。任何對象,就算一個最簡單的整數,它的頭部都會擁有 2 個特殊的附加信息,分別是:"引用計數" 和 "類型 (type) 指針" 。前者指示 GC 何時回收,而後者標明瞭對象的身份,如此我們就可以在運行期動態執行對象成員調用。

連同附加頭,一個 "普通" 的整數起碼得 12 字節:

a = 8; import sys; print(sys.getsizeof(a)) # 打印: 12 (python3.2中,打印的是14)

print(sys.getsizeof(None)) # 打印: 8

字符串

1.使用單引號“'”引起來: 'Quote me on this'

2.使用雙引號“"”引起來: "What's your name?"

3.使用三引號('''或"""): 可以指示一個多行的字符串。你可以在三引號中自由的使用單引號和雙引號。 /'''

如:

"""This is a multi-line string. This is the first line.

"What's your name?," I asked.

He said "Bond, James Bond."

"""

4.轉義符“\\”

\\\\ 指示反斜槓本身

\\' 指示單引號

\" 指示雙引號

注意: 行末的單獨一個反斜槓表示字符串在下一行繼續,而不是開始一個新的行。

5.自然字符串

自然字符串通過給字符串加上前綴r或R來指定,取消轉義符的功能。例如: r"Newlines are indicated by \\n"。

三引號的字符串也可以同樣用法,如:R'''Newlines are indicated by \\n'''

6.Unicode字符串

Python允許你處理Unicode文本(超過拉丁文字範圍的)——只需要在字符串前加上前綴u或U。

例如,u"This is a Unicode string.哈哈.."。(Python3.x之後不需要這樣了,可以直接寫中文;而這樣寫會報錯)

Python 3.0開始對unicode全面支持,所有的文本(str)都是Unicode的;並引入了一個叫做bytes的新類型來處理字節序列。而編碼過的Unicode會以二進制的數據來表示。

因為在2.x的世界裡,大量的bug都是因為已編碼的文本和未編碼的文本混雜在一起而產生的。

7.按字面意義級連字符串

如果你把兩個字符串按字面意義相鄰放著,他們會被Python自動級連。

例如,"What's" ' your name?'會被自動轉為"What's your name?"。

即是說,兩個字符串放在一起,會有字符拼接的效果。加號“+”也有字符拼接的效果。

8.字符串拼接

可以使用“str1.__add__(str2)”或者“str1 + str2”或者直接兩個字符串放一起,來拼接字符串

但字符串與其它類型拼接時,得先把其它類型轉成字符串類型,否則會出錯。如“str1 + 2”就會出錯,需要“str1 + str(2)”

9.格式化

使用“%控制符”可以格式化字符串,非常方便。如: str1 = "Swaroop's age is %d, weight is %f" % (5, 65.5)

“%(name)控制符”可按名稱傳參數(不寫名稱是按位置傳參數),如: str = "%(row)d Rows is %(value)s" % { 'value': 'kkkk', 'row': 22 }

格式化的符號用法參考下面的“字符串格式化控制表”

另外,string.format()函數也可以格式化字符串

例如:'subtracting {0}, adding {1}'.format(1, 'haha') # 參數講對應到“{number}”的位置上

10.字符串序列(索引和切片)

字符串可以使用下標來獲取字符串中某個項目,以及截取字符串。詳情參考“序列”

用法如: name = 'swaroop'; name[1]; name[1:3]; name[1:-1]

11.str(anything)函數和 unicode(anything)函數

Python 2有兩個全局函數可以把對象強制轉換成字符串:unicode()把對象轉換成Unicode字符串,還有 str()把對象轉換為非Unicode字符串。

Python 3只有一種字符串類型,Unicode字符串,所以 str()函數即可完成所有的功能。(unicode()函數在Python 3裡不再存在了。)

另外:

沒有專門的char數據類型,確實沒有需要有這個類型。

單引號和雙引號字符串是完全相同的——它們沒有在任何方面有不同。

正則表達式: 一定要用自然字符串處理正則表達式。否則會需要使用很多的反斜槓。

使用 help(str) 可查看字符串對象定義的所有方法及屬性。

由於百分號有特殊作用,所以字符串裡面要用百分號的話需要使用“%%”,如:"select * from my_table where name like '%%測試%%'"

字符串格式化控制:(未參考幫助文檔,只是個人猜測)

轉義符 (Escape Sequence):

\\ddd 1到3位8進制數指定Unicode字符輸出(如:“\\127”顯示“W”)

\\\\uxxxx 1到4位16進制數指定Unicode字符輸出(Python3.x開始支持此寫法,如: \\\\u54C8 顯示“哈”字)

\\\\xhh 16進制數指定Unicode字符輸出(如:“\\\\xe5\\\\x93\\\\x88”顯示“哈”)

\\\\ \\

\\ \\ (單獨的一個斜槓也顯示斜槓,即不後接有轉移作用的字符時,作為斜槓使用)

\\' '

\" "

\\a 字符:0x07 響鈴(ASCII控制字符)

\\b 字符:0x08 退格(光標向左走一格)(ASCII控制字符)

\\f 字符:0x0c Formfeed(FF)(走紙轉頁,換頁)(ASCII控制字符)

\\n 字符:0x0a 換行(ASCII控制字符)

\\N{name} Unicode字符 只能針對Unicode

\\r 字符:0x0d 回車

\\t 字符:0x09 跳格(tab符號),水平製表符

\\v 字符:0x0b 垂直製表符

%% %

%d 輸出10進制整數,只能是數字類型,輸出字符串類型會出錯;浮點類型的數字將被取整(直接刪除小數部分)。

%f,%F 以10進制輸出浮點數,只能是數字類型,輸出字符串類型會出錯。

%e,%E 以科學計數法輸出10進制的浮點數,大小寫的“e”反應在顯示時科學計數法的“e/E”上,只能是數字類型。

%a Python3.0開始支持此寫法,原樣輸出結果,字符串類型會加上單引號引起來。

%o (字母o)以8進制整數方式輸出,只能是數字類型;浮點類型的數字將被取整(直接刪除小數部分)。

%x,%X 將數字以16進制方式輸出,只能是數字類型;浮點類型的數字將被取整(直接刪除小數部分)。

%s 將字符串格式化輸出(可輸出任何類型)

%c 以字符方式輸出,提供的類型必須是 char 或 int 。

注:布爾類型的 True 或 False,用數字類型輸出是 1或0,字符串輸出是 True 或 False。

字符串轉換成數字

float(str) 轉換成浮點數,如, float("1e-1") 結果:0.1

int(str) 轉換成整數,如, int("12") 結果:12

int(str,base) 轉換成base進制的整數,如, int("11",2) 轉換成2進制的整數,結果:3

long(str) 轉換成長整數,Python3取消此語法,如, long("12L") 結果:12L

long(str,base) 轉換成base進制的長整數,Python3取消此語法,如, long("11L",2) 結果:3L

字符串用例

name = 'Swaroop' # This is a string object

# 檢查字符串的開頭部分

if name.startswith('Swa'): # 類似函數如 endswith()

print('Yes, the string starts with "Swa"')

# 檢查是否包含有此內容

if 'a' in name:

print('Yes, it contains the string "a"')

# 找出給定字符串的位置,找不到則返回-1

if name.find('war') != -1:

print('Yes, it contains the string "war"', 's')

# join()函數把列表拼接起來

delimiter = '; '

mylist = ['Brazil', 'Russia', 'India', 'China']

print(delimiter.join(mylist)) # 打印: Brazil; Russia; India; China

# 大小寫轉換

print("THIS IS TEST".lower()) # 轉換成小寫,打印:this is test

print("this is test".upper()) # 轉換成大寫,打印:THIS IS TEST

print("This Is Test".swapcase()) # 大小寫互換,打印:tHIS iS tEST

print(" This Is Test ".strip()) # 去掉前後空格,打印:This Is Test

# 常用 string 函數

replace(string,old,new[,maxsplit])

字符串的替換函數,把字符串中的old替換成new。默認是把string中所有的old值替換成new值,如果給出maxsplit值,還可控制替換的個數,如果maxsplit為1,則只替換第一個old值。

如: a="11223344";print(string.replace(a,"1","one")) # 打印: oneone2223344

print(string.replace(a,"1","one",1)) # 打印: one12223344

b = "dfsdf dfsdfsd dfsdf ";print(a.replace(' ', '')) # 打印: dfsdfdfsdfsddfsdf

capitalize(string)

該函數可把字符串的首個字符替換成大字。

如: import string; print(string.capitalize("python")) # 打印: Python

split(string,sep=None,maxsplit=-1)

從string字符串中返回一個列表,以sep的值為分界符。

如: import string; ip="192.168.3.3"; print(string.split(ip,'.')) # 打印: ['192', '168', '3', '3']

控制檯輸入

使用 raw_input()函數 或者 input()函數 能夠很方便的控從制臺讀入數據,得到的是字符串。

Python2.x時,raw_input()和 input()的區別:

當輸入為純數字時:input()返回的是數值類型,如:int,float; raw_input()返回的是字符串類型

input()會計算在字符串中的數字表達式,而 raw_input()不會。如輸入“57+3”: input()得到整數60,raw_input()得到字符串'57+3'

注:Python3.0將 raw_input()函數去除了,而用 input() 取代它的功能。另外,input()獲取的字符串會包括結尾的換行符。

例:(此處是Python2.6的寫法,3.x時應該把 raw_input() 改成 input())

1.輸入字符串

nID = raw_input("Input your id plz:\\n"); print('your id is %s' % (nID))

2.輸入整數

nAge = int(raw_input("input your age plz:\\n")); print('your age is %d\\n' % nAge)

3.輸入浮點型

fWeight = float(raw_input("input your weight:\\n")); print('your weight is %f' % fWeight)

4.輸入16進制數據

nHex = int(raw_input('input hex value(like 0x20):\\n'),16); print('nHex = %x,nOct = %d\\n' %(nHex,nHex))

5.輸入8進制數據

nOct = int(raw_input('input oct value(like 020):\\n'),8); print('nOct = %o,nDec = %d\\n' % (nOct,nOct))

注:打印字符串時,“%”作為特殊符號,兩個百分號才能打印出一個百分號

Python 2 與 Python 3 的比較

Python 2 Python 3

① raw_input() input() # 最簡單的形式,raw_input()被替換成input()。

② raw_input('prompt') input('prompt') # 可以指定一個提示符作為參數

③ input() eval(input()) # 如果想要請求用戶輸入一個Python表達式,計算結果

控制流:

if 語句

寫法: if ... elif ... else ... # if後面不用圓括號

注:在Python中沒有switch語句。你可以使用 if..elif..else 語句來完成同樣的工作(在某些場合,使用字典會更加快捷。)

在C/C++裡面可以使用 else if ,但這裡不行,得寫成: else :\\n\\t if,故此增加關鍵字 elif

例:

number = 23

# int是一個類,不過這裡它只是把一個字符串轉換為一個整數(假設這個字符串含有一個有效的整數文本信息)。

guess = int(raw_input('Enter an integer : '))

if guess == number:

print('Congratulations, you guessed it.')

elif guess < number:

print('No, it is a little higher than that') # Another block

else:

print('No, it is a little lower than that')

while 語句

只要條件為真,while語句允許你重複執行一塊語句。

注:while語句有一個可選的else從句。else塊事實上是多餘的,因為可以把其中的語句跟在while語句裡面。

例:

number = 23

running = True

while running:

guess = int(raw_input('Enter an integer : '))

if guess == number:

print('Congratulations, you guessed it.')

running = False # this causes the while loop to stop

elif guess < number:

print('No, it is a little higher than that')

else:

print('No, it is a little lower than that')

else:

# Do anything else you want to do here

print('The while loop is over.')

for 循環

for..in 是另外一個循環語句,它在一序列的對象上 遞歸 即逐一使用隊列中的每個項目。

else 部分是可選的。如果包含 else,它總是在 for 循環結束後執行一次,除非遇到 break 語句。

例:

for i in range(1, 5):

print(i)

else:

print('The for loop is over')

# 打印結果: 1 至 4 以及 else 的內容

# range(1,5)給出序列[1, 2, 3, 4]。range默認步長為1,第三個參數是步長。如,range(1,5,2)給出[1,3]。

# 記住,range包含第一個數,但不包含第二個數。

注:

Python的 for 循環從根本上不同於C/C++的 for 循環。類似 foreach 循環。

在C/C++中,如果你想要寫 for (int i = 0; i < 5; i++),那麼用Python,你寫成 for i in range(0,5)。

# 範例:九九乘法表

# 由於Python2 與Python3的 print 語法不相同,改用string來打印,保證兩個版本的輸出結果相同。

str = ''

for i in range(1,10):

for j in range(1, i+1):

str += ('%d * %d = %d \\t' % (j, i, i*j))

str += '\\n'

print(str)

break 語句

break 語句是用來 終止 循環語句的,即哪怕循環條件沒有稱為 False 或序列還沒有被完全遞歸,也停止執行循環語句。

一個重要的註釋是,如果你從 for 或 while 循環中 終止 ,任何對應的循環 else 塊將不執行。


分享到:


相關文章: