Python的高級(jí)特性

切片

In [3]: l = list(range(100))

#取前5個(gè)元素
In [4]: l[:5]
Out[4]: [0, 1, 2, 3, 4]

#取后5個(gè)元素
In [5]: l[-5:]
Out[5]: [95, 96, 97, 98, 99]

#取第11-20的元素
In [6]: l[11:20]
Out[6]: [11, 12, 13, 14, 15, 16, 17, 18, 19]

#取前10個(gè)元素变抽,每2個(gè)取一個(gè)
In [7]: l[:10:2]
Out[7]: [0, 2, 4, 6, 8]

#取第1-10的元素,每2個(gè)取一個(gè)
In [8]: l[1:10:2]
Out[8]: [1, 3, 5, 7, 9]

#取全部的元素束昵,每10個(gè)取一個(gè)
In [9]: l[::10]
Out[9]: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

#取得全部元素
In [10]: l[:]

#記住最后一個(gè)元素的索引是-1
In [11]: l[-1]
Out[11]: 99

list切片

In [1]: l = ['apple', 'google', 'facebook', 'microsoft', 'linkin']

In [2]: l
Out[2]: ['apple', 'google', 'facebook', 'microsoft', 'linkin']

In [3]: l[0:3]
Out[3]: ['apple', 'google', 'facebook']

In [4]: l[:3]
Out[4]: ['apple', 'google', 'facebook']

In [5]: l[1:3]
Out[5]: ['google', 'facebook']

In [6]: l[-2:]
Out[6]: ['microsoft', 'linkin']

In [7]: l[-2:-1]
Out[7]: ['microsoft']

tuple切片

In [13]: (0, 1, 2, 3, 4, 5)[:3]
Out[13]: (0, 1, 2)

str切片

In [14]: 'apple'[:3]
Out[14]: 'app'

迭代

在Python中迭代是通過for ... in ...來實(shí)現(xiàn)的

In [15]: d = {'apple':'pages', 'google':'docs', 'microsoft':'word'}

In [16]: for key in d:
   ....:     print key
   ....:     
google
apple
microsoft

In [17]: for value in d.values():
   ....:     print value
   ....:     
docs
pages
word

In [18]: for k, v in d.items():
   ....:     print k,v
   ....:     
google docs
apple pages
microsoft word

列表、元組醒颖、字典和字符串都是可迭代對(duì)象
判斷一個(gè)對(duì)象是否是可迭代對(duì)象妻怎,通過collections模塊的Iterable來判斷

In [22]: from collections import Iterable

In [23]: isinstance('123', Iterable)
Out[23]: True

In [24]: isinstance([1, 2, 3], Iterable)
Out[24]: True

In [25]: isinstance((1, 2, 3), Iterable)
Out[25]: True

In [26]: isinstance({'a':1, 'b':2, 'c':3}, Iterable)
Out[26]: True

enumerate

Python內(nèi)置的enumerate函數(shù)可以把一個(gè)list變成索引-元素對(duì),這樣就可以在for循環(huán)中同時(shí)迭代索引和元素本身

In [27]: for i, value in enumerate(['A', 'B', 'C']):
   ....:     print(i, value)
   ....:    
(0, 'A')
(1, 'B')
(2, 'C')

列表生成式

列表生成式有自己的特殊語(yǔ)法
把要生成的元素放到最前面泞歉,后跟for循環(huán)逼侦,就可以創(chuàng)建一個(gè)list

n [29]: [i * i for i in range(1,10)]
Out[29]: [1, 4, 9, 16, 25, 36, 49, 64, 81]

#二層循環(huán)實(shí)現(xiàn)全排列
In [30]: [m + n for m in 'ABC' for n in 'XYZ']
Out[30]: ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

#列出根目錄下的所有文件和文件夾
In [37]: [f for f in os.listdir('/')]
Out[37]: 
['.autorelabel',
 'lib',
 'sbin',
 'proc',
 'dev',
 'lib64',
 'mnt',
 'usr',
 'etc',
 'var',
 'selinux',
 '.autofsck',
 'sys',
 'srv',
 'media',
 'tmp',
 'data',
 'boot',
 'lost+found',
 'home',
 'root',
 'opt',
 'bin']

#列表生成式使用兩個(gè)變量來生成列表
In [38]: d
Out[38]: {'apple': 'pages', 'google': 'docs', 'microsoft': 'word'}

In [39]: [k + '-->' + v for k,v in d.items()]
Out[39]: ['google-->docs', 'apple-->pages', 'microsoft-->word']

#將列表中的元素全部轉(zhuǎn)為小寫或大寫
In [42]: l = ['apple', 'google', 'facebook']

In [43]: [s.lower() for s in l]
Out[43]: ['apple', 'google', 'facebook']

In [44]: [s.upper() for s in l]
Out[44]: ['APPLE', 'GOOGLE', 'FACEBOOK']

In [45]: l.append(59)

In [46]: l
Out[46]: ['apple', 'google', 'facebook', 59]

In [47]: [s.upper() for s in l]
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-47-0e109a4f23f3> in <module>()
----> 1 [s.upper() for s in l]

AttributeError: 'int' object has no attribute 'upper'

#上面遇到列表中出現(xiàn)字符串和數(shù)字混合的情況,數(shù)字對(duì)象沒有upper()或lower()方法
#這時(shí)需要使用判斷來排除數(shù)字的情況

In [52]: l
Out[52]: ['apple', 'google', 'facebook', 59]

In [53]: [s.upper() for s in l if isinstance(s, str)]
Out[53]: ['APPLE', 'GOOGLE', 'FACEBOOK']

生成器(yield)

生成器返回一個(gè)可迭代的對(duì)象

生成器的關(guān)鍵字yield腰耙,與return的區(qū)別是

  • return 立即返回結(jié)果并結(jié)束函數(shù)

  • yield 返回結(jié)果并暫停函數(shù)榛丢,等待next()的下一次調(diào)用

In [1]: def my_fun():
   ...:         sum = 1
   ...:         while True:
   ...:                 sum = sum + 1
   ...:                 yield sum
   ...:         

In [2]: m = my_fun()

In [3]: m.next()
Out[3]: 2

In [4]: m.next()
Out[4]: 3

In [5]: m.next()
Out[5]: 4

In [6]: m.next()
Out[6]: 5

In [7]: my_fun()
Out[7]: <generator object my_fun at 0x2767a00>

In [8]: my_fun().next()
Out[8]: 2

In [9]: my_fun().next()
Out[9]: 2

In [10]: my_fun().next()
Out[10]: 2

上面介紹的列表生成式也可以變成生成器生成式

只需把中括號(hào)換成小括號(hào)就變成了一個(gè)生成器

In [11]: L = [x * x for x in range(10)]

In [12]: L
Out[12]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

In [13]: G = (x * x for x in range(10))

In [14]: G
Out[14]: <generator object <genexpr> at 0x2767aa0>

In [15]: G.next()
Out[15]: 0

In [16]: G.next()
Out[16]: 1

In [17]: G.next()
Out[17]: 4

生成器保存的是算法,在使用時(shí)計(jì)算結(jié)果挺庞,節(jié)省內(nèi)存空間


迭代器

可以直接作用于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ì)象

In [20]: from collections import Iterable

In [21]: isinstance([],Iterable)
Out[21]: True

生成器不但可以作用于for循環(huán),還可以被next()函數(shù)不斷調(diào)用并返回下一個(gè)值掖鱼,最后拋出StopIteration異常然走,表示已經(jīng)結(jié)束,無法返回下一個(gè)值

可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器Iterator

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

In [24]: from collections import Iterator

In [25]: isinstance((x for x in range(10)), Iterator)
Out[25]: True

In [26]: isinstance([], Iterator)
Out[26]: False

Iterator 和 Iterable的區(qū)別

  • 生成器都是Iterator對(duì)象戏挡,但list dict等是Iterable芍瑞,但不是Iterator

  • Iterator是迭代器,需要同時(shí)具備__iter__next兩個(gè)方法褐墅,它們表示一個(gè)惰性計(jì)算的序列

  • Iterable是可迭代對(duì)象拆檬,列表元組等數(shù)據(jù)結(jié)構(gòu)同樣是可迭代對(duì)象,具備__iter__方法妥凳,但不具備next方法

使用for循環(huán)遍歷可迭代對(duì)象時(shí)竟贯,for循環(huán)自動(dòng)調(diào)用next()函數(shù),并在接收到結(jié)束異常時(shí)退出循環(huán)


參考文章:http://www.liaoxuefeng.com/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逝钥,一起剝皮案震驚了整個(gè)濱河市屑那,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晌缘,老刑警劉巖齐莲,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異磷箕,居然都是意外死亡选酗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門岳枷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芒填,“玉大人,你說我怎么就攤上這事空繁〉钏ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵盛泡,是天一觀的道長(zhǎng)闷祥。 經(jīng)常有香客問我,道長(zhǎng)傲诵,這世上最難降的妖魔是什么凯砍? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拴竹,結(jié)果婚禮上悟衩,老公的妹妹穿的比我還像新娘。我一直安慰自己栓拜,他們只是感情好座泳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布惠昔。 她就那樣靜靜地躺著,像睡著了一般挑势。 火紅的嫁衣襯著肌膚如雪镇防。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天薛耻,我揣著相機(jī)與錄音营罢,去河邊找鬼。 笑死饼齿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝙搔。 我是一名探鬼主播缕溉,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼吃型!你這毒婦竟也來了证鸥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤勤晚,失蹤者是張志新(化名)和其女友劉穎枉层,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赐写,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸟蜡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挺邀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揉忘。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖端铛,靈堂內(nèi)的尸體忽然破棺而出泣矛,到底是詐尸還是另有隱情,我是刑警寧澤禾蚕,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布您朽,位于F島的核電站,受9級(jí)特大地震影響换淆,放射性物質(zhì)發(fā)生泄漏哗总。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一产舞、第九天 我趴在偏房一處隱蔽的房頂上張望魂奥。 院中可真熱鬧,春花似錦易猫、人聲如沸耻煤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哈蝇。三九已至棺妓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炮赦,已是汗流浹背怜跑。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吠勘,地道東北人性芬。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像剧防,于是被迫代替她去往敵國(guó)和親植锉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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