行業(yè)測試數(shù)據(jù)

行業(yè)測試數(shù)據(jù)-案例分享

一 總體介紹

“人類正從IT時(shí)代走向DT時(shí)代”

1.數(shù)據(jù)測試指的是檢查局部數(shù)據(jù)結(jié)構(gòu)時(shí)為了保證臨時(shí)存儲(chǔ)在模塊內(nèi)的數(shù)據(jù)在程序執(zhí)行過程中完整、正確的過程。2.工程師開發(fā)完成后,常常需要制造大批量的偽數(shù)據(jù),來測試數(shù)據(jù)中臺(tái)的開發(fā)效果。例如在數(shù)倉開發(fā)中,會(huì)遇到需要在已構(gòu)建的數(shù)倉模型(各種表)中,導(dǎo)入一些測試數(shù)據(jù),方便邏輯開發(fā)完之前進(jìn)行開發(fā)和測試。亦或是自己有一些SQL邏輯需要測試,需要批量造一些假數(shù)據(jù)(幾百上千條,甚至幾十萬條)。

如何在造數(shù)過程中保障數(shù)據(jù)質(zhì)量,優(yōu)化數(shù)據(jù)產(chǎn)出

數(shù)據(jù)質(zhì)量問題:數(shù)據(jù)一致性,數(shù)據(jù)完整性、數(shù)據(jù)準(zhǔn)確性、數(shù)據(jù)唯一性、數(shù)據(jù)關(guān)聯(lián)性、數(shù)據(jù)及時(shí)性

數(shù)據(jù)準(zhǔn)確性:用于分析和識(shí)別無效或者不準(zhǔn)確的數(shù)據(jù),不可靠的數(shù)據(jù)可能會(huì)導(dǎo)致嚴(yán)重的問題。數(shù)據(jù)唯一性:用于識(shí)別和度量重復(fù)數(shù)據(jù)、冗余數(shù)據(jù),重復(fù)數(shù)據(jù)是導(dǎo)致業(yè)務(wù)無法協(xié)同、流程無法追溯的重要因素,是需要解決的最基本的數(shù)據(jù)問題。數(shù)據(jù)完整性:唯一性約束不完整、參照不完整;數(shù)據(jù)條目不完整、數(shù)據(jù)記錄丟失或不可用;不完整的數(shù)據(jù)所能借鑒的價(jià)值就會(huì)大大降低,也是數(shù)據(jù)質(zhì)量問題最為基礎(chǔ)和常見的問題。數(shù)據(jù)一致性:多源數(shù)據(jù)的數(shù)據(jù)模型不一致,例如:命名不一致、數(shù)據(jù)結(jié)構(gòu)不一致、約束規(guī)則不一致。數(shù)據(jù)實(shí)體不一致,例如:數(shù)據(jù)編碼不一致、命名及含義不一致、分類層次不一致、生命周期不一致……。相同的數(shù)據(jù)有多個(gè)副本的情況下的數(shù)據(jù)不一致、數(shù)據(jù)內(nèi)容沖突的問題。數(shù)據(jù)關(guān)聯(lián)性:數(shù)據(jù)關(guān)聯(lián)性問題是指存在數(shù)據(jù)關(guān)聯(lián)的數(shù)據(jù)關(guān)系缺失或錯(cuò)誤,例如主外鍵關(guān)系、索引關(guān)系等。會(huì)直接影響數(shù)據(jù)分析的結(jié)果。數(shù)據(jù)及時(shí)性:能否在需要的時(shí)候獲到數(shù)據(jù),數(shù)據(jù)的及時(shí)性與企業(yè)的數(shù)據(jù)處理速度及效率有直接的關(guān)系,是影響業(yè)務(wù)處理和管理效率的關(guān)鍵指標(biāo)。

實(shí)時(shí)數(shù)據(jù)類:

源頭數(shù)據(jù)訂閱-》流式計(jì)算計(jì)算平臺(tái)-〉數(shù)據(jù)輸出在線存儲(chǔ)系統(tǒng)

2、 邏輯正確性:

本地測試:模擬實(shí)時(shí)數(shù)據(jù)流,校驗(yàn)輸出結(jié)果是否正確

