Python學習指南

學習python書籍&資料:python

1. Python v2.7.5 documentationios

2. [Python參考手冊(第4版)].(美)比茲利.掃描版.pdf程序員

3. [Python技術手冊(第2版)].(美)馬特利.掃描版.pdfgolang

4. Python標準庫.pdf算法

5. [Python.Unix和Linux系統管理指南].(美)基弗特.掃描版.pdf
---------------------------------------express

設計目標:編程

    grep-->sed-->awk-->perl-->python, 提供更方便的腳本語言.設計模式

運行機制:數據結構

    一種解釋型的腳本語言. 所謂解釋型語言, 都是先將源碼編譯成中間字節碼, 中間字節碼再在虛擬機上運行. 有別於編譯型語言, 直接將源碼編譯成本地機器碼運行.閉包

語言特點:

    語法比perl簡單, 支持面向對象

語法類庫:

1. 字符集

    Python源碼文件默認是Latin-1字符集, 可以使用編碼註釋:#coding:UTF-8指定字符編碼. 至於虛擬機運行時字符集, 需用sys.setdefaultencoding()函數. 如下是python程序的起式:

          #coding:utf-8

from __future__ import(absolute_import, generators, unicode_literals, print_function, nested_scopes, with_statement)

import sys

if sys.getdefaultencoding!='utf-8':

reload(sys)

sys.setdefaultencoding( "utf-8" )

print("這是一個測試")

2. 詞彙

    (1)Keyword

        Python的關鍵字分類:

            and                del            from            nonlocal    try

            as                   elif            global         not             while

            assert             else           if                 or                with

            break             except       import        pass            yield

            class               exec          in                print

            continue        finally       is                 raise

            def                 for             lambda       return

        聲明引入: class, def, lambda, global, nonlocal, import-as, from-import-as, with-as

        控制語句: 

            條件選擇: if-elif-else, 

            循環迭代: while-else, for-in-else

            跳轉中斷: break, continue, return, raise. 不支持帶標籤.

            異常捕獲: try-except-else-finally 

        運算符:

            邏輯關係: not, and, or, in, is

            特殊操做: assert, exec, pass, print, yield

    (2)Identifier

        Python的標識符: 由字母,數字,下劃線_組成, 而且不能數字開頭, 不能是關鍵字. 其中下劃線打頭具備特殊含義:

        _在交互式環境表示最後表達式的值.

        包私有模塊在__init__.py中的__all__不聲明.

        模塊私有變量以單下劃線打頭.

        類私有變量以雙下劃線打頭, 由編譯器自動轉成__classame__fieldname.

    (3)Literal

        表示數據:

            None類型: None

            Number類型:

                bool: True, False

                int: 8進制0前綴, 10進制無前綴, 16進制0x或0X前綴.

                long: l或L後綴

                float: 小數形式, 指數形式.        

                complex: R+Mj 或 R+MJ

            Seq類型:

                str: base string單引, 雙引或三引括住的字符序列. raw string是r前綴, 且不能以奇數個/結尾. unicode string是u前綴. 

                        標準的轉義字符:

                        \    續行符

                        \\    斜槓

                        \'    單引

                        \"    雙引

                        \a    bell

                        \b    退格

                        \e    Escape

                        \0    Null(空值)

                        \n    換行

                        \r    回車

                        \v    垂直製表

                        \t    水平製表

                        \f    換頁

                        \000    三位8進製表示的ASCII字符

                        \xhh    二位16進製表示的ASCII字符

                        \uhhhh    四位16進製表示的Unicode字符

                        \Uhhhhhhhh 八位16進製表示的Unicode字符

                list: [...]

                tuple: (...), 其中0-元組, 1-元組, n-元組中1-元組必須帶逗號",",不然誤爲函數調用.

            Dict類型:

                dict: {k:v}, 其中key爲immutable類型, value爲任意類型.

            Function:

                Python沒有函數直接量, 只用lambda表達式做爲妥協物.

    (4)Operator

            Python的運算符可分爲:

            算術運算符(包括位運算符): +, -, *, /, %, //, **, Python沒有++,--自運算符.

            關係運算符: ==, !=, >, >=, <, <=

            邏輯運算符: not, and, or

            位運算符: ~, &, |, <<, >>

            賦值運算符: 簡單賦值=, 複合賦值(跟算術,位複合).

            特殊運算符:

                Python沒有三元運算符, 只有條件賦值表達式: whenTrue if condition else whenFalse

    (5)Comment

            Python只有#註釋符, 多行註釋須要藉助三引字符串.

            Python的文檔註釋位於目標定義的首行, 例如:模塊文檔在模塊體首行,即import以前, 函數文檔或函數體首行.

    (6)Limiter

           一行多個語句需用分號";"隔開. 多行一個語句需用續行符"\"註釋換行符.

