目錄
第1章 文本 1
引言 1
1.1 每次處理一個字元 6
1.2 字元和字元值之間的轉換 7
1.3 測試一個對象是否是類字元串 8
1.4 字元串對齊 10
1.5 去除字元串兩端的空格 11
1.6 合併字元串 11
1.7 將字元串逐字元或逐詞反轉 14
1.8 檢查字元串中是否包含某字元集合中的字元 15
1.9 簡化字元串的translate方法的使用 18
1.10 過濾字元串中不屬於指定集合的字元 20
1.11 檢查一個字元串是文本還是二進制 23
1.12 控制大小寫 25
1.13 訪問子字元串 26
1.14 改變多行文本字元串的縮進 29
1.15 擴展和壓縮制表符 31
1.16 替換字元串中的子串 33
1.17 替換字元串中的子串-Python 2.4 34
1.18 一次完成多個替換 36
1.19 檢查字元串中的結束標記 39
1.20 使用Unicode來處理國際化文本 40
1.21 在Unicode和普通字元串之間轉換 43
1.22 在標準輸出中列印Unicode字元 45
1.23 對Unicode數據編碼並用於XML和HTML 46
1.24 讓某些字元串大小寫不敏感 49
1.25 將HTML文檔轉化為文本顯示到UNIX終端上 52
第2章 檔案 55
引言 55
2.1 讀取檔案 59
2.2 寫入檔案 62
2.3 搜尋和替換檔案中的文本 64
2.4 從檔案中讀取指定的行 65
2.5 計算檔案的行數 66
2.6 處理檔案中的每個詞 68
2.7 隨機輸入/輸出 70
2.8 更新隨機存取檔案 71
2.9 從zip檔案中讀取數據 73
2.10 處理字元串中的zip檔案 74
2.11 將檔案樹歸檔到一個壓縮的tar檔案 76
2.12 將二進制數據傳送到Windows的標準輸出 77
2.13 使用C++的類iostream語法 78
2.14 回退輸入檔案到起點 80
2.15 用類檔案對象適配真實檔案對象 83
2.16 遍歷目錄樹 84
2.17 在目錄樹中改變檔案擴展名 85
2.18 從指定的搜尋路徑尋找檔案 86
2.19 根據指定的搜尋路徑和模式尋找檔案 87
2.20 在Python的搜尋路徑中尋找檔案 88
2.21 動態地改變Python搜尋路徑 89
2.22 計算目錄間的相對路徑 91
2.23 跨平台地讀取無快取的字元 93
2.24 在Mac OS X平台上統計PDF文檔的頁數 94
2.25 在Windows平台上修改檔案屬性 95
2.26 從OpenOffice文檔中提取文本 96
2.27 從微軟Word文檔中抽取文本 97
2.28 使用跨平台的檔案鎖 98
2.29 帶版本號的檔案名稱 100
2.30 計算CRC-64循環冗餘碼校驗 102
第3章 時間和財務計算 105
引言 105
3.1 計算昨天和明天的日期 111
3.2 尋找上一個星期五 112
3.3 計算日期之間的時段 114
3.4 計算歌曲的總播放時間 115
3.5 計算日期之間的工作日 116
3.6 自動查詢節日 118
3.7 日期的模糊查詢 121
3.8 檢查夏令時是否正在實行 123
3.9 時區轉換 124
3.10 反覆執行某個命令 125
3.11 定時執行命令 127
3.12 十進制數學計算 129
3.13 將十進制數用於貨幣處理 130
3.14 用Python實現的簡單加法器 133
3.15 檢查信用卡校驗和 136
3.16 查看匯率 137
第4章 Python技巧 139
引言 139
4.1 對象拷貝 140
4.2 通過列表推導構建列表 144
4.3 若列表中某元素存在則返回之 146
4.4 循環訪問序列中的元素和索引 147
4.5 在無須共享引用的條件下創建列表的列表 148
4.6 展開一個嵌套的序列 149
4.7 在行列表中完成對列的刪除和排序 152
4.8 二維陣列變換 154
4.9 從字典中取值 155
4.10 給字典增加一個條目 157
4.11 在無須過多援引的情況下創建字典 158
4.12 將列表元素交替地作為鍵和值來創建字典 159
4.13 獲取字典的一個子集 161
4.14 反轉字典 163
4.15 字典的一鍵多值 164
4.16 用字典分派方法和函式 166
4.17 字典的並集與交集 167
4.18 蒐集命名的子項 169
4.19 用一條語句完成賦值和測試 171
4.20 在Python中使用printf 174
4.21 以指定的機率獲取元素 174
4.22 在表達式中處理異常 176
4.23 確保名字已經在給定模組中被定義 178
第5章 搜尋和排序 180
引言 180
5.1 對字典排序 185
5.2 不區分大小寫對字元串列表排序 185
5.3 根據對象的屬性將對象列表排序 187
5.4 根據對應值將鍵或索引排序 189
5.5 根據內嵌的數字將字元串排序 192
5.6 以隨機順序處理列表的元素 193
5.7 在增加元素時保持序列的順序 195
5.8 獲取序列中最小的幾個元素 197
5.9 在排序完畢的序列中尋找元素 199
5.10 選取序列中最小的第n個元素 200
5.11 三行代碼的快速排序 203
5.12 檢查序列的成員 206
5.13 尋找子序列 208
5.14 給字典類型增加排名功能 210
5.15 根據姓的首字母將人名排序和分組 214
第6章 面向對象編程 217
引言 217
6.1 溫標的轉換 223
6.2 定義常量 225
6.3 限制屬性的設定 227
6.4 鏈式字典查詢 229
6.5 繼承的替代方案-自動託管 231
6.6 在代理中託管特殊方法 234
6.7 有命名子項的元組 237
6.8 避免屬性讀寫的冗餘代碼 239
6.9 快速複製對象 240
6.10 保留對被綁定方法的引用且支持垃圾回收 243
6.11 快取環的實現 245
6.12 檢查一個實例的狀態變化 249
6.13 檢查一個對象是否包含某種必要的屬性 252
6.14 實現狀態設計模式 255
6.15 實現單例模式 257
6.16 用Borg慣用法來避免“單例”模式 259
6.17 Null對象設計模式的實現 263
6.18 用_ _init_ _參數自動初始化實例變數 266
6.19 調用超類的_ _init_ _方法 267
6.20 精確和安全地使用協作的超類調用 270
第7章 持久化和資料庫 273
引言 273
7.1 使用marshal模組序列化數據 275
7.2 使用pickle和cPickle模組序列化數據 277
7.3 在Pickling的時候壓縮 280
7.4 對類和實例使用cPickle模組 281
7.5 Pickling被綁定方法 284
7.6 Pickling代碼對象 286
7.7 通過shelve修改對象 288
7.8 使用Berkeley DB資料庫 291
7.9 訪問MySQL資料庫 294
7.10 在MySQL資料庫中儲存BLOB 295
7.11 在PostgreSQL中儲存BLOB 296
7.12 在SQLite中儲存BLOB 298
7.13 生成一個字典將欄位名映射為列號 300
7.14 利用dtuple實現對查詢結果的靈活訪問 302
7.15 列印資料庫游標的內容 304
7.16 適用於各種DB API模組的單參數傳遞風格 306
7.17 通過ADO使用Microsoft Jet 308
7.18 從Jython Servlet訪問JDBC資料庫 310
7.19 通過Jython和ODBC獲得Excel數據 313
第8章 調試和測試 315
引言 315
8.1 阻止某些條件和循環的執行 316
8.2 在Linux上測量記憶體使用 317
8.3 調試垃圾回收進程 318
8.4 捕獲和記錄異常 320
8.5 在調試模式中跟蹤表達式和注釋 322
8.6 從traceback中獲得更多信息 324
8.7 當未捕獲異常發生時自動啟用調試器 327
8.8 簡單的使用單元測試 328
8.9 自動運行單元測試 330
8.10 在Python 2.4中使用doctest和unittest 331
8.11 在單元測試中檢查區間 334
第9章 進程、執行緒和同步 336
引言 336
9.1 同步對象中的所有方法 339
9.2 終止執行緒 342
9.3 將Queue.Queue用作優先權佇列 344
9.4 使用執行緒池 346
9.5 以多組參數並行執行函式 349
9.6 用簡單的訊息傳遞協調執行緒 351
9.7 儲存執行緒信息 353
9.8 無執行緒的多任務協作 357
9.9 在Windows中探測另一個腳本實例的運行 359
9.10 使用MsgWaitForMultipleObjects處理Windows訊息 360
9.11 用popen驅動外部進程 363
9.12 獲取UNIX Shell命令的輸出流和錯誤流 364
9.13 在UNIX中fork一個守護進程 367
第10章 系統管理 370
引言 370
10.1 生成隨機密碼 371
10.2 生成易記的偽隨機密碼 372
10.3 以POP伺服器的方式驗證用戶 375
10.4 統計Apache中每個IP的點擊率 376
10.5 統計Apache的客戶快取的命中率 378
10.6 在腳本中調用編輯器 379
10.7 備份檔案 381
10.8 選擇性地複製信箱檔案 383
10.9 通過信箱創建一個郵件地址的白名單 384
10.10 阻塞重複郵件 386
10.11 檢查你的Windows聲音系統 388
10.12 在Windows中註冊和反註冊DLL 388
10.13 檢查並修改Windows自動運行任務 390
10.14 在Windows中創建共享 391
10.15 連線一個正在運行的Internet Explorer實例 392
10.16 讀取Microsoft Outlook Contacts 393
10.17 在Mac OS X中收集詳細的系統信息 396
第11章 用戶界面 400
引言 400
11.1 在文本控制台中顯示進度條 402
11.2 避免在編寫回調函式時使用lambda 404
11.3 在tkSimpleDialog函式中使用默認值和區間 405
11.4 給Tkinter列表框增加拖曳排序能力 406
11.5 在Tkinter部件中輸入一個重音字元 408
11.6 在Tkinter中嵌入內聯的GIF 410
11.7 轉換圖片格式 412
11.8 在Tkinter中實現一個秒表 415
11.9 用執行緒實現GUI和異步I/O 的結合 417
11.10 在Tkinter中使用IDLE的 Tree部件 421
11.11 在Tkinter Listbox中支持單行多值 423
11.12 在Tkinter部件之間複製Geometry方法和選項 427
11.13 在Tkinter中實現一個帶標籤的記事本 429
11.14 使用wxPython實現帶面板的記事本 431
11.15 在Jython中實現一個ImageJ外掛程式 433
11.16 用Swing和Jython來通過URL查看圖片 434
11.17 在Mac OS中獲得用戶輸入 434
11.18 程式化地創建Python Cocoa GUI 437
11.19 用IronPython實現淡入視窗 439
第12章 XML處理 441
引言 441
12.1 檢查XML的格式完好性 443
12.2 計算文檔中標籤的個數 444
12.3 獲得XML文檔中的文本 445
12.4 自動探測XML的編碼 447
12.5 將一個XML文檔轉化成Python對象樹 449
12.6 從XML DOM節點的子樹中刪除僅有空白符的文本節點 451
12.7 解析Microsoft Excel的XML 452
12.8 驗證XML文檔 454
12.9 過濾屬於指定命名空間的元素和屬性 455
12.10 用SAX合併連續的文本事件 458
12.11 使用MSHTML來解析XML或HTML 461
第13章 網路編程 462
引言 462
13.1 通過Socket數據報傳輸訊息 464
13.2 從Web抓取文檔 466
13.3 過濾FTP站點列表 467
13.4 通過SNTP協定從伺服器獲取時間 468
13.5 傳送HTML郵件 469
13.6 在MIME訊息中綁入檔案 471
13.7 拆解一個分段MIME訊息 474
13.8 刪除郵件訊息中的附屬檔案 475
13.9 修復Python 2.4的email.FeedParser 解析的訊息 477
13.10 互動式地檢查POP3信箱 479
13.11 探測不活動的計算機 482
13.12 用HTTP監視網路 487
13.13 網路連線埠的轉發和重定向 489
13.14 通過代理建立SSL隧道 492
13.15 實現動態IP協定 495
13.16 登錄到IRC並將訊息記錄到磁碟 498
13.17 訪問LDAP服務 500
第14章 Web編程 502
引言 502
14.1 測試CGI是否在工作 503
14.2 用CGI腳本處理URL 506
14.3 用CGI上傳檔案 507
14.4 檢查web頁面的存在 509
14.5 通過HTTP檢查內容類型 510
14.6 續傳HTTP下載檔案 512
14.7 抓取Web頁面時處理Cookie 513
14.8 通過帶身份驗證的代理進行HTTPS導航 516
14.9 用Jython實現Servlet 517
14.10 尋找Internet Explorer的cookie 519
14.11 生成OPML檔案 521
14.12 聚合RSS Feed 524
14.13 通過模板將數據放入Web頁面 527
14.14 在Nevow中呈現任意對象 530
第15章 分散式編程 534
引言 534
15.1 實現一個XML-RPC方法調用 536
15.2 服務XML-RPC請求 537
15.3 在Medusa中使用XML-RPC 539
15.4 允許XML-RPC服務被遠程終止 541
15.5 SimpleXMLRPCServer的一些細節 542
15.6 給一個XML-RPC服務提供一個wxPython GUI 544
15.7 使用Twisted的Perspective Broker 546
15.8 實現一個CORBA服務和客戶 549
15.9 使用telnetlib執行遠程登錄 551
15.10 使用SSH執行遠程登錄 554
15.11 通過HTTPS驗證一個SSL客戶端 557
第16章 關於程式的程式 559
引言 559
16.1 驗證字元串是否代表著一個合法的數字 564
16.2 導入一個動態生成的模組 565
16.3 導入一個名字在運行時被確定的模組 567
16.4 將參數和函式聯繫起來 568
16.5 組合函式 571
16.6 使用內建的Tokenizer給Python源碼上色 572
16.7 合併和拆解Token 575
16.8 檢查字元串是否有平衡的圓括弧 577
16.9 在Python中模擬枚舉 580
16.10 在創建列表推導時引用它自身 583
16.11 自動化py2exe將腳本編譯成Windows執行檔的過程 585
16.12 在UNIX中將主腳本和模組綁成一個執行檔 587
第17章 擴展和嵌入 590
引言 590
17.1 實現一個簡單的擴展類型 592
17.2 用Pyrex實現一個簡單的擴展類型 597
17.3 在Python中使用C++庫 598
17.4 調用Windows DLL的函式 601
17.5 在多執行緒環境中使用SWIG生成的模組 603
17.6 用PySequence_Fast將Python序列轉為 C數組 604
17.7 用疊代器逐個訪問Python序列的元素 608
17.8 從Python可調用的C函式中返回None 611
17.9 用gdb調試動態載入的C擴展 613
17.10 調試記憶體問題 614
第18章 算法 616
引言 616
18.1 消除序列中的重複 619
18.2 在保留序列順序的前提下消除其中的重複 621
18.3 生成回置採樣 625
18.4 生成無回置的抽樣 626
18.5 快取函式的返回值 627
18.6 實現一個FIFO容器 629
18.7 使用FIFO策略來快取對象 631
18.8 實現一個Bag(Multiset)收集類型 634
18.9 在Python模擬三元操作符 637
18.10 計算素數 640
18.11 將整數格式化為二進制字元串 642
18.12 以任意數為基將整數格式化為字元串 644
18.13 通過法雷分數將數字轉成有理數 646
18.14 帶誤差傳遞的數學計算 648
18.15 以最大精度求和 651
18.16 模擬浮點數 653
18.17 計算二維點集的凸包和直徑 656
第19章 疊代器和生成器 660
引言 660
19.1 編寫一個類似range的浮點數遞增的函式 663
19.2 從任意可疊代對象創建列表 665
19.3 生成Fibonacci序列 667
19.4 在多重賦值中拆解部分項 669
19.5 自動拆解出需要的數目的項 670
19.6 以步長n將一個可疊代對象切成n片 672
19.7 通過重疊視窗循環序列 674
19.8 並行地循環多個可疊代對象 678
19.9 循環多個可疊代對象的矢量積 680
19.10 逐段讀取文本檔案 683
19.11 讀取帶有延續符的行 685
19.12 將一個數據塊流處理成行流 687
19.13 用生成器從資料庫中抓取大記錄集 688
19.14 合併有序序列 690
19.15 生成排列、組合以及選擇 694
19.16 生成整數的劃分 696
19.17 複製疊代器 697
19.18 疊代器的前瞻 701
19.19 簡化佇列消費者執行緒 703
19.20 在另一個執行緒中運行疊代器 705
19.21 用itertools.groupby來計算匯總報告 706
第20章 描述符、裝飾器和元類 710
引言 710
20.1 在函式調用中獲得常新的默認值 712
20.2 用嵌套函式來編寫property屬性 715
20.3 給屬性值起別名 717
20.4 快取屬性值 719
20.5 用同一個方法訪問多個屬性 722
20.6 封裝一個方法來給類增加功能 723
20.7 增強所有方法來給類增加功能 726
20.8 在運行時給一個類實例添加方法 728
20.9 檢查接口的實現 730
20.10 在自定義元類中正確地使用_ _new_ _和_ _init_ _ 732
20.11 允許對List的可變方法的鏈式調用 734
20.12 通過更緊湊的語法使用協作的超類調用 736
20.13 不使用_ _init_ _來初始化實例屬性 738
20.14 實例屬性的自動初始化 740
20.15 重新載入時自動更新類實例 743
20.16 在編譯時綁定常量 747
20.17 解決元類衝突 752
序言
這本書不是一本典型的O’Reilly風格的書,而是一本集合了多個作者的手稿的作品。實際上,這也是一種將開源開發的方式套用到書籍出版業的嘗試。Python社區有超過300個成員在本書中貢獻了他們的心得和資料。在這裡,我們作為編輯,想給你——本書的讀者,介紹一些重要的背景資料,這些背景資料是關於此書是如何編著出來,以及這個過程和涉及的人,並提出一些關於這種嶄新的風格的思考。
本書的構思
在2000年初,O’Reilly的主編Frank Willison聯繫到我(David Ascher),問我是否想寫一本書。Frank曾是Learning Python一書的編輯,那本書是由我和Mark Lutz合著而成。由於當時我正在致力於Perl shop(ActiveState)一書的編寫,實在沒有精力再同時開始另一本書的工作。但我和Frank總是定期地通過E-mail或者聊天工具對該書的一些主題進行探討。Frank有個主意,他受到Tom Chriistiansen和Nathan Torkington編寫的Perl Cookbook一書的啟發,認為出一本類似的Python Cookbook將會很有趣。Frank想重複Perl Cookbook一書的成功,但他也認為應該讓更多的人參與到此書的編寫中。他的想法是,作為一本真正的cookbook,更多人的參與將會提供更多的思路、角度和品味。至於書籍的質量,他認為可以通過技術編輯的把關和O’Reilly嚴格的編輯流程來保障。
Frank和ActiveState的CEO Dick Hardt意識到Frank的目標和ActiveState的目標其實是殊途同歸的。ActiveState的想法是為開源程式設計師創造一個網路社區,叫做ActiveState Programmer’s Network(ASPN)。ActiveState有一個人氣很高的網站,提供了很豐富和多樣化的內容。ActiveState充分認識到開源社區具有很強大的力量,它能夠提供最新和最準確的內容,無論多么生僻的方面均有涉及。
O’Reilly和ActiveState很快認識到他們的目標上的相似性,並且意識到雙方合作是最好的達成目標的方式。他們想要實現的包括:
·創建一個由Python程式設計師提供素材的線上Python Cookbook,為Python程式設計師服務;
·出版一本包括了最好素材的書,該書由Python社區中的一些關鍵人物提供的材料和想法綜合而成;
·雙方通過完成這本書亦可學習到一種不同的著書模式。
文摘
插圖:
3.心理定價策略這是一種根據顧客心理要求所採用的定價策略。每一件產品都能滿足顧客某一方面的需求,其價值與顧客的心理感受有很大的關係。這就為心理定價策略的運用提供了基礎,使得企業在定價時可以利用顧客心理因素,有意識地將產品價格定得高一些或低一些,以滿足顧客生理的和心理的、物質的和精神的多方面需求。通過顧客對企業產品的偏愛或忠誠,誘導顧客增加購買,擴大市場銷售獲得最大效益,具體的心理定價策略如下:
(1)整數定價策略對於那些無法明確顯示其內在質量的商品,顧客往往通過其價格的高低來判斷其質量的好壞。在定價時,把產品的價格定成整數,不帶尾數,使顧客產生“一分錢一分貨”的感覺。但是。整數定價其價格的高並不是絕對的高,而只是憑藉整數價格來給顧客造成高價的印象。
(2)尾數定價策略尾數定價策略是與整數定價策略正好相反的一種定價策略,是指企業利用消費者求廉的心理,在產品定價時取尾數,而不取整數的定價策略,它常常以雙位數作尾數,儘可能在價格上不進位。