Python高級(jí)特性

Python的代碼不是越復(fù)雜越好予权,而是越簡(jiǎn)單越好,開發(fā)效率越簡(jiǎn)單越高

切片

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
[L[0], L[1], L[2]]

另一種方法

L[0:3]

  • L[0:3]表示另伍,從索引0開始取,直到索引3為止绞旅,但不包括索引3摆尝。即索引0,1因悲,2堕汞,正好是3個(gè)元素。

  • 如果第一個(gè)索引是0晃琳,還可以省略:

L[:3]

  • 負(fù)數(shù)的情況

L[-2:-1]

  • tuple也是一種list讯检,唯一區(qū)別是tuple不可變。因此蝎土,
    tuple也可以用切片操作视哑,只是操作的結(jié)果仍是tuple

  • 字符串'xxx'也可以看成是一種list,每個(gè)元素就是一個(gè)字符誊涯。因此挡毅,字符串也可以用切片操作,只是操作結(jié)果仍是字符串

總結(jié):有了切片操作暴构,很多地方循環(huán)就不再需要了跪呈。Python的切片非常靈活,一行代碼就可以實(shí)現(xiàn)很多行循環(huán)才能完成的操作取逾。

迭代

在Python中耗绿,迭代是通過for ... in來完成的

  • Python的for循環(huán)抽象程度要高于Java的for循環(huán),因?yàn)镻ython的for循環(huán)不僅可以用在list或tuple上砾隅,還可以作用在其他可迭代對(duì)象上

  • Python內(nèi)置的一種數(shù)據(jù)類型是列表:list误阻。list是一種有序的集合,可以隨時(shí)添加和刪除其中的元素。

  • 默認(rèn)情況下究反,dict迭代的是key寻定。如果要迭代value,可以用for value in d.values()精耐,如果要同時(shí)迭代key和value狼速,可以用for k, v in d.items()

d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
            print(key)
  • 由于字符串也是可迭代對(duì)象,因此卦停,也可以作用于for循環(huán)
for ch in 'ABC':
              print(ch)
  • 如何判斷一個(gè)對(duì)象是可迭代對(duì)象呢向胡?方法是通過collections模塊的Iterable類型判斷
from collections import Iterable
isinstance('abc', Iterable) # str是否可迭代
  • Python內(nèi)置的enumerate函數(shù)可以把一個(gè)list變成索引-元素對(duì),這樣就可以在for循環(huán)中同時(shí)迭代索引和元素本身
for i, value in enumerate(['A', 'B', 'C']):
            print(i, value)

列表生成式

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

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

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

用兩個(gè)for實(shí)現(xiàn)全排列

  • for循環(huán)其實(shí)可以同時(shí)使用兩個(gè)甚至多個(gè)變量惊完,比如dict的items()可以同時(shí)迭代key和value
  d = {'x': 'A', 'y': 'B', 'z': 'C' }
  for k, v in d.items():
        print(k, '=', v)

生成器
受到內(nèi)存限制僵芹,列表容量肯定是有限的。而且专执,創(chuàng)建一個(gè)包含100萬(wàn)個(gè)元素的列表淮捆,不僅占用很大的存儲(chǔ)空間,如果我們僅僅需要訪問前面幾個(gè)元素本股,那后面絕大多數(shù)元素占用的空間都白白浪費(fèi)了

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

創(chuàng)建generator

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

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

  • 如果要一個(gè)一個(gè)打印出來拄显,可以通過next()函數(shù)獲得generator的下一個(gè)返回值

next(g)

  • 使用for循環(huán),因?yàn)間enerator也是可迭代對(duì)象
g = (x * x for x in range(10))
 for n in g:
         print(n)
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'
  • 這就是定義generator的另一種方法案站。如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字躬审,那么這個(gè)函數(shù)就不再是一個(gè)普通函數(shù),而是一個(gè)generator
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
  • 最難理解的就是generator和函數(shù)的執(zhí)行流程不一樣蟆盐。函數(shù)是順序執(zhí)行承边,遇到return語(yǔ)句或者最后一行函數(shù)語(yǔ)句就返回。而變成generator的函數(shù)石挂,在每次調(diào)用next()的時(shí)候執(zhí)行博助,遇到y(tǒng)ield語(yǔ)句返回,再次執(zhí)行時(shí)從上次返回的yield語(yǔ)句處繼續(xù)執(zhí)行