3、數(shù)據(jù)準(zhǔn)確性:

本地邏輯校驗(yàn)通過后,對(duì)真實(shí)數(shù)據(jù)進(jìn)行校驗(yàn)。把實(shí)時(shí)數(shù)據(jù)拖回ODPS,做離線的查詢、統(tǒng)計(jì)、對(duì)比

4、時(shí)效性:

關(guān)注日志時(shí)間和表數(shù)據(jù)產(chǎn)生時(shí)間,不能與實(shí)際時(shí)間偏差太大

二 語言簡介

1.什么是python

Python是一種開源的 、解析性的,面向?qū)ο蟮木幊陶Z言。

Python使用一種優(yōu)雅的語法,可讀性強(qiáng) Python支持類和多層繼承等的面向?qū)ο缶幊碳夹g(shù)。

Python可運(yùn)行在多種計(jì)算機(jī)平臺(tái)和操作系統(tǒng)中,如unix,windows,MacOS,ubuntu,OS/2等等

Python 標(biāo)識(shí)符

在python里,標(biāo)識(shí)符有字母、數(shù)字、下劃線組成。在python中,所有標(biāo)識(shí)符可以包括英文、數(shù)字以及下劃線(_),但不能以數(shù)字開頭。python中的標(biāo)識(shí)符是區(qū)分大小寫的。以下劃線開頭的標(biāo)識(shí)符是有特殊意義的。以單下劃線開頭(_foo)的代表不能直接訪問的類屬性,需通過類提供的接口進(jìn)行訪問,不能用"from xxx import *"而導(dǎo)入;以雙下劃線開頭的(__foo)代表類的私有成員;以雙下劃線開頭和結(jié)尾的(foo)代表python里特殊方法專用的標(biāo)識(shí),如init()代表類的構(gòu)造函數(shù)。

Python保留字符

下面的列表顯示了在Python中的保留字。這些保留字不能用作常數(shù)或變數(shù),或任何其他標(biāo)識(shí)符名稱。所有Python的關(guān)鍵字只包含小寫字母。

and exec notassert finally orbreak for passclass from printcontinue global raisedef if returndel import tryelif in whileelse is withexcept lambda yield

多行語句

Python語句中一般以新行作為為語句的結(jié)束符。但是我們可以使用斜杠( \)將一行的語句分為多行顯示。

語句中包含[], {} 或 () 括號(hào)就不需要使用多行連接符。

Python 引號(hào)和注釋

2.Python 接收單引號(hào)(' ),雙引號(hào)(" ),三引號(hào)(''' """) 來表示字符串,引號(hào)的開始與結(jié)束必須的相同類型的。其中三引號(hào)可以由多行組成,編寫多行文本的快捷語法,常用語文檔字符串,在文件的特定地點(diǎn),被當(dāng)做注釋。

3.Python中單行注釋采用#開頭

python 中多行注釋使用三個(gè)單引號(hào)(''')或三個(gè)雙引號(hào)(""")

多個(gè)語句構(gòu)成代碼組縮進(jìn)相同的一組語句構(gòu)成一個(gè)代碼塊,我們稱之代碼組。像if、while、def和class這樣的復(fù)合語句,首行以關(guān)鍵字開始,以冒號(hào)( : )結(jié)束,該行之后的一行或多行代碼構(gòu)成代碼組。我們將首行及后面的代碼組稱為一個(gè)子句(clause)。

4.Python數(shù)據(jù)類型

準(zhǔn)數(shù)據(jù)類型在內(nèi)存中存儲(chǔ)的數(shù)據(jù)可以有多種類型。例如,person.s年齡作為一個(gè)數(shù)值存儲(chǔ)和他或她的地址是字母數(shù)字字符存儲(chǔ)。Python有一些標(biāo)準(zhǔn)類型用于定義操作上,他們和為他們每個(gè)人的存儲(chǔ)方法可能。Python有五個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類型:Numbers(數(shù)字)String(字符串)List(列表)Tuple(元組)Dictionary(字典)

Python數(shù)字?jǐn)?shù)字?jǐn)?shù)據(jù)類型用于存儲(chǔ)數(shù)值。他們是不可改變的數(shù)據(jù)類型,這意味著改變數(shù)字?jǐn)?shù)據(jù)類型會(huì)分配一個(gè)新的對(duì)象。Python支持四種不同的數(shù)字類型:

