原创 第十五章 測試(一)

編寫單元測試主要有2個目的: 實現新功能時能夠確保新添加的代碼按預期方式運行; 每次修改應用後,運行單元測試能確保現有代碼的功能沒有迴歸,即新改動沒有影響代碼的正常運行;        從一開始我們就爲Flasky應用編寫了單元測試,檢查

原创 第七講 Docker案例實戰(一)

一. BusyBox工具箱         Linux系統的瑞士軍刀,集成了100多個常用的軟件工具箱,但大小卻只有幾兆,十分精巧。首先,下載 BusyBox 鏡像: [root@localhost ~]# docker pull 19

原创 第十五章 測試(二)

測試WEB服務 Flask測試客戶端還可用於測試REST式WEB服務。 tests/test_api.py:使用Flask測試客戶端測試REST式API import unittest import json import re fro

原创 第十五章 測試(四)

使用Coverage.py計算測試覆蓋率        對於測試的質量,有一個重要的考慮指標----測試覆蓋率(test coverage)。100%的測試覆蓋率是理想目標,但有些時候並不是那麼容易實現。對於大多數項目來說,應該儘量將測試

原创 第十六章 性能(一)

       經過了各種測試,代碼的正確性和質量都有了很大保證,但是,部署前的準備工作尚未結束。雖然代碼能實現預期的效果,但在性能上未必是合格的。頁面加載時間太長會讓用戶失去興趣,所以儘早發現並修正性能問題是一件很重要的工作。我們可以從請

原创 python實現協程(四)

        我們本節開始學習的python asyncio包,使用基於事件循環驅動的協程實現併發。這是python中最大,也是最具雄心壯志的庫之一。既然asyncio基於事件驅動,那麼讓我們首先來了解下事件驅動編程,再進入正題。 一.

原创 第二章(提煉) 序列構成的數組(一)

一. 內置序列類型         Python標準庫用C實現了豐富的序列類型: 容器序列:list、tuple和collections.deque這些序列能存放不同類型的數據; 扁平序列:str、bytes、bytearray、memo

原创 python實現協程(五)

一. asyncio基本操作 1.1 任務狀態         上一節我們提到asyncio的任務使用協程對象作爲參數創建。並且任務含有多種狀態。下面我們使用一個簡單的例子來說明任務的各種狀態。 import time import a

原创 第二章(提煉) 序列構成的數組(三)

一. 對序列使用+和*          Python 程序員會默認序列是支持 + 和 * 操作的。通常 + 號兩側的序列由相同類型的數據所構成,在拼接的過程中,兩個被操作的序列都不會被修改,Python 會新建一個包含同樣類型數據的序列

原创 python實現協程(三)

一. 讓協程返回值         下面的例子,我們再次改版之前計算平均值的協程函數,這一版本的協程函數每次被激活時,不會自動產出平均值,而是在最後返回一個值。(averager協程返回的結果是一個namedtuple,2個字段分別是co

原创 python實現協程(二)

一. 預激活協程的裝飾器        調用協程函數後,返回的是一個協程對象,函數本身並不會執行。所以在調用send方法前,必須使用next()或send(None)來預激活協程函數,是協程函數執行到第一個yield表達式,處於暫停狀態。

原创 第一章(提煉) Python數據模型

        Python風格的關鍵完全體現在Python的數據模型上,而數據模型所描述的API,爲使用最地道的語言特性來構建開發者自己的對象提供了工具。當Python解析器遇到特殊句法時,會使用特殊方法去激活一些基本的對象操作。特殊方

原创 python實現協程(一)

        python生成器中用到的 yield item 具有2個含義“產出”和“讓步”。yield item這行代碼會產出一個值,提供給next()調用方;此外還會做出讓步,即暫停執行生成器,讓調用方繼續工作,直到需要使用另一個

原创 字典和集合(一)

一. 初識字典         字典一種可變的容器,可以存儲任意類型的數據,數據以鍵(key)-值(value)對的形式進行映射存儲。字典中的每個數據都是用“鍵”(key)進行索引的,而不像序列可以用下標進行索引,因此鍵不能重複,且只能用

原创 Pandas引言(二)

DataFrame的基本操作 讀取數據集 import pandas as pd import numpy as np titanic_survival = pd.read_csv('titanic_train.csv') ti