久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python提供的一些相當(dāng)實(shí)用而靈活的通用數(shù)據(jù)結(jié)構(gòu)

 老三的休閑書屋 2020-04-15

拙劣的程序員擔(dān)心代碼。好的程序員擔(dān)心數(shù)據(jù)結(jié)構(gòu)及它們的關(guān)系,。

——林納斯·托瓦茲

本章介紹Python的基本數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),,它們按照如下方式組織。

基本數(shù)據(jù)類型

3.1節(jié)介紹整數(shù),、浮點(diǎn)數(shù)和字符串等基本數(shù)據(jù)類型,。

基本數(shù)據(jù)結(jié)構(gòu)

3.2節(jié)介紹Python的基本數(shù)據(jù)結(jié)構(gòu)(例如List對(duì)象)并闡述控制結(jié)構(gòu)、函數(shù)式編程范型以及匿名函數(shù),。

本章的主旨是提供Python數(shù)據(jù)類型和結(jié)構(gòu)細(xì)節(jié)的一般介紹,。如果您有其他編程語言(如C或者M(jìn)atlab)的背景,應(yīng)該能夠輕松地掌握Python使用方法帶來的差異,。本章介紹的主題是后續(xù)章節(jié)的重要基礎(chǔ),,涵蓋了以下數(shù)據(jù)類型與結(jié)構(gòu)。

Python提供的一些相當(dāng)實(shí)用而靈活的通用數(shù)據(jù)結(jié)構(gòu)

3.1 基本數(shù)據(jù)類型

Python是一種動(dòng)態(tài)類型的語言,,這意味著,,Python解釋程序在運(yùn)行時(shí)推斷對(duì)象的類型。C等編譯語言通常是靜態(tài)類型語言,,在這類語言中,對(duì)象類型必須在編譯之前與對(duì)象綁定[1],。

3.1.1 整數(shù)

最基本的數(shù)據(jù)類型是整數(shù)int:

In [1]: a = 10 type(a)Out[1]: int

內(nèi)建函數(shù)type為所有使用標(biāo)準(zhǔn)和內(nèi)建類型的對(duì)象,、新創(chuàng)建的類及對(duì)象提供類型信息。在后一種情況下,,提供的信息取決于程序員存儲(chǔ)在類中的描述,。有一種說法:“在Python中,一切都是對(duì)象,?!边@意味著,即使我們剛剛定義的簡單對(duì)象int也有內(nèi)建方法,。例如,,您可以調(diào)用bit_length方法,獲得表現(xiàn)整數(shù)對(duì)象所需的位數(shù):

In [2]: a.bit_length()Out[2]: 4

您將會(huì)看到,我們?yōu)樵搶?duì)象所賦的整數(shù)值越大,,需要的位數(shù)就越多:

In [3]: a = 100000 a.bit_length()Out[3]: 17

一般來說,,這類方法很多,很難記住所有類和對(duì)象的所有方法,。高級(jí)Python環(huán)境(如IPython)提供Tab鍵完成功能,,以顯示對(duì)象連接的所有方法。您只需要輸入對(duì)象名和一個(gè)點(diǎn)(如a.)然后按下Tab鍵,,就會(huì)提供一組可以在該對(duì)象上調(diào)用的方法,。也可以使用Python內(nèi)建函數(shù)dir顯示任何對(duì)象屬性和方法的完整列表。

Python的特殊性之一是整數(shù)可以任意大,。例如,,考慮天文數(shù)字10100。Python處理這樣大的數(shù)毫無問題,,這從技術(shù)上說是一個(gè)很“長”的對(duì)象:

In [4]: googol = 10 ** 100        googolOut[4]:  1000000000000000000000000000000000000000000000000000000000000        000000000000000000000000000000000000000In [5]: googol.bit_length()Out[5]: 333

大整數(shù)

Python整數(shù)可以為任意大,。解釋程序簡單地使用所需的位/字節(jié)數(shù)就可表現(xiàn)數(shù)值。

整數(shù)的算術(shù)運(yùn)算也很容易實(shí)現(xiàn):

In [6]: 1 + 4Out[6]: 5In [7]: 1 / 4Out[7]: 0.25In [8]: type(1 / 4)Out[8]: float
3.1.2 浮點(diǎn)數(shù)