3. 數據類型,變量,常量,直接量

Python的數據類型可分爲:

(1)表示數據

None類型: None

Number類型:

bool: True, False

int: 8進制0前綴,10進制無前綴,16進制0x或0X前綴

long: L或l後綴

float: 沒有double類型

complex: r+mj或r+mJ

Seq類型:

str: Python的string有3種:

base string: 單引, 雙引, 三引. Python中單引,雙引沒有區別.

raw string: r前綴, raw string不能以奇數個'\'結尾.

unicode string: u前綴.

                                注意: 要記住轉義字符表.

list: [...]

tuple: (...), 0元組(), 1元組(a,), 多元組(a,b). 其中1元組後必須有逗號,不然視做函調用. 例子: 

a=()#0-元組(空元組)

b=(item,)#1-元組(注意隨後的逗號)

c=item,#1-元組(注意隨後的逗號)

其中,Seq類型的公共操做:index, slice, join, repeat, in, len, min, max

Set類型:

set: 必須使用set(Seq)構造

frozenset: 必須使用frozenset(Seq)構造,注意:frozen不是frozent,其後沒有t.

Dict類型:

dict: {k:v}, 其中k必須爲immutable對象, v任意類型.

刪除元素使用del prices["MSFT"]

(2)表示程序

types.PackageType

types.ModuleType

type

object

types.BuiltinFunctionType, types.FunctionType, types.MethodType

(3)表示實現

types.CodeType

types.FrameType

types.GeneratorType

types.TracebackType

slice

Ellipsis

XRange

4. 運算符,內置函數,表達式

運算符:

del

5. 語句

    表達式語句

    空語句

    複合語句或語句塊

    控制語句

         條件選擇

if-elif-else, 沒有選擇語句

         循環迭代

while循環, 

for-in迭代: for var in iterable: statements

迭代相關函數range(start=0,stop,step=1), xrange(start=0,stop,step=1), enumerate(Seq), zip(Seq,Seq)

         跳轉中斷

break, continue, return, raise

         異常捕獲

try-except-else-finally-raise, 其中else子句與while-else, for-else中的意義同樣.在中間沒有流程跳轉時將會執行.

         其餘……

6. 函數

(1)函數定義:def func_name(param_list): statements

(2)形數聲明: 普通參數, 默認參數, *參數, **參數

注意: 參數聲明時的位置, 普通參數 < 默認參數 < *參數 < **參數, 即默認參數必須在普通參數後, *參數必須在默認參數後, **參數必須在*參數後. 不然報錯!

        (3)實參傳遞: 位置傳遞,命名傳遞,*運算符, **運算符

(4)多值返回: 藉助tuple類型,python函數能夠返回多值.

        (5)函數閉包: closure

7. 面向對象: 元類, 類, 實例, 引用, 對象, 域, 屬性, 方法, 繼承, 改寫

        定義屬性的三種方法:

            (1)property(getter,setter,deleter)函數

            (2)@property, @xxx.setter, @xxx.deleter註解

            (3)PropertyDescriptor:

                    def __get__(self,instance,cls)

                    def __set__(self,instance,value)

                    def __delete__(self,instance)

                    其中instance是屬性實例, 其將描述符與屬性訪問機制掛鉤.

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

        (0)metaclass, class, object的區別.

        (1)python的一切值都是對象, 對象都有id, type, value.

        (2)對象由域(field), 屬性(property), 方法(method)組成, 這些元素又可分紅類級,實例級,局部級(函數內)

        (3)內置域, 屬性, 方法又稱魔術(magic)域, 屬性, 方法.

        (4)用戶定義域, 屬性, 方法.

        (5)對象模型: 舊對象模型, 新對象模型, 區別在於metaclass不一樣, 致使實例對象過程不一樣.

        (6)實例建立過程: instance=C.metaclass.__new__(C,*args,**kvargs) -->instance.__init__(*args,**kvargs);

        (7)屬性或域查找過程: 

        (8)super函數及侷限.

        其餘理解:

        (1)python的一切值都是對象,是對象都id,type,value. 是對象也有域,屬性,方法. Python中類型接口的概念就是一組特殊方法集(首尾是雙下劃線), 在golang借用了此構想. 實現這些特殊方法, 也就定義了類型的運算行爲, 即C++中重載運算符的概念. 簡單地說, python的運算行爲由對象的特殊方法決定, 經過改寫特殊方法實現重載運算符.

        (2)Python沒有new運算符, 由於type, object都是可調用對象.

8. 高級特性技巧

(1)字串格式的三種方法:

格式符%,

format()方法,

string.Template()類

(2)print語句後面跟','將忽略換行符. print()函數則用end=''忽略換行符.

(3)版本特性兼容:from __future__ import (absolute_import, division, generators, unicode_literals, print_function, nested_scopes, with_statement)