int(有符號(hào)整型)

long(長整型[也可以代表八進(jìn)制和十六進(jìn)制])

float(浮點(diǎn)型)

complex(復(fù)數(shù))

Python 支持四種不同的數(shù)值類型:整型(Int) - 通常被稱為是整型或整數(shù),是正或負(fù)整數(shù),不帶小數(shù)點(diǎn)。長整型(long integers) - 無限大小的整數(shù),整數(shù)最后是一個(gè)大寫或小寫的L。浮點(diǎn)型(floating point real values) - 浮點(diǎn)型由整數(shù)部分與小數(shù)部分組成,浮點(diǎn)型也可以使用科學(xué)計(jì)數(shù)法表示(2.5e2 = 2.5 x 102 = 250)復(fù)數(shù)( (complex numbers)) - 復(fù)數(shù)由實(shí)數(shù)部分和虛數(shù)部分構(gòu)成,可以用a + bj,或者complex(a,b)表示, 復(fù)數(shù)的實(shí)部a和虛部b都是浮點(diǎn)型。

Python字符串字符串或串(String)是由數(shù)字、字母、下劃線組成的一串字符。s="a1a2···an"(n>=0)它是編程語言中表示文本的數(shù)據(jù)類型。python的字串列表有2種取值順序:從左到右索引默認(rèn)0開始的,最大范圍是字符串長度少1從右到左索引默認(rèn)-1開始的,最大范圍是字符串開頭如果你的實(shí)要取得一段子串的話,可以用到變量[頭下標(biāo):尾下標(biāo)],就可以截取相應(yīng)的字符串,其中下標(biāo)是從0開始算起,可以是正數(shù)或負(fù)數(shù),下標(biāo)可以為空表示取到頭或尾。比如:s = 'ilovepython's[1:5]的結(jié)果是love。

5.字符串類型的操作符

序列類型通用的操作符 in, not in, +,等

只適用于字符串的操作符格式化操作符 %

格式化字符 轉(zhuǎn)換方式
%r 優(yōu)先用repr()函數(shù)進(jìn)行字符串轉(zhuǎn)換
%s 優(yōu)先用str()函數(shù)進(jìn)行字符串轉(zhuǎn)換
%d / %i 轉(zhuǎn)換成有符號(hào)十進(jìn)制數(shù)
%u 轉(zhuǎn)換成無符號(hào)十進(jìn)制數(shù)
%o 轉(zhuǎn)換成無符號(hào)八進(jìn)制數(shù)
%x / %X 轉(zhuǎn)換成無符號(hào)十六進(jìn)制數(shù)(x/X代表轉(zhuǎn)換后的大小寫)
%e / %E 轉(zhuǎn)換成科學(xué)計(jì)數(shù)法
%f / %F 轉(zhuǎn)換成浮點(diǎn)數(shù)
%% 輸出%

當(dāng)使用以冒號(hào)分隔的字符串,python返回一個(gè)新的對(duì)象,結(jié)果包含了以這對(duì)偏移標(biāo)識(shí)的連續(xù)的內(nèi)容,左邊的開始是包含了下邊界。上面的結(jié)果包含了s[1]的值l,而取到的最大范圍不包括上邊界,就是s[5]的值p。加號(hào)(+)是字符串連接運(yùn)算符,星號(hào)(*)是重復(fù)操作。

6.Python列表List(列表) 是 Python 中使用最頻繁的數(shù)據(jù)類型。列表可以完成大多數(shù)集合類的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)。它支持字符,數(shù)字,字符串甚至可以包含列表(所謂嵌套)。列表用[ ]標(biāo)識(shí)。是python最通用的復(fù)合數(shù)據(jù)類型。看這段代碼就明白。列表中的值得分割也可以用到變量[頭下標(biāo):尾下標(biāo)],就可以截取相應(yīng)的列表,從左到右索引默認(rèn)0開始的,從右到左索引默認(rèn)-1開始,下標(biāo)可以為空表示取到頭或尾。加號(hào)(+)是列表連接運(yùn)算符,星號(hào)(*)是重復(fù)操作。