為了讓上一個(gè)表達(dá)式返回所需的值——0.25[2],,我們必須在浮點(diǎn)(float)對(duì)象上操作,,這很自然地把我們帶到下一種基本數(shù)據(jù)類型。在整數(shù)值上加一個(gè)點(diǎn)比如1.或者1.0,,會(huì)導(dǎo)致Python將該對(duì)象解釋為浮點(diǎn)數(shù),。涉及浮點(diǎn)數(shù)的表達(dá)式通常也必須返回一個(gè)浮點(diǎn)對(duì)象[3]:

In [9]: 1.6 / 4Out[9]: 0.4In [10]: type (1.6 / 4)Out[10]: float

浮點(diǎn)數(shù)與通常不精確的實(shí)數(shù)計(jì)算機(jī)表現(xiàn)形式關(guān)系更大,取決于所采用的具體技術(shù)方法,。為了說明其中的含義,,我們定義另一個(gè)浮點(diǎn)對(duì)象b,這種浮點(diǎn)對(duì)象在內(nèi)部總是只表現(xiàn)為某種精度,。將b加上0.1時(shí),,這一點(diǎn)變得很明顯:

In [11]: b = 0.35 type(b)Out[11]: floatIn [12]: b + 0.1Out[12]: 0.44999999999999996

出現(xiàn)以上結(jié)果的原因是浮點(diǎn)數(shù)在計(jì)算機(jī)內(nèi)部以二進(jìn)制形式表示;也就是說,,十進(jìn)制數(shù)n(0<n<1)表現(xiàn)為如下形式:

Python提供的一些相當(dāng)實(shí)用而靈活的通用數(shù)據(jù)結(jié)構(gòu)

對(duì)于某些浮點(diǎn)數(shù),,二進(jìn)制表現(xiàn)形式可能包含大量元素甚至是一個(gè)無限系列。但是,,考慮到用于表達(dá)這種數(shù)值的位數(shù)是固定的——也就是表現(xiàn)系列中的項(xiàng)目固定,,因此結(jié)果是不精確的。其他數(shù)值可以完整表現(xiàn),,因此在可用位數(shù)有限時(shí)也可以精確地被存儲(chǔ),。考慮如下例子:

In [13]: c = 0.5         c.as_integer_ratio()Out[13]: (1, 2)

0.5可以精確保存,,因?yàn)樗邆渚_(有限)的二進(jìn)制表示:0.5=1/2,。但是,b=0.35和預(yù)期的實(shí)數(shù)0.35=7/20不同:

In [14]: b.as_integer_ratio()Out[14]: (3152519739159347, 9007199254740992)

精度取決于表示數(shù)值所用的位數(shù)。一般來說,,Python運(yùn)行的所有平臺(tái)使用IEEE 754雙精度標(biāo)準(zhǔn)(64位)作為內(nèi)部表示,,這相當(dāng)于15位數(shù)字的相對(duì)精度。

由于這個(gè)主題在金融應(yīng)用領(lǐng)域中很重要,,所以有時(shí)候必須確保數(shù)值的精確(至少盡可能達(dá)到最佳),。例如,在加總一組數(shù)量很多的數(shù)值時(shí),,這個(gè)問題就可能很重要,。在這種情況下,某個(gè)種類或者幅度的表示誤差可能匯聚起來,,從而造成和基準(zhǔn)值的顯著偏差,。

decimal模塊為浮點(diǎn)數(shù)提供了任意精確度的對(duì)象,以及使用這些數(shù)值時(shí)處理精度問題的多個(gè)選項(xiàng):

In [15]: import decimal         from decimal import DecimalIn [16]: decimal.getcontext()Out[16]: Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999,          Emax=999999, capitals=1, clamp=0, flags=[], traps=         [InvalidOperation, DivisionByZero, Overflow])In [17]: d = Decimal(1) / Decimal (11)dOut[17]: Decimal('0.09090909090909090909090909091')

您可以改變Context對(duì)象的各個(gè)屬性值,,從而改變表示的精度:

In [18]: decimal.getcontext().prec = 4?In [19]: e = Decimal(1) / Decimal (11) eOut[19]: Decimal('0.09091')In [20]: decimal.getcontext().prec = 50?In [21]: f = Decimal(1) / Decimal (11) fOut[21]: Decimal('0.090909090909090909090909090909090909090909090909091')

? 精度低于默認(rèn)值,。

? 精度高于默認(rèn)值。

如果有必要,,精度可以這樣按照具體的問題進(jìn)行調(diào)整,,人們可以使用不同精度的浮點(diǎn)對(duì)象進(jìn)行運(yùn)算:

In [22]: g = d + e + f         gOut[22]: Decimal('0.27272818181818181818181818181909090909090909090909')

任意精度浮點(diǎn)數(shù)

decimal模塊可提供任意精度浮點(diǎn)數(shù)對(duì)象。在金融領(lǐng)域中,,確保高精度,、超出64位雙精度標(biāo)準(zhǔn)有時(shí)是必要的。

3.1.3 布爾值

在編程中,,比較或者邏輯表達(dá)式(如4 > 3, 4.5 <= 3.25 或 (4 > 3) and (3 > 2))得到的輸出為True或者False,,這是兩個(gè)重要的Python關(guān)鍵字。其他重要的關(guān)鍵字有def,、for和if等,。Python的關(guān)鍵字列表可以在keyword模塊中找到:

In [23]: import keywordIn [24]: keyword.kwlistOut[24]: ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

True和Flase的數(shù)據(jù)類型為bool,表示“布爾值”(Boolean Value),。將Python的比較運(yùn)算符應(yīng)用到相同操作數(shù)時(shí)結(jié)果為布爾對(duì)象:

In [25]: 4 > 3?Out[25]: TrueIn [26]: type(4 > 3)Out[26]: boolIn [27]: type(False)Out[27]: boolIn [28]: 4 >= 3?Out[28]: TrueIn [29]: 4 < 3?Out[29]: FalseIn [30]: 4 <= 3?Out[30]: FalseIn [31]: 4 == 3?Out[31]: FalseIn [32]: 4 != 3?Out[32]: True

? 大于,。

? 大于或等于。

? 小于,。

? 小于或等于。

? 等于,。

? 不等于,。

邏輯運(yùn)算往往應(yīng)用到布爾對(duì)象上,然后得出另一個(gè)布爾對(duì)象:

In [33]: True and TrueOut[33]: TrueIn [34]: True and FalseOut[34]: FalseIn [35]: False and FalseOut[35]: FalseIn [36]: True or TrueOut[36]: TrueIn [37]: True or FalseOut[37]: TrueIn [38]: False or FalseOut[38]: FalseIn [39]: not TrueOut[39]: FalseIn [40]: not FalseOut[40]: True

當(dāng)然,,兩類運(yùn)算符往往組合使用:

In [41]: (4 > 3) and (2 > 3)Out[41]: FalseIn [42]: (4 == 3) or (2 != 3)Out[42]: TrueIn [43]: not (4 != 4)Out[43]: TrueIn [44]: (not (4 != 4)) and (2 == 3)Out[44]: False

布爾值的重要應(yīng)用領(lǐng)域之一是通過其他Python關(guān)鍵字(如if或while,,本章后面將有更多示例)控制代碼流程:

In [45]: if 4 > 3: ? print('condition true') ? condition trueIn [46]: i = 0 ? while i < 4: ? print('condition true, i = ', i) ? i += 1 ? condition true, i = 0 condition true, i = 1 condition true, i = 2 condition true, i = 3

? 如果條件為真,執(zhí)行以下代碼。

? 如果條件為真,,執(zhí)行這段代碼,。

? 將參數(shù)i初始化為0。

? 只要條件為0,,就執(zhí)行并重復(fù)以下代碼,。

? 打印文本和參數(shù)i的值。

? 將參數(shù)增加1,;i += 1與i = i + 1等價(jià),。

從數(shù)值上講,Python為False賦值0,,為True賦值1,。當(dāng)通過bool()函數(shù)將數(shù)值轉(zhuǎn)換成bool對(duì)象時(shí),0值轉(zhuǎn)換成False,,其他所有值都轉(zhuǎn)換為True:

In [47]: int(True)Out[47]: 1In [48]: int(False)Out[48]: 0In [49]: float(True)Out[49]: 1.0In [50]: float(False)Out[50]: 0.0In [51]: bool(0)Out[51]: FalseIn [52]: bool(0.0)Out[52]: FalseIn [53]: bool(1)Out[53]: TrueIn [54]: bool(10.5)Out[54]: TrueIn [55]: bool(-2)Out[55]: True
3.1.4 字符串

既然我們已經(jīng)可以表示自然和浮點(diǎn)數(shù),,現(xiàn)在就可以轉(zhuǎn)向文本了。Python中表示文本的基本數(shù)據(jù)類型是字符串——str,,字符串對(duì)象有一些真正實(shí)用的內(nèi)建方法,。實(shí)際上,Python通常被視為處理任何類型,、任何尺寸文本文件的很好選擇,。字符串對(duì)象通常由單引號(hào)或者雙引號(hào)定義或者使用str()函數(shù)轉(zhuǎn)換而來(也就是使用對(duì)象的標(biāo)準(zhǔn)或者用戶定義的字符串表示):