(4)input()和raw_input()的區別: eval(raw_input(prompt))

(5)repr()和str()的區別: repr()輸出內部字串, str()輸出友好字串.經過__str__()成員控制其行爲.該成員不存在,則使用其 __repr__()成員

(6)列表解析(List Comprehension): [expression for-statement if-statment]

(7)生成器表達式(Generator Expression): (expression for-statement if-statment)

(8)yield表達式原理, Generator, Coroutine: 

調用包含yield表達式的函數會建立Generator.

Generator在單獨的協程(Coroutine)執行.

Generator包含next(), send(V), throw(E), close()方法. 其中next()等價send(None).

調用Generator.next()或Generator.send(V)會使函數流程執行到下一個yield表達式, 並返回yield表達式的值.

再次調用Generator.send(V)則用參數值V替換yield表達式的值繼續執行到下一個yield表達式.直到函數結束.

        (9)裝飾器decodrator: 裝飾器是AOP一種實現. 其採用函數閉包的形式實現. 

                根據目標可分爲: 類裝飾器, 函數裝飾器. 即接收參數爲類或函數

                根據參數可分爲: 無參裝飾器, 帶參裝飾器. 便是否認義函數, 帶參數裝飾器在無參裝飾器外層套多一層閉包!

9. 包, 模塊, 標準庫

    Python使用包與模塊的概念管理命名空間,組織源碼.

    包: 包含__init__.py的目錄.

    模塊: 文件.

    標準庫:

        (1)文件操做: open, read/write, close.是否須要try-except-else-finally

        (2)BaseException異常類層次

(3)sys模塊

10. 編譯, 執行, 調試

    環境變量

    命令行及選項

11. 設計模式

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

其餘雜症:

1.字符集的問題:

一旦使用unicode_literals則 isinstance("abc",str)會是False. 由於此時"abc"已是unicode,再也不是str.務必注意.

#-*- coding:utf-8 -*-

from __future__ import(absolute_import,division,generators,unicode_literals,print_function,nested_scopes,with_statement)

import sys

class TypedProperty(object):

def __init__(self,name,type,default=None):

self.name='_'+name

self.type=type

self.default=default if default else type()

def __get__(self,instance,cls):

return getattr(instance,self.name,self.default)

def __set__(self,instance,value):

if not isinstance(value,self.type):

raise TypeError("Must be %s" % self.type)

setattr(instance,self.name,value)

def __delete__(self,instance):

raise AttributeError("Can't delte attribute")

class Foo(object):

name=TypedProperty("name",unicode)

num=TypedProperty("num",int,43)

def test():

f=Foo()

a=f.name

f.name="Guido"

print(f.name)

del f.name

if __name__=="__main__":

if sys.getdefaultencoding()!="utf-8":

reload(sys)

sys.setdefaultencoding('utf-8');

test()

#print(isinstance("Geios",unicode))

2. 包的私有模塊,不在__init__.py的__all__中列出

    模塊的私有屬性

    類的私有屬性

    實例的私有屬性, 以雙下劃線開頭, 自動轉在_ClassName__Attribute的形式.何苦?

3. 異常處理

    (1)錯前斷定

    (2)錯後捕獲

    至於使用哪一種策略,視代碼錯誤的頻度而定,對於常常出錯的代碼使用錯前斷定,能夠減小錯誤捕獲的耗費,節省開支;對於不常常出錯的代碼使用錯後捕獲,能夠減小if的執行,更節省開支.

4. Python的優化策略

    (1)理解程序:

        a. 選擇最優的算法: 糟糕的O(n logn)算法比優化的O(n3)算法性能更好. 老是選擇更好的算法,不要嘗試優化差的算法.

        b. 使用內置類型: Python的內置類型list, tuple, set, dict都是用C實現的,並且通過解釋器優化的數據結構. 儘可能使用內置類型, 避免自定義類型.

    (2)不要添加層:

        其原則與(1),(5)中的原理同樣.

    (3)瞭解如何基於字典構建類和實例

        其原則與(1)相同.

    (4)使用__slot__

    (5)避免使用(.)運算符

    (6)使用異常處理不常見的狀況

    (7)避免對常見的狀況使用異常

    (8)鼓勵函數編程和迭代

        列表包含, 生成器表達式, 生成器, 協和和閉包比大多數Python程序員想象的更爲高效.

    (9)使用裝飾器和元類

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

     Python優化總結:

    (0)優先考慮優化算法,而非盲目優化代碼: 瘦死的駱駝比馬大!

    (1)優先考慮內置類型,而非構建類與實例

            Python內置類型list,tuple,set,dict是用C實現,並且通過解釋器優化的數據結構. 基於dict能夠構建類與實例的效果, 並且性能更優.

    (2)優先考慮__slot__,而非__dict__

            Python類使用__slot__比__dict__性能更優.

    (3)優先考慮函數編程與迭代, 而非抽象繼承.

            Python的基礎設備: list comprehension, generator expression, generator, coroutine, closure等比使用函數遞歸, 循環遍歷性能更優, 更加高效.

    (4)避免屬性查找運算(.)

            Python名稱查詢是要損耗性能的.

    (5)避免濫用異常

            錯誤處理策略有二類: 錯前預防, 錯後補救. 在Python中就是錯前if, 錯後except. 

            若是異常頻率低, 使用if斷定會浪費不少性能.

            若是異常頻率高, 使用try-except捕獲會浪費不少性能.

            因此, 若是異常頻率高, 使用if, 避免try-except處理耗時; 若是異常頻率低,使用try-except,避免if的浪費.