7.Python元組元組是另一個(gè)數(shù)據(jù)類型,類似于List(列表)。元組用"()"標(biāo)識(shí)。內(nèi)部元素用逗號(hào)隔開。但是元組不能二次賦值,相當(dāng)于只讀列表。

8.Python元字典字典(dictionary)是除列表以外python之中最靈活的內(nèi)置數(shù)據(jù)結(jié)構(gòu)類型。列表是有序的對(duì)象結(jié)合,字典是無序的對(duì)象集合。兩者之間的區(qū)別在于:字典當(dāng)中的元素是通過鍵來存取的,而不是通過偏移存取。字典用"{ }"標(biāo)識(shí)。字典由索引(key)和它對(duì)應(yīng)的值value組成

Python數(shù)據(jù)類型轉(zhuǎn)換有時(shí)候,我們需要對(duì)數(shù)據(jù)內(nèi)置的類型進(jìn)行轉(zhuǎn)換,數(shù)據(jù)類型的轉(zhuǎn)換,你只需要將數(shù)據(jù)類型作為函數(shù)名即可。以下幾個(gè)內(nèi)置的函數(shù)可以執(zhí)行數(shù)據(jù)類型之間的轉(zhuǎn)換。這些函數(shù)返回一個(gè)新的對(duì)象,表示轉(zhuǎn)換的值。

9.條件和循環(huán)

條件表達(dá)式

Python條件語句是通過一條或多條語句的執(zhí)行結(jié)果(True或者False)來決定執(zhí)行的代碼塊。

Python程序語言指定任何非0和非空(null)值為true,0 或者 null為false。Python 編程中 if 語句用于控制程序的執(zhí)行,基本形式為:if 判斷條件: 執(zhí)行語句……else: 執(zhí)行語句……

其中"判斷條件"成立時(shí)(非零),則執(zhí)行后面的語句,而執(zhí)行內(nèi)容可以多行,以縮進(jìn)來區(qū)分表示同一范圍。else 為可選語句,當(dāng)需要在條件不成立時(shí)執(zhí)行內(nèi)容則可以執(zhí)行相關(guān)語句

循環(huán)控制語句

循環(huán)控制語句可以更改語句執(zhí)行的順序。Python支持以下循環(huán)控制語句:

break語句 在語句塊執(zhí)行過程中終止循環(huán),并且跳出整個(gè)循環(huán)。

continue語句 在語句塊執(zhí)行過程中終止當(dāng)前循環(huán),跳出改次循環(huán),執(zhí)行下一次循環(huán)

pass語句 pass是空語句,是為了保持程序結(jié)構(gòu)的完整性

循環(huán)表達(dá)式

Python的循環(huán)語句,程序在一般情況下是按順序執(zhí)行的。編程語言提供了各種控制結(jié)構(gòu),允許更復(fù)雜的執(zhí)行路徑。循環(huán)語句允許我們執(zhí)行一個(gè)語句或語句組多次。

Python 循環(huán)語句實(shí)例

10.函數(shù)

Python 函數(shù)函數(shù)是組織好的,可重復(fù)使用的,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶自定義函數(shù)。

定義一個(gè)函數(shù)你可以定義一個(gè)由自己想要功能的函數(shù),以下是簡單的規(guī)則:函數(shù)代碼塊以 def 關(guān)鍵詞開頭,后接函數(shù)標(biāo)識(shí)符名稱和圓括號(hào)()。任何傳入?yún)?shù)和自變量必須放在圓括號(hào)中間。圓括號(hào)之間可以用于定義參數(shù)。函數(shù)的第一行語句可以選擇性地使用文檔字符串—用于存放函數(shù)說明。函數(shù)內(nèi)容以冒號(hào)起始,并且縮進(jìn)。return [表達(dá)式] 結(jié)束函數(shù),選擇性地返回一個(gè)值給調(diào)用方。不帶表達(dá)式的return相當(dāng)于返回 None。

語法:

def functionname( parameters ):

 "函數(shù)_文檔字符串"     

function_suite      

return [expression]

默認(rèn)情況下,參數(shù)值和參數(shù)名稱是按函數(shù)聲明中定義的的順序匹配起來的。