In [56]: t = 'this is a string object'

舉個(gè)內(nèi)建方法的例子,您可以將對(duì)象中的第一個(gè)詞改為首字母大寫:

In [57]: t.capitalize()Out[57]: 'This is a string object'

也可以將字符串拆分成單個(gè)詞,,以獲得包含所有單詞的列表對(duì)象:

In [58]: t.split()Out[58]: ['this', 'is', 'a', 'string', 'object']

您還可以搜索一個(gè)單詞,,如果搜索成功,就可以得到該詞第一個(gè)字母的位置(即索引值):

In [59]: t.find('string')Out[59]: 10

如果這個(gè)單詞不在字符串對(duì)象中,,該方法返回-1:

In [60]: t.find('Python')Out[60]: -1

替換字符串中的字符是典型的任務(wù),,可以用replace()方法簡單地完成:

In [61]: t.replace(' ', '|')Out[61]: 'this|is|a|string|object'

字符串“剝離”(stripping)操作——?jiǎng)h除某些前導(dǎo)或者后綴字符也是必要的:

In [62]: 'http://www.'.strip('htp:/')Out[62]: 'www.'

表3-1列出了字符串對(duì)象的一些實(shí)用方法。

Python提供的一些相當(dāng)實(shí)用而靈活的通用數(shù)據(jù)結(jié)構(gòu)

Unicode字符串

Python 2.7(本書第1版使用)到Python 3.7(本書第2版使用)的根本變化之一是字符串對(duì)象的編碼與解碼方法,,以及Unicode的引入,。本章不介紹這方面的細(xì)節(jié);本書主要處理數(shù)值數(shù)據(jù)和包含英語單詞的標(biāo)準(zhǔn)字符串,,這種忽略似乎是合理的,。

3.1.5 題外話:打印和字符串替換

打印字符串對(duì)象或者其他Python對(duì)象的字符串表示,通常由print()函數(shù)完成:

In [63]: print('Python for Finance') ?         Python for FinanceIn [64]: print(t) ?         this is a string objectIn [65]: i = 0         while i < 4:             print(i) ?             i += 1         0         1         2         3In [66]: i = 0         while i < 4:             print(i, end='|') ?             i += 1         0|1|2|3|

? 打印一個(gè)str對(duì)象,。

? 打印變量名引用的字符串對(duì)象,。

? 打印整數(shù)對(duì)象的字符串表示。

? 指定打印的結(jié)束符,,默認(rèn)為前面見到的換行符(\n)

Python提供了強(qiáng)大的字符串替換運(yùn)算,。我們可以采用舊方法通過%字符,,也可以采用通過花括號(hào)({})和format()函數(shù)的新方法。兩種方法在實(shí)踐中都適用,。本節(jié)無法提供所有選項(xiàng)的說明,,但以下代碼片段可以展示一些重要的選項(xiàng)。首先是舊方法:

In [67]: 'this is an integer %d' % 15 ?Out[67]: 'this is an integer 15'In [68]: 'this is an integer %4d' % 15 ?Out[68]: 'this is an integer 15'In [69]: 'this is an integer %04d' % 15 ?Out[69]: 'this is an integer 0015'In [70]: 'this is a float %f' % 15.3456 ?Out[70]: 'this is a float 15.345600'In [71]: 'this is a float %.2f' % 15.3456 ?Out[71]: 'this is a float 15.35'In [72]: 'this is a float %8f' % 15.3456 ?Out[72]: 'this is a float 15.345600'In [73]: 'this is a float %8.2f' % 15.3456 ?Out[73]: 'this is a float 15.35'In [74]: 'this is a float %08.2f' % 15.3456 ?Out[74]: 'this is a float 00015.35'In [75]: 'this is a string %s' % 'Python' ?Out[75]: 'this is a string Python'In [76]: 'this is a string %10s' % 'Python' ?Out[76]: 'this is a string Python'

? 整數(shù)對(duì)象替換,。

? 固定數(shù)量的字符

? 必要時(shí)加上前導(dǎo)0,。

? 浮點(diǎn)數(shù)對(duì)象替換。

? 固定小數(shù)位數(shù),。

? 固定數(shù)量字符(以及填充的小數(shù)位數(shù)),。

