負(fù)基礎(chǔ)小白學(xué)習(xí)廖雪峰python教程記錄(三) 高級(jí)特性

高級(jí)特性

通過(guò)python的數(shù)據(jù)類型刀疙、語(yǔ)句和函數(shù),可以編寫程序扫倡。

構(gòu)造1-99的列表谦秧,可以通過(guò)循環(huán)實(shí)現(xiàn):

L=[]

n=1

while n<=99:

????L.append(n)

? ? n=n+2


切片

>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']

>>>L[0:3] (從索引0開(kāi)始取,取3個(gè)元素)

['Michael', 'Sarah', 'Tracy']

>>>L[:3]? (也可以省略0,默認(rèn)從頭開(kāi)始扔凸弧)?

>>>L[-2:]? (倒數(shù)第二個(gè)開(kāi)始取蚁袭,取到最后)

['Bob', 'Jack']

>>>L[-2:-1]? (倒數(shù)第二個(gè)取征懈,取1個(gè)元素)

['Bob']


>>> L = list(range(100))

>>> L

[0,1,2,3, ...,99]

前十個(gè)數(shù):

>>>L[:10]

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

后十個(gè)數(shù):

>>>L[-10:]

[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

前10個(gè)數(shù)石咬,每?jī)蓚€(gè)取一個(gè):

>>>L[:10:2]

[0, 2, 4, 6, 8]

所有數(shù),每5個(gè)取一個(gè):

>>>L[::5]

[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]


作業(yè)

去掉空格

def trim(s)

? ? while s==None:

? ? ? ? return '測(cè)試失敗'

? ? while s[:1] == ' ':

? ? ? ? s = s[1:]

? ? while s[-1:] == ' ':

? ? ? ? s = s[:-1]

? ? return s



迭代

通過(guò)for循環(huán)來(lái)遍歷list或tuple

dict也可以迭代卖哎。因?yàn)閐ict的存儲(chǔ)不是按照l(shuí)ist的方式順序排列鬼悠,所以,迭代出的結(jié)果順序很可能不一樣亏娜。

>>> d = {'a':1,'b':2,'c':3}

>>> for key in d:

... ????????print(key)

...

a

c

b


默認(rèn)情況下焕窝,dict迭代的是key。如果要迭代value维贺,可以用for value in d.values()它掂,如果要同時(shí)迭代key和value,可以用for k, v in d.items()

字符串的迭代

>>> for ch in 'ABC':

... ????????print(ch)

...

A

B

C


判斷是否為可迭代對(duì)象?collections模塊的Iterable類型判斷

>>> from collections import Iterable

>>> isinstance('abc', Iterable) # str是否可迭代

True

>>> isinstance([1,2,3], Iterable) # list是否可迭代

True

>>> isinstance(123, Iterable)? # 整數(shù)是否可迭代

False

enumerate函數(shù)可以把一個(gè)list變成索引-元素對(duì)

>>> for i, value in enumerate(['A','B','C']):

... print(i, value)

...

0 A

1 B

2 C


同時(shí)引用兩個(gè)變量

>>>for x,y in [(1,1),(2,4),(3,9)]:

...? ? ? ? print(x,y)

...

1 1

2 4

3 9

作業(yè)

def?findMinAndMax(L):

????if?L==[]:

????????return(None,None)

????max=min=L[0]

????for?n?in?L:

????????if?n>max:

????????????max=n?

????????if?n<min:

????????????min=n?

????return(min,max)


列表生成式

生成list?[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11))

>>>list(range(1, 11))

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成平方數(shù)溯泣。方法一(循環(huán)):

>>> L=[]

>>> for x in range(1,11):

...? ? L.append(x*x)

...

>>> L

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

方法二(列表生成式代替循環(huán)生成上面的list):

>>> [x*x for x in range(1,11)]

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

寫列表生成式時(shí)虐秋,把要生成的元素x * x放到前面,后面跟for循環(huán)垃沦,就可以把list創(chuàng)建出來(lái)