實(shí)例:

 以下為一個(gè)簡單的Python函數(shù),它將一個(gè)字符串作為傳入?yún)?shù),再打印到標(biāo)準(zhǔn)顯示設(shè)備上。

def printme( str ):

  "打印傳入的字符串到標(biāo)準(zhǔn)顯示設(shè)備上"     

   print str         

  return

函數(shù)調(diào)用定義一個(gè)函數(shù)只給了函數(shù)一個(gè)名稱,指定了函數(shù)里包含的參數(shù),和代碼塊結(jié)構(gòu)。這個(gè)函數(shù)的基本結(jié)構(gòu)完成以后,你可以通過另一個(gè)函數(shù)調(diào)用執(zhí)行,也可以直接從Python提示符執(zhí)行。如下實(shí)例調(diào)用了printme()函數(shù):

!/usr/bin/python# -- coding: UTF-8 --

定義函數(shù)

def printme( str ):
"打印任何傳入的字符串"
print str
return # 調(diào)用函數(shù)printme("我要調(diào)用用戶自定義函數(shù)!")
printme("再次調(diào)用同一函數(shù)");

按值傳遞參數(shù)和按引用傳遞參數(shù)所有參數(shù)(自變量)在Python里都是按引用傳遞。如果你在函數(shù)里修改了參數(shù),那么在調(diào)用這個(gè)函數(shù)的函數(shù)里,原始的參數(shù)也被改變了。

!/usr/bin/python# -- coding: UTF-8 --

可寫函數(shù)說明

def changeme( mylist ):

mylist.append([1,2,3,4]);   

print "函數(shù)內(nèi)取值: ", 


return # 調(diào)用changeme函數(shù)

mylist = [10,20,30];

changeme( mylist );

傳入函數(shù)的和在末尾添加新內(nèi)容的對(duì)象用的是同一個(gè)引用。故輸出結(jié)果如下:

函數(shù)內(nèi)取值: [10, 20, 30, [1, 2, 3, 4]]

函數(shù)外取值: [10, 20, 30, [1, 2, 3, 4]]

11.python高階函數(shù)map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是Iterable,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的Iterator返回。reduce把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, ...]上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算,其效果就是:

!/usr/bin/python# -- coding: UTF-8 -- >>> from functools import reduce>>> def add(x, y):... return x + y...>>> reduce(add, [1, 3, 5, 7, 9])25

!/usr/bin/python# -- coding: UTF-8 -- >>> from functools import reduce>>> def fn(x, y):... return x * 10 + y...>>> reduce(fn, [1, 3, 5, 7, 9])13579

!/usr/bin/python# -- coding: UTF-8 -- # 可寫函數(shù)說明>>> def f(x):... return x * x...>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])>>> list(r)[1, 4, 9, 16, 25, 36, 49, 64, 81]mylist

!/usr/bin/python# -- coding: UTF-8 -- >>> from functools import reduce>>> def fn(x, y):... return x * 10 + y...>>> def char2num(s):... digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}... return digits[s]...>>> reduce(fn, map(char2num, '13579'))13579

filter()也接收一個(gè)函數(shù)和一個(gè)序列。和map()不同的是,filter()把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。

Python內(nèi)置的sorted()函數(shù)就可以對(duì)list進(jìn)行排序:>>> sorted([36, 5, -12, 9, -21])[-21, -12, 5, 9, 36]sorted()函數(shù)也是一個(gè)高階函數(shù),它還可以接收一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序,例如按絕對(duì)值大小排序:>>> sorted([36, 5, -12, 9, -21], key=abs)[5, 9, -12, -21, 36]>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)['about', 'bob', 'Credit', 'Zoo']要進(jìn)行反向排序,不必改動(dòng)key函數(shù),可以傳入第三個(gè)參數(shù)reverse=True:>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)['Zoo', 'Credit', 'bob', 'about']

12.模塊

Python 模塊模塊讓你能夠有邏輯地組織你的Python代碼段。把相關(guān)的代碼分配到一個(gè) 模塊里能讓你的代碼更好用,更易懂。模塊也是Python對(duì)象,具有隨機(jī)的名字屬性用來綁定或引用。簡單地說,模塊就是一個(gè)保存了Python代碼的文件。模塊能定義函數(shù),類和變量。模塊里也能包含可執(zhí)行的代碼。