def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield(3)
    print('step 3')
    yield(5)
o = odd()
 next(o)
  • 同樣的痹愚,把函數(shù)改成generator后富岳,我們基本上從來不會(huì)用next()來獲取下一個(gè)返回值,而是直接使用for循環(huán)來迭代

迭代器

  • 可以直接作用于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 import Iterable
 isinstance([], Iterable)
  • 可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator。

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

from collections import Iterator
 isinstance((x for x in range(10)), Iterator)
 isinstance([], Iterator)
  • 生成器都是Iterator對(duì)象强窖,但list凸椿、dict、str雖然是Iterable翅溺,卻不是Iterator脑漫。

把list、dict咙崎、str等Iterable變成Iterator可以使用iter()函數(shù):

isinstance(iter([]), Iterator)

  • 這是因?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)度伊滋,只能不斷通過next()函數(shù)實(shí)現(xiàn)按需計(jì)算下一個(gè)數(shù)據(jù)碳却,所以Iterator的計(jì)算是惰性的,只有在需要返回下一個(gè)數(shù)據(jù)時(shí)它才會(huì)計(jì)算笑旺。

Iterator甚至可以表示一個(gè)無限大的數(shù)據(jù)流昼浦,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲(chǔ)全體自然數(shù)的筒主。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末关噪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乌妙,更是在濱河造成了極大的恐慌使兔,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藤韵,死亡現(xiàn)場(chǎng)離奇詭異虐沥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荠察,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門置蜀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悉盆,你說我怎么就攤上這事盯荤。” “怎么了焕盟?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵秋秤,是天一觀的道長(zhǎng)宏粤。 經(jīng)常有香客問我,道長(zhǎng)灼卢,這世上最難降的妖魔是什么绍哎? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鞋真,結(jié)果婚禮上崇堰,老公的妹妹穿的比我還像新娘。我一直安慰自己涩咖,他們只是感情好海诲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著檩互,像睡著了一般特幔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闸昨,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天蚯斯,我揣著相機(jī)與錄音,去河邊找鬼饵较。 笑死拍嵌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的告抄。 我是一名探鬼主播撰茎,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼打洼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逆粹,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤募疮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后僻弹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阿浓,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蹋绽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芭毙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卸耘,死狀恐怖退敦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蚣抗,我是刑警寧澤侈百,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響钝域,放射性物質(zhì)發(fā)生泄漏讽坏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一例证、第九天 我趴在偏房一處隱蔽的房頂上張望路呜。 院中可真熱鬧,春花似錦织咧、人聲如沸胀葱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巡社。三九已至,卻和暖如春手趣,著一層夾襖步出監(jiān)牢的瞬間晌该,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工绿渣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朝群,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓中符,卻偏偏與公主長(zhǎng)得像姜胖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子淀散,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 1.切片切片可以取list右莱、tuple、string的元素python語(yǔ)言中把字符串看做一個(gè)tuple档插,因此可以通...
    JEZAU閱讀 440評(píng)論 1 2
  • 1慢蜓、切片(slice)L[0:3]表示,從索引0開始取郭膛,直到索引3為止晨抡,但不包括索引3。即索引0则剃,1耘柱,2,正好是3...
    bjchenli閱讀 247評(píng)論 0 0
  • 一棍现、高級(jí)特性切片 對(duì)這種經(jīng)常取指定索引范圍的操作调煎,用循環(huán)十分繁瑣,因此轴咱,Python提供了切片(Slice)操作符...
    zzj丶閱讀 558評(píng)論 0 1
  • 概述 所說高級(jí)特性包括切片汛蝙、迭代烈涮、列表生成式、迭代器窖剑、生成器坚洽。 切片 Python學(xué)習(xí)一(基礎(chǔ))中列表和元組的基本...
    coderLZ閱讀 305評(píng)論 0 1
  • 碎片化的時(shí)代的來臨讶舰,帶來了很多的碎片化的時(shí)間,可是很多重要的事情是需要一整塊的時(shí)間去完成的需了,所以深度工作在我們當(dāng)今...
    車美美閱讀 602評(píng)論 2 3