? 固定數(shù)量字符和小數(shù)位數(shù)…

? 必要時(shí)加上前導(dǎo)0。

? 字符串對(duì)象替換,。

? 固定字符數(shù),。

下面是同樣的例子,但用新方法實(shí)現(xiàn),。注意某些位置輸出的細(xì)微差別:

In [77]: 'this is an integer {:d}'.format(15)Out[77]: 'this is an integer 15'In [78]: 'this is an integer {:4d}'.format(15)Out[78]: 'this is an integer 15'In [79]: 'this is an integer {:04d}'.format(15)Out[79]: 'this is an integer 0015'In [80]: 'this is a float {:f}'.format(15.3456)Out[80]: 'this is a float 15.345600'In [81]: 'this is a float {:.2f}'.format(15.3456)Out[81]: 'this is a float 15.35'In [82]: 'this is a float {:8f}'.format(15.3456)Out[82]: 'this is a float 15.345600'In [83]: 'this is a float {:8.2f}'.format(15.3456)Out[83]: 'this is a float 15.35'In [84]: 'this is a float {:08.2f}'.format(15.3456)Out[84]: 'this is a float 00015.35'In [85]: 'this is a string {:s}'.format('Python')Out[85]: 'this is a string Python'In [86]: 'this is a string {:10s}'.format('Python')Out[86]: 'this is a string Python '

字符串替換在多次打印更新的數(shù)據(jù)時(shí)特別有用,,例如在while循環(huán)中:

In [87]: i = 0 while i < 4: print('the number is %d' % i) i += 1 the number is 0 the number is 1 the number is 2 the number is 3In [88]: i = 0 while i < 4: print('the number is {:d}'.format(i)) i += 1 the number is 0 the number is 1 the number is 2 the number is 3
3.1.6 題外話:正則表達(dá)式

正則表達(dá)式是處理字符串對(duì)象的一個(gè)強(qiáng)大工具。Python在re模塊中提供了這個(gè)功能:

In [89]: import re

假定您現(xiàn)在面對(duì)一個(gè)大的文本文件,,例如逗號(hào)分隔值(CSV)文件,,其中包含了某些事件序列和相應(yīng)的日期-時(shí)間信息。日期-時(shí)間信息多半以Python無法直接解釋的格式提供,。然而,,日期-時(shí)間信息通常可以通過正則表達(dá)式描述,??紤]如下的字符串對(duì)象,它包含3個(gè)日期-時(shí)間元素,、3個(gè)整數(shù)和3個(gè)字符串,。注意,3個(gè)引號(hào)可以定義多行字符串:

In [90]: series = ''' '01/18/2014 13:00:00', 100, '1st'; '01/18/2014 13:30:00', 110, '2nd'; '01/18/2014 14:00:00', 120, '3rd' '''

下面的正則表達(dá)式描述了上述字符串對(duì)象提供的日期-時(shí)間信息格式[4]:

In [91]: dt = re.compile(''[0-9/:\s]+'') # datetime

使用上述正則表達(dá)式,,我們可以查找所有日期-時(shí)間元素,。一般來說,對(duì)字符串對(duì)象應(yīng)用正則表達(dá)式還能帶來典型解析任務(wù)性能的提升,。

In [92]: result = dt.findall(series) resultOut[92]: [''01/18/2014 13:00:00'', ''01/18/2014 13:30:00'', ''01/18/2014 14:00:00'']

正則表達(dá)式

解析字符串對(duì)象時(shí),,若考慮使用正則表達(dá)式,可以為相關(guān)操作帶來便利和高性能,。

然后,,可以對(duì)結(jié)果字符串對(duì)象進(jìn)行解析,生成Python的日期時(shí)間(datetime)對(duì)象(用Python處理日期和時(shí)間數(shù)據(jù)的概述參見附錄A),。要解析包含日期時(shí)間信息的字符串對(duì)象,,我們必須提供解析方法的信息——同樣是一個(gè)字符串對(duì)象:

In [93]: from datetime import datetime         pydt = datetime.strptime(result[0].replace(''', ''),                                  '%m/%d/%Y %H:%M:%S')         pydtOut[93]: datetime.datetime(2014, 1, 18, 13, 0)In [94]: print(pydt)         2014-01-18 13:00:00In [95]: print(type(pydt))         <class 'datetime.datetime'>

后續(xù)內(nèi)容會(huì)提供關(guān)于日期—時(shí)間數(shù)據(jù)、這些數(shù)據(jù)的處理以及datetime對(duì)象及其方法的更多信息?,F(xiàn)在我們只是預(yù)覽一下金融中的這個(gè)重要主題,。

3.2 基本數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)是包含其他對(duì)象(可能很多)的對(duì)象。Python提供了以下內(nèi)建結(jié)構(gòu),。

元組(tuple)

任意對(duì)象的集合,;只有少數(shù)可用方法。

列表(list)

任意對(duì)象的集合,;有許多可用方法,。

字典(dict)

鍵-值存儲(chǔ)對(duì)象。

集合(set)

其他獨(dú)特對(duì)象的無序集合對(duì)象,。

3.2.1 元組

元組(tuple)是一種高級(jí)的數(shù)據(jù)結(jié)構(gòu),,其應(yīng)用相當(dāng)簡單有限。它通過圓括號(hào)來提供對(duì)象定義:

In [96]: t = (1, 2.5, 'data') type(t)Out[96]: tuple

也可以去掉括號(hào),,提供以逗號(hào)分隔的多個(gè)對(duì)象:

In [97]: t = 1, 2.5, 'data'         type(t)Out[97]: tuple

和Python中幾乎所有的數(shù)據(jù)結(jié)構(gòu)相似,,元組有內(nèi)建的索引,利用該索引可以讀取元組的單個(gè)或者多個(gè)元素,。重要的是記住Python使用零起點(diǎn)編號(hào),,元組的第3個(gè)元素在索引位置2上:

In [98]: t[2]Out[98]: 'data'In [99]: type(t[2])Out[99]: str

零起點(diǎn)編號(hào)

與MATLAB等其他編程語言不同,Python使用零起點(diǎn)編號(hào)方案,。例如,,元組對(duì)象的第一個(gè)元素索引值為0。

這種對(duì)象類型只有兩個(gè)特殊方法:count()和index(),。第一個(gè)方法計(jì)算某個(gè)對(duì)象的出現(xiàn)次數(shù),,第二個(gè)方法給出對(duì)象第一次出現(xiàn)位置的索引值:

In [100]: t.count('data')Out[100]: 1In [101]: t.index(1)Out[101]: 0

元組對(duì)象是不可變對(duì)象,這意味著一旦定義,,它們就不容易更改,。

3.2.2 列表

與元組對(duì)象相比,列表(list)類型的對(duì)象更靈活,、更強(qiáng)大,。從金融角度看,許多工作只能用列表對(duì)象完成,,例如存儲(chǔ)股票報(bào)價(jià)和附加新數(shù)據(jù),。列表對(duì)象通過方括號(hào)定義,其基本功能和行為與元組類似:

In [102]: l = [1, 2.5, 'data'] l[2]Out[102]: 'data'

列表對(duì)象也可以使用list()函數(shù)定義或者轉(zhuǎn)換,。下面的代碼通過轉(zhuǎn)換前一個(gè)例子中的元組對(duì)象來生成新的列表對(duì)象:

In [103]: l = list(t)          lOut[103]: [1, 2.5, 'data']In [104]: type(l)Out[104]: list

除了元組對(duì)象的特性之外,,列表對(duì)象還可以通過不同的方法來擴(kuò)展和縮小。換句話說,,字符串和元組對(duì)象是不可變序列對(duì)象(具有索引),,一經(jīng)創(chuàng)建不能更改,,而列表對(duì)象是可變的,可以通過不同操作更改,。您可以在現(xiàn)有列表對(duì)象中附加一個(gè)或者多個(gè)列表對(duì)象:

In [105]: l.append([4, 3]) ? lOut[105]: [1, 2.5, 'data', [4, 3]]In [106]: l.extend([1.0, 1.5, 2.0]) ? lOut[106]: [1, 2.5, 'data', [4, 3], 1.0, 1.5, 2.0]In [107]: l.insert(1, 'insert') ? lOut[107]: [1, 'insert', 2.5, 'data', [4, 3], 1.0, 1.5, 2.0]In [108]: l.remove('data') ? lOut[108]: [1, 'insert', 2.5, [4, 3], 1.0, 1.5, 2.0]In [109]: p = l.pop(3) ? print(l, p) [1, 'insert', 2.5, 1.0, 1.5, 2.0] [4, 3]

? 在尾部附加列表對(duì)象,。

? 附加列表對(duì)象元素。

? 在索引位置之前插入對(duì)象,。

? 刪除第一次出現(xiàn)的對(duì)象,。

? 刪除并返回索引位置的對(duì)象。

切片操作也很容易實(shí)現(xiàn),。這里的切片(slicing)指的是將數(shù)據(jù)集分解為(感興趣的)較小部分:

In [110]: l[2:5] ?Out[110]: [2.5, 1.0, 1.5]

? 返回的是第3~5個(gè)元素,。

表3-2提供了列表對(duì)象精選操作和方法的簡單說明。

Python提供的一些相當(dāng)實(shí)用而靈活的通用數(shù)據(jù)結(jié)構(gòu)

3.2.3 題外話:控制結(jié)構(gòu)

控制結(jié)構(gòu)(如for循環(huán))本身就是一個(gè)主題,,但是在Python中,,最好在列表對(duì)象基礎(chǔ)上理解它。這是因?yàn)椋貉h(huán)一般來說都在列表對(duì)象上進(jìn)行,,這與其他語言中的常用標(biāo)準(zhǔn)有很大不同,。看下面的例子,,for循環(huán)在列表對(duì)象l索引值為2~4的元素上進(jìn)行,,功能是打印各個(gè)元素的平方。注意第二行中縮進(jìn)(空白)的重要性:

In [111]: for element in l[2:5]: print(element ** 2) 6.25 1.0 2.25

與典型的基于計(jì)數(shù)器的循環(huán)相比,,上述循環(huán)提供了很高的靈活性,。基于計(jì)數(shù)器的循環(huán)也是Python的一個(gè)可選項(xiàng),,但是在(標(biāo)準(zhǔn))列表對(duì)象range的基礎(chǔ)上完成的:

In [112]: r = range(0, 8, 1) ?          rOut[112]: range(0, 8)In [113]: type(r)Out[113]: range

? 參數(shù)依次是起始值,、結(jié)束值和步長。

為了比較,,下面我們使用range實(shí)現(xiàn)同一個(gè)循環(huán):

In [114]: for i in range(2, 5): print(l[i] ** 2) 6.25 1.0 2.25

在列表上循環(huán)

在Python中,,你可以在任意列表對(duì)象上循環(huán),而不用管這些對(duì)象的內(nèi)容是什么,,這往往可以避免引入計(jì)數(shù)器,。

Python還提供了典型(條件)控制元素if、elif和else,。它們的用途與其他語言的相同:

In [115]: for i in range(1, 10):              if i % 2 == 0: ?                  print('%d is even' % i)              elif i % 3 == 0:                  print('%d is multiple of 3' % i)              else:                  print('%d is odd' % i)          1 is odd          2 is even          3 is multiple of 3          4 is even          5 is odd          6 is even          7 is odd          8 is even          9 is multiple of 3          % stands for modulo.

? %代表取模運(yùn)算,。

同樣,while提供了另一種流程控制手段:

In [116]: total = 0 while total < 100: total += 1 print(total) 100

Python的特殊性之一是所謂的列表推導(dǎo)(List Comprehension),。這種方法不在現(xiàn)有列表對(duì)象上循環(huán),,而是以緊湊的方式通過循環(huán)生成列表對(duì)象:

In [117]: m = [i ** 2 for i in range(5)]          mOut[117]: [0, 1, 4, 9, 16]

在某種意義上,它已經(jīng)提供了一種方法,,以較為隱含(而非顯式)的循環(huán)生成某種向量化代碼段(代碼向量化將在第4章和第5章中詳細(xì)討論),。

3.2.4 題外話:函數(shù)式編程

Python也提供一些用于函數(shù)式編程支持的工具——在一整組輸入(在我們的例子中是列表對(duì)象)上應(yīng)用某個(gè)函數(shù),。這些工具是過濾(filter)、映射(map)和歸納(reduce),。但是,,我們首先需要一個(gè)函數(shù)定義。從簡單的功能出發(fā),,考慮以下的函數(shù)f,它返回輸入x的平方數(shù):

In [118]: def f(x): return x ** 2 f(2)Out[118]: 4

當(dāng)然,,函數(shù)可能很復(fù)雜,,它可能有多個(gè)輸入(參數(shù)對(duì)象)甚至多個(gè)輸出(返回對(duì)象)??紤]以下函數(shù):

In [119]: def even(x):              return x % 2 == 0          even(3)Out[119]: False

返回對(duì)象是一個(gè)布爾值,。這樣的函數(shù)可以用map()應(yīng)用到整個(gè)列表對(duì)象:

In [120]: list(map(even, range(10)))Out[120]: [True, False, True, False, True, False, True, False, True, False]

為此,我們還可以使用lambda或者匿名函數(shù),,直接提供一個(gè)函數(shù)定義作為map()的參數(shù):

In [121]: list(map(lambda x: x ** 2, range(10)))Out[121]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

函數(shù)也可以用于過濾列表對(duì)象,。在下面的例子中,過濾器返回列表對(duì)象中匹配某個(gè)布爾條件(由even函數(shù)定義)的元素:

In [122]: list(filter(even, range(15)))Out[122]: [0, 2, 4, 6, 8, 10, 12, 14]

列表推導(dǎo),、函數(shù)式編程和匿名函數(shù)

在Python級(jí)別上盡可能避免循環(huán)被視為“好的習(xí)慣”,。列表推導(dǎo)和函數(shù)式編程工具(如map、filter和reduce)為編寫緊湊(一般來說也更易于理解)無循環(huán)代碼提供了很大幫助,。lambda或者匿名函數(shù)也是這方面的強(qiáng)大工具,。

3.2.5 字典

字典(dict)對(duì)象就是可以按照鍵碼(例如,可能是字符串對(duì)象)讀取的數(shù)據(jù)字典,,也是一種可變序列,,是所謂的鍵—值存儲(chǔ)。列表對(duì)象是有序且可排序的,,而字典對(duì)象通常是無序,、不可排序的[5]。示例最能夠說明字典和列表對(duì)象的不同之處,。字典對(duì)象定義用花括號(hào)實(shí)現(xiàn):

In [123]: d = {               'Name' : 'Angela Merkel',               'Country' : 'Germany',               'Profession' : 'Chancelor',               'Age' : 64               }          type(d)Out[123]: dictIn [124]: print(d['Name'], d['Age'])          Angela Merkel 64

同樣,,該類對(duì)象也有一些內(nèi)建方法:

In [125]: d.keys()Out[125]: dict_keys(['Name', 'Country', 'Profession', 'Age'])In [126]: d.values()Out[126]: dict_values(['Angela Merkel', 'Germany', 'Chancelor', 64])In [127]: d.items()Out[127]: dict_items([('Name', 'Angela Merkel'), ('Country', 'Germany'), ('Profession', 'Chancelor'), ('Age', 64)])In [128]: birthday = True if birthday:a d['Age'] += 1 print(d['Age']) 65

從字典對(duì)象中獲得迭代器(Iterator)對(duì)象有多種方法。這種對(duì)象在循環(huán)時(shí)的表現(xiàn)與列表對(duì)象的表現(xiàn)類似:

In [129]: for item in d.items():              print(item)          ('Name', 'Angela Merkel')          ('Country', 'Germany')          ('Profession', 'Chancelor')          ('Age', 65)In [130]: for value in d.values():              print(type(value))          <class 'str'>          <class 'str'>          <class 'str'>          <class 'int'>

本文截選自《Python金融大數(shù)據(jù)分析》第2版

本書總計(jì)分為5部分,,共21章,。第1部分介紹了Python在金融學(xué)中的應(yīng)用,其內(nèi)容涵蓋了Python用于金融行業(yè)的原因,、Python的基礎(chǔ)架構(gòu)和工具,,以及Python在計(jì)量金融學(xué)中的一些具體入門實(shí)例;第2部分介紹了Python的基礎(chǔ)知識(shí)以及Python中非常有名的庫NumPy和pandas工具集,,還介紹了面向?qū)ο缶幊?;?部分介紹金融數(shù)據(jù)科學(xué)的相關(guān)基本技術(shù)和方法,,包括數(shù)據(jù)可視化、輸入/輸出操作和數(shù)學(xué)中與金融相關(guān)的知識(shí)等,;第4部分介紹Python在算法交易上的應(yīng)用,,重點(diǎn)介紹常見算法,包括機(jī)器學(xué)習(xí),、深度神經(jīng)網(wǎng)絡(luò)等人工智能相關(guān)算法,;第5部分講解基于蒙特卡洛模擬開發(fā)期權(quán)及衍生品定價(jià)的應(yīng)用,其內(nèi)容涵蓋了估值框架的介紹,、金融模型的模擬,、衍生品的估值、投資組合的估值等知識(shí),。

本書適合對(duì)使用Python進(jìn)行大數(shù)據(jù)分析和處理感興趣的金融行業(yè)開發(fā)人員閱讀,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多