例子:一個(gè)叫做aname的模塊里的Python代碼一般都能在一個(gè)叫aname.py的文件中找到。下例是個(gè)簡單的模塊support.py。def print_func( par ): print "Hello : ", par return

import 語句想使用Python源文件,只需在另一個(gè)源文件里執(zhí)行import語句,語法如下:import module1[, module2[,... moduleN]

當(dāng)解釋器遇到import語句,如果模塊在當(dāng)前的搜索路徑就會(huì)被導(dǎo)入。搜索路徑是一個(gè)解釋器會(huì)先進(jìn)行搜索的所有目錄的列表。如想要導(dǎo)入模塊support.py,需要把命令放在腳本的頂端

!/usr/bin/python3# -- coding: UTF-8 -- # 導(dǎo)入模塊import support

現(xiàn)在可以調(diào)用模塊里包含的函數(shù)了

support.print_func("Zara")

實(shí)例輸出結(jié)果:Hello : Zara

From…import 語句Python的from語句讓你從模塊中導(dǎo)入一個(gè)指定的部分到當(dāng)前命名空間中。語法如下:from modname import name1[, name2[, ... nameN]]例如,要導(dǎo)入模塊fib的fibonacci函數(shù),使用如下語句:from fib import fibonacci這個(gè)聲明不會(huì)把整個(gè)fib模塊導(dǎo)入到當(dāng)前的命名空間中,它只會(huì)將fib里的fibonacci單個(gè)引入到執(zhí)行這個(gè)聲明的模塊的全局符號(hào)表。

From…import* 語句把一個(gè)模塊的所有內(nèi)容全都導(dǎo)入到當(dāng)前的命名空間也是可行的,只需使用如下聲明:from modname import *這提供了一個(gè)簡單的方法來導(dǎo)入一個(gè)模塊中的所有項(xiàng)目。然而這種聲明不該被過多地使用。

dir()函數(shù)dir()函數(shù)一個(gè)排好序的字符串列表,內(nèi)容是一個(gè)模塊里定義過的名字。返回的列表容納了在一個(gè)模塊里定義的所有模塊,變量和函數(shù)。如下一個(gè)簡單的實(shí)例:

!/usr/bin/python# -- coding: UTF-8 -- # 導(dǎo)入內(nèi)置math模塊import math

content = dir(math)
print content;

['doc', 'file', 'name', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log','log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']

13.面向?qū)ο缶幊?/p>

Python 面向?qū)ο驪ython從設(shè)計(jì)之初就已經(jīng)是一門面向?qū)ο蟮恼Z言,正因?yàn)槿绱?,在Python中創(chuàng)建一個(gè)類和對(duì)象是很容易的。本章節(jié)我們將詳細(xì)介紹Python的面向?qū)ο缶幊獭H绻阋郧皼]有接觸過面向?qū)ο蟮木幊陶Z言,那你可能需要先了解一些面向?qū)ο笳Z言的一些基本特征,在頭腦里頭形成一個(gè)基本的面向?qū)ο蟮母拍睿@樣有助于你更容易的學(xué)習(xí)Python的面向?qū)ο缶幊?。接下來我們先來簡單的了解下面向?qū)ο蟮囊恍┗咎卣鳌?/p>

面向?qū)ο蠹夹g(shù)簡介:

類(Class): 用來描述具有相同的屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法。對(duì)象是類的實(shí)例。類變量:類變量在整個(gè)實(shí)例化的對(duì)象中是公用的。類變量定義在類中且在函數(shù)體之外。類變量通常不作為實(shí)例變量使用。數(shù)據(jù)成員:類變量或者實(shí)例變量用于處理類及其實(shí)例對(duì)象的相關(guān)的數(shù)據(jù)。方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對(duì)其進(jìn)行改寫,這個(gè)過程叫方法的覆蓋(override),也稱為方法的重寫。實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類。繼承:即一個(gè)派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個(gè)派生類的對(duì)象作為一個(gè)基類對(duì)象對(duì)待。例如,有這樣一個(gè)設(shè)計(jì):一個(gè)Dog類型的對(duì)象派生自Animal類,這是模擬"是一個(gè)(is-a)"關(guān)系(例圖,Dog是一個(gè)Animal)。實(shí)例化:創(chuàng)建一個(gè)類的實(shí)例,類的具體對(duì)象。方法:類中定義的函數(shù)。對(duì)象:通過類定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例。對(duì)象包括兩個(gè)數(shù)據(jù)成員(類變量和實(shí)例變量)和方法。