===============================================

開發, 調試和測試

1. 搭建Python開發環境: eclipse+pydev

2. python命令行及選項

usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...

Options and arguments (and corresponding environment variables):

-B : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x

-c cmd : program passed in as string (terminates option list)

-d : debug output from parser; also PYTHONDEBUG=x

-E : ignore PYTHON* environment variables (such as PYTHONPATH)

-h : print this help message and exit (also --help)

-i : inspect interactively after running script; forces a prompt even

         if stdin does not appear to be a terminal; also PYTHONINSPECT=x

-m mod : run library module as a script (terminates option list)

-O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x

-OO : remove doc-strings in addition to the -O optimizations

-R : use a pseudo-random salt to make hash() values of various types be

         unpredictable between separate invocations of the interpreter, as

         a defense against denial-of-service attacks

-Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew

-s : don't add user site directory to sys.path; also PYTHONNOUSERSITE

-S : don't imply 'import site' on initialization

-t : issue warnings about inconsistent tab usage (-tt: issue errors)

-u : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x

         see man page for details on internal buffering relating to '-u'

-v : verbose (trace import statements); also PYTHONVERBOSE=x

         can be supplied multiple times to increase verbosity

-V : print the Python version number and exit (also --version)

-W arg : warning control; arg is action:message:category:module:lineno

         also PYTHONWARNINGS=arg

-x : skip first line of source, allowing use of non-Unix forms of #!cmd

-3 : warn about Python 3.x incompatibilities that 2to3 cannot trivially fix

file : program read from script file

- : program read from stdin (default; interactive mode if a tty)

arg ...: arguments passed to program in sys.argv[1:]

Other environment variables:

PYTHONSTARTUP: file executed on interactive startup (no default)

PYTHONPATH : ':'-separated list of directories prefixed to the

               default module search path. The result is sys.path.

PYTHONHOME : alternate <prefix> directory (or <prefix>:<exec_prefix>).

               The default module search path uses <prefix>/pythonX.X.

PYTHONCASEOK : ignore case in 'import' statements (Windows).

PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.

PYTHONHASHSEED: if this variable is set to 'random', the effect is the same

   as specifying the -R option: a random value is used to seed the hashes of

   str, bytes and datetime objects. It can also be set to an integer

   in the range [0,4294967295] to get hash values with a predictable seed.

選項分類:

第一類: 執行方式

    (1) -c: command, 執行命令

    (2) -i: interactive, 執行交互

    (3) -m: module, 執行模塊

    (4) file: 執行文件

    (5) -: 執行流

    (6) -d: debug模式

    (7) -v:  PYTHONVERBOSE, 詳細輸出

第二類: 源碼編譯

    (1) -B: PYTHONDONTWRITEBYTECODE, 不保存編譯後的字節碼.

    (2) -E: ignore PYTHON* environment.

    (3) -O, -OO: PYTHONOPTIMIZE, optimize

    (4) -s, -S: PYTHONNOUSERSITE, don't add user site, don't apply import site.

    (5) -t, -tt: Tab與空格共用

    (6) -x: skip x line

    (7) -3: 兼容python3的方式

第三類: 特性設置

    (1) -R: hash()方法

    (2) -Q: 除法

    (3) -u: PYTHONUNBUFFERED

第四類: 其餘:

    (1) -h

    (2) -V

環境變量:

    PYTHONHOME: python的home目錄 

    PYTHONPATH: python的類路徑

    PYTHONSTARTUP: python啓動時的執行命令,若是@打頭,則認爲是腳本文件.

    PYTHONIOENCODING

    PYTHONHASHSEED

    python啓動時指定stdout, stderr, stdin的編碼, hash的隨機種子. PYTHONIOENCODING比較關鍵.

因此, 在腳本啓動python的方式通常爲:

    env - PYTHONIOENCODING=utf8 python xxx

或在main模塊中設置:

3. python交互退出:

    (1) EOF: Ctrl+Z, Ctrl+D

    (2) exit()函數

    (3) raise SystemExit

相關文章
相關標籤/搜索