加上if判斷客给,這樣我們就可以篩選出僅偶數(shù)的平方:

>>> [x*x for x in range(1,11) if x%2==0]

[4, 16, 36, 64, 100]

使用兩層循環(huán):

>>> [m+n for m in 'ABC' for n in 'XYZ']

['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

同時(shí)迭代key和value:

>>> d={'x':'A','y':'B','z':'C'}

>>> [k+ '='+ v for k, v in d.items()]

['x=A', 'y=B', 'z=C']

最后把一個(gè)list中所有的字符串變成小寫/大寫:

>>> L=['LESLIE','IS','SO','CUTE']

>>> [s.lower() for s in L]

['leslie', 'is', 'so', 'cute']


>>> L=['leslie', 'is', 'so', 'cute']

>>> [s.upper() for s in L]

['LESLIE', 'IS', 'SO', 'CUTE']


不能在最后的if加上else:

>>> [x for x in range(1,11) if x %2==0 else 0]?

?File"<stdin>", line1

????[x for x in range(1,11) if x %2==0 else 0]?

?SyntaxError: invalid syntax

把if寫在for前面必須加else,否則報(bào)錯(cuò):

>>> [x if x %2==0 for x in range(1,11)]?

File"<stdin>", line1

????[x if x %2==0 for x in range(1,11)]?

SyntaxError: invalid syntax

for前面的if要加else:

>>> [x if x %2==0 else -x for x in range(1,11)]

[-1,2, -3,4, -5,6, -7,8, -9,10]

在一個(gè)列表生成式中肢簿,for前面的if ... else是表達(dá)式靶剑,而for后面的if是過(guò)濾條件,不能帶else池充。


作業(yè)

L1?=?['Hello',?'World',?18,?'Apple',?None]

L2=[x.lower()?for?x?in?L1?if?isinstance(x,str)==True]

print(L2)

生成器

一邊循環(huán)一邊計(jì)算的機(jī)制桩引,稱為生成器:generator

創(chuàng)建generator? 方法一:

把一個(gè)列表生成式的[]改成(),就創(chuàng)建了一個(gè)generator

>>> L=[x*x for x in range(10)]

>>> L

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> g=(x*x for x in range(10))

>>> g

<generator object <genexpr> at 0x00000217AB9E46D0>

generator保存的是算法收夸,每次調(diào)用next(g)阐污,就計(jì)算出g的下一個(gè)元素的值,直到計(jì)算到最后一個(gè)元素咱圆,沒(méi)有更多的元素時(shí)笛辟,拋出StopIteration的錯(cuò)誤

>>> g=(x*x for x in range(10))

>>> for n in g:

...? ? print(n)

...

0

1

4

9


16

25

36

49

64

81


斐波那契數(shù)列數(shù)列

def?fib(max):

????n,a,b=0,0,1

????while?n<max:

????????print(b)

????????a,b=b,a+b? #(b,a+b)是一個(gè)tuple

????????n=n+1

????return'done'

把print(b)改為yield b, fib函數(shù)變成generator

楊輝三角作業(yè)

def?triangles():

????L=[1]

????while?true:

????????yield?L

????????L=[1]+[L[n]+L[n+1]?for?n?in?range(len(L)-1)]+[1]


疑問(wèn)

程序?qū)懲炅耍绾屋敵鲂蛩眨坑只蛘呤钦f(shuō)不同情況下怎么輸出手幢?有何不同?


迭代器


用于for循環(huán)的數(shù)據(jù)類型:

集合數(shù)據(jù)類型:list忱详、tuple围来、dict、set、str等

generator:生成器和帶yield的generator function


可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象:Iterable

可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterable對(duì)象

>>> from collections.abc import Iterable

>>> isinstance([], Iterable)

????????True

>>> isinstance({}, Iterable)

????????True

>>> isinstance('abc', Iterable)

????????True

>>> isinstance((x for x in range(10)), Iterable)

????????True

>>> isinstance(100, Iterable)

????????False

生成器都是Iterator對(duì)象监透,但list桶错、dict、str雖然是Iterable胀蛮,卻不是Iterator院刁。

疑問(wèn)

這是因?yàn)镻ython的Iterator對(duì)象表示的是一個(gè)數(shù)據(jù)流,Iterator對(duì)象可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)數(shù)據(jù)粪狼,直到?jīng)]有數(shù)據(jù)時(shí)拋出StopIteration錯(cuò)誤退腥。可以把這個(gè)數(shù)據(jù)流看做是一個(gè)有序序列再榄,但我們卻不能提前知道序列的長(zhǎng)度狡刘,只能不斷通過(guò)next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù),所以Iterator的計(jì)算是惰性的困鸥,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算嗅蔬。(?)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疾就,一起剝皮案震驚了整個(gè)濱河市澜术,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌虐译,老刑警劉巖瘪板,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異漆诽,居然都是意外死亡侮攀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門厢拭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兰英,“玉大人,你說(shuō)我怎么就攤上這事供鸠∑杳常” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵楞捂,是天一觀的道長(zhǎng)薄坏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)寨闹,這世上最難降的妖魔是什么胶坠? 我笑而不...
    開(kāi)封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮繁堡,結(jié)果婚禮上沈善,老公的妹妹穿的比我還像新娘乡数。我一直安慰自己,他們只是感情好闻牡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布净赴。 她就那樣靜靜地躺著,像睡著了一般罩润。 火紅的嫁衣襯著肌膚如雪玖翅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天哨啃,我揣著相機(jī)與錄音烧栋,去河邊找鬼写妥。 笑死拳球,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的珍特。 我是一名探鬼主播祝峻,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扎筒!你這毒婦竟也來(lái)了莱找?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嗜桌,失蹤者是張志新(化名)和其女友劉穎奥溺,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體骨宠,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浮定,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了层亿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桦卒。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖匿又,靈堂內(nèi)的尸體忽然破棺而出方灾,到底是詐尸還是另有隱情,我是刑警寧澤碌更,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布裕偿,位于F島的核電站,受9級(jí)特大地震影響痛单,放射性物質(zhì)發(fā)生泄漏嘿棘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一桦他、第九天 我趴在偏房一處隱蔽的房頂上張望蔫巩。 院中可真熱鬧谆棱,春花似錦、人聲如沸圆仔。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坪郭。三九已至个从,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歪沃,已是汗流浹背嗦锐。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沪曙,地道東北人奕污。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像液走,于是被迫代替她去往敵國(guó)和親碳默。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 若想技術(shù)精進(jìn)缘眶,當(dāng)然得把基礎(chǔ)知識(shí)打得牢牢的嘱根。 廖雪峰的官方網(wǎng)站 python3教程,該網(wǎng)站提供的教程淺顯易懂巷懈,還附帶...
    布口袋_天晴了閱讀 450評(píng)論 0 1
  • #!/usr/bin/python # -*- coding:UTF-8 -*- __author__ = 'wx...
    __Jasmine__閱讀 295評(píng)論 0 0
  • 1该抒、切片(slice)L[0:3]表示,從索引0開(kāi)始取顶燕,直到索引3為止凑保,但不包括索引3。即索引0割岛,1愉适,2,正好是3...
    bjchenli閱讀 247評(píng)論 0 0
  • 觀其大綱 1 python基礎(chǔ) 2 函數(shù) 3 高級(jí)特性 4 函數(shù)式編程 5 模塊 6 面向?qū)ο缶幊?7 面向?qū)ο蟾?..
    周少言閱讀 1,995評(píng)論 0 0
  • 1.切片:取一個(gè)list或tuple的部分元素是非常常見(jiàn)的操作癣漆,比如說(shuō)取list中的前n個(gè)元素维咸,我們用循環(huán)來(lái)實(shí)現(xiàn)這...
    4everwrf閱讀 148評(píng)論 0 1