類的創(chuàng)建于實(shí)例化

使用class語句來創(chuàng)建一個(gè)新類,class之后為類的名稱并以冒號(hào)結(jié)尾,類的幫助信息可以通過ClassName.doc查看。class_suite 由類成員,方法,數(shù)據(jù)屬性組成。

!/usr/bin/python# -- coding: UTF-8 --

class Employee:

'所有員工的基類'

empCount = 0   
def __init__(self, name, salary):      
    self.name = name      
    self.salary = salary      
    Employee.empCount += 1      
def displayCount(self):     
    print "Total Employee %d" % Employee.empCount   
def displayEmployee(self):      
print "Name : ", self.name,  ", Salary: ", self.salary

empCount變量是一個(gè)類變量,它的值將在這個(gè)類的所有實(shí)例之間共享。你可以在內(nèi)部類或外部類使用Employee.empCount訪問。第一種方法init()方法是一種特殊的方法,被稱為類的構(gòu)造函數(shù)或初始化方法,當(dāng)創(chuàng)建了這個(gè)類的實(shí)例時(shí)就會(huì)調(diào)用該方法

要?jiǎng)?chuàng)建一個(gè)類的實(shí)例,你可以使用類的名稱,并通過init方法接受參數(shù)。

"創(chuàng)建 Employee 類的第一個(gè)對(duì)象"emp1 = Employee("Zara", 2000)"創(chuàng)建 Employee 類的第二個(gè)對(duì)象"emp2 = Employee("Manni", 5000)

訪問屬性您可以使用點(diǎn)(.)來訪問對(duì)象的屬性。使用如下類的名稱訪問類變量:

emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

可以添加,刪除,修改類的屬性,如下所示:

emp1.age = 7 # 添加一個(gè) 'age'
屬性emp1.age = 8 # 修改 'age' 屬性
del emp1.age # 刪除 'age' 屬性

也可以使用以下函數(shù)的方式來訪問屬性

getattr(obj, name[, default]) : 訪問對(duì)象的屬性。
hasattr(obj,name) : 檢查是否存在一個(gè)屬性。
setattr(obj,name,value) : 設(shè)置一個(gè)屬性。如果屬性不存在,會(huì)創(chuàng)建一個(gè)新屬性。
delattr(obj, name) : 刪除屬性。
hasattr(emp1, 'age') # 如果存在 'age' 屬性返回 True。
getattr(emp1, 'age') # 返回 'age' 屬性的值
setattr(emp1, 'age', 8) # 添加屬性 'age' 值為 8
delattr(empl, 'age') # 刪除屬性 'age'

Python內(nèi)置類屬性
dict : 類的屬性(包含一個(gè)字典,由類的數(shù)據(jù)屬性組成)
doc :類的文檔字符串name: 類名
module: 類定義所在的模塊(類的全名是'main.className',如果類位于一個(gè)導(dǎo)入模塊mymod中,那么className.module 等于 mymod)
bases : 類的所有父類構(gòu)成元素(包含了一個(gè)由所有父類組成的元組)

14.異常處理

異常即是一個(gè)事件,該事件會(huì)在程序執(zhí)行過程中發(fā)生,影響了程序的正常執(zhí)行。一般情況下,在Python無法正常處理程序時(shí)就會(huì)發(fā)生一個(gè)異常。異常是Python對(duì)象,表示一個(gè)錯(cuò)誤。當(dāng)Python腳本發(fā)生異常時(shí)我們需要捕獲處理它,否則程序會(huì)終止執(zhí)行。

捕捉異??梢允褂胻ry/except語句。
try/except語句用來檢測try語句塊中的錯(cuò)誤,從而讓except語句捕獲異常信息并處理。如果你不想在異常發(fā)生時(shí)結(jié)束你的程序,只需在try里捕獲它。語法:以下為簡單的try....except...else的語法:

try:?<語句>  
      #運(yùn)行別的代碼?
except <名字>:?
    <語句>        
    #如果在try部份引發(fā)了'name'異常?
except <名字>,<數(shù)據(jù)>:?
    <語句>        
    #如果引發(fā)了'name'異常,獲得附加的數(shù)據(jù)?
else:?<語句>       
    #如果沒有異常發(fā)生

15.場景案例:

python的faker模塊

在軟件需求、開發(fā)、測試過程中,有時(shí)候需要使??些測試數(shù)據(jù),針對(duì)這種情況,我們?般要么使?已有的系統(tǒng)數(shù)據(jù),要么需要?動(dòng)制造?些數(shù)據(jù)。由于現(xiàn)在的業(yè)務(wù)系統(tǒng)數(shù)據(jù)多種多樣,千變?nèi)f化。在?動(dòng)制造數(shù)據(jù)的過程中,可能需要花費(fèi)?量精?和?作量,此項(xiàng)?作既繁復(fù)?容易出錯(cuò),?如要構(gòu)造?批?戶三要素(姓名、?機(jī)號(hào)、?份證)、構(gòu)造?批銀?卡數(shù)據(jù)、或構(gòu)造?批地址通訊錄等。

Faker是什么Faker是?個(gè)Python包,主要?來創(chuàng)建偽數(shù)據(jù),使?Faker包,?需再?動(dòng)?成或者?寫隨機(jī)數(shù)來?成數(shù)據(jù),只需要調(diào)?Faker提供的?法,即可完成數(shù)據(jù)的?成。

pyhon的faker模塊比較簡單,從faker模塊倒入這個(gè)類,然后實(shí)例化這個(gè)類就可以使用了

from faker import Faker

faker=Faker()

name=faker.name()

address=faker.address()

print(name)

print(address)

輸出信息

Ashely Love

074 Lee Suilt 644

faker常用模塊舉例:

  • fake.address():完整地址,比如海南省成市豐都深圳路p座 425541
  • fake.street_address():街道+地址,比如興城路A座
  • fake.street_name():街道名,比如宜都街
  • fake.city_name():城市名,比如蘭州
  • fake.city():城市,比如蘭州市
  • fake.province():省份名,比如陜西省
  • fake.postcode():郵編
  • fake.country():國家
  • fake.company():公司名,比如惠派國際公司信息有限公司
  • fake.company_suffix():公司名后綴(公司性質(zhì)),比如網(wǎng)絡(luò)有限公司
  • fake.company_prefix():公司名前綴,比如鑫博騰飛

faker模塊 完整案例:

from faker import Faker
import xlwt
import random

faker = Faker("zh_CN")
gender = ["男", "女"]
education = ["小學(xué)", "初中", "高中", "大專", "大學(xué)本科", "研究生"]
asset = ["私人銀行級(jí):>800萬元", "七星級(jí):600~800萬元", "六星級(jí):100~600萬元", "五星級(jí):20~100萬元",
"四星級(jí):5~20萬元", "三星級(jí):1~20萬元", "二星級(jí):<1萬元", "準(zhǔn)星級(jí):0"]
risk_tolerance = ["A1(保守型)", "A2(穩(wěn)健型)", "A3(平衡型)", "A4(成長型)", "A5(進(jìn)取型)"]

wb = xlwt.Workbook(encoding='utf-8')
sheet1 = wb.add_sheet('客戶')
head_data = ['姓名', '性別', '年齡', '學(xué)歷', '電話號(hào)', '資產(chǎn)等級(jí)', '風(fēng)險(xiǎn)承受能力等級(jí)']
for head in head_data:
sheet1.write(0, head_data.index(head), head)

for i in range(1, 100):
sheet1.write(i, 0, faker.name())
sheet1.write(i, 1, random.choice(gender))
sheet1.write(i, 2, random.randint(18, 70))
sheet1.write(i, 3, random.choice(education))
sheet1.write(i, 4, faker.phone_number())
sheet1.write(i, 5, random.choice(asset))
sheet1.write(i, 6, random.choice(risk_tolerance))
wb.save('客戶.xls')

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容