python的高級特性

切片

  • 對于取指定索引范圍的操作,用循環(huán)十分繁瑣伤疙,因此悼吱,Python提供了切片(Slice)操作符慎框,能大大簡化這種操作。
lit = ['jack','cat',8,'tom'];
x=lit[0:3];
y=lit[-2:-1]
z=lit[:]
print(x);
print(y);
print(z);

輸出:

======================= RESTART: D:/pythonTest/def.py =======================
['jack', 'cat', 8]
[8]
['jack', 'cat', 8, 'tom']
  • 由于String也可以看作一種List后添,所以自然也可以用切片的形式取出某段字符串
str="i love u";
print(str[2:6]);
======================= RESTART: D:/pythonTest/def.py =======================
love
  • 同時支持隔幾個數(shù)取一個數(shù)
L=list(range(100));
#前十個數(shù)笨枯,隔2取1
print(L[:10:2]);
#所以數(shù),隔5取1
print(L[::5])
======================= RESTART: D:/pythonTest/def.py =======================
[0, 2, 4, 6, 8]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

迭代(Iteration)

  • 在Python中遇西,迭代是通過for ... in來完成的
  • Python的for循環(huán)不僅可以用在list或tuple上馅精,還可以作用在其他可迭代對象上。list這種數(shù)據(jù)類型雖然有下標(biāo)粱檀,但很多其他數(shù)據(jù)類型是沒有下標(biāo)的洲敢,但是,只要是可迭代對象茄蚯,無論有無下標(biāo)压彭,都可以迭代
    各種迭代類型:
L = ['a', 'b', 'c']
T = ('a', 'b', 'c')
D = {1: 'a', 2: 'b', 3: 'c'}
S = "i love u"
for l in L:
    print(l, end='')

print()

for t in T:
    print(t, end='')

print()

#迭代鍵
for key in D:
    print(key, end='')

print()

#迭代值
for value in D.values():
    print(value, end='')

print()

#迭代鍵和值
for k, v in D.items():
    print("%d" % k + ":" + v)

for s in S:
    print(s, end="")

輸出:

abc
abc
123
abc
1:a
2:b
3:c
i love u
  • 通過collections模塊的Iterable類型判斷是否可迭代
import collections
print(isinstance('abc', collections .Iterable))
print(isinstance(['a', 'b', 'c'], collections .Iterable))
print(isinstance(range(100), collections .Iterable))
================================================
True
True
True
  • Python內(nèi)置的enumerate函數(shù)可以把一個list變成索引-元素對,這樣就可以在for循環(huán)中同時迭代索引和元素本身:
for i, value in enumerate(['A', 'B', 'C']):
    print(i, value)
===========================
0 A
1 B
2 C

列表生成器

  • 列表生成式即List Comprehensions渗常,是Python內(nèi)置的非常簡單卻強(qiáng)大的可以用來創(chuàng)建list的生成式壮不。
    如生成:[1x1, 2x2, 3x3, ..., 10x10]
L = [x * x for x in range(1, 11)]
print(L)
=================================
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

for循環(huán)后面還可以加上if判斷,這樣我們就可以篩選出僅偶數(shù)的平方

L = [x * x for x in range(1, 11) if x % 2 == 0]
print(L)
================================
[4, 16, 36, 64, 100]

還可以使用兩層循環(huán)皱碘,可以生成全排列:

S = [ m + n for m in "AB" for n in "CD"]
print(S)
================================
['AC', 'AD', 'BC', 'BD']

列表生成式使用兩個變量來生成list:

D = {"x": "A", "Y": "B", "Z": "C"}
P = [k + "=" + z for k, z in D.items()]
print(P)
=================================
['x=A', 'Y=B', 'Z=C']

生成器(generator)

  • 在Python中询一,一邊循環(huán)一邊計算的機(jī)制,稱為生成器
  • generator保存的是算法癌椿,每次調(diào)用next(generator)健蕊,就計算出generator的下一個元素的值,直到計算到最后一個元素踢俄,沒有更多的元素時缩功,拋出StopIteration的錯誤。
  • 但一般用for循環(huán)來輸出其元素褪贵,這樣不用擔(dān)心StopIteration的錯誤
g = (x * x for x in range(10))
for v in g :
    print(v)
==================================
0
1
4
9
16
25
36
49
64
81
  • generator非常強(qiáng)大掂之。如果推算的算法比較復(fù)雜,用類似列表生成式的for循環(huán)無法實現(xiàn)的時候脆丁,還可以用函數(shù)來實現(xiàn)世舰。
  • 如果一個函數(shù)定義中包含yield關(guān)鍵字,那么這個函數(shù)就不再是一個普通函數(shù)槽卫,而是一個generator
  • 變成generator的函數(shù)跟压,在每次調(diào)用next()的時候執(zhí)行,遇到y(tǒng)ield語句返回歼培,再次執(zhí)行時從上次返回的yield語句處繼續(xù)執(zhí)行震蒋。
def fun ():
    print("step 1")
    yield 1
    print("step 2")
    yield 2
    print("step 3")
    yield 3

f = fun()
next(f)
next(f)
next(f)
========================
step 1
step 2
step 3
  • 捕獲StopIteration錯誤
f = fun()
while True:
    try:
        print(next(f))
    except StopIteration as e:
        print("generator end")
        break
==========================
step 1
1
step 2
2
step 3
3
generator end

迭代器

  • 可以直接作用于for循環(huán)的數(shù)據(jù)類型有以下幾種:
    a. 一類是集合數(shù)據(jù)類型,如list躲庄、tuple查剖、dict、set噪窘、str等笋庄;

    b.一類是generator,包括生成器和帶yield的generator function倔监。

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

  • 可以使用isinstance()判斷一個對象是否是Iterable對象:

>>> from collections 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
  • 生成器不但可以作用于for循環(huán),還可以被next()函數(shù)不斷調(diào)用并返回下一個值

  • 可以被next()函數(shù)調(diào)用并不斷返回下一個值的對象稱為迭代器:Iterator浩习。

  • 可以使用isinstance()判斷一個對象是否是Iterator對象:

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

生成器都是Iterator對象静暂,但list蔽莱、dict缴淋、str雖然是Iterable,卻不是Iterator见妒。

  • 把list疟赊、dict辱士、str等Iterable變成Iterator可以使用iter()函數(shù):
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
  • 為什么list、dict听绳、str等數(shù)據(jù)類型不是Iterator颂碘?
  • 這是因為Python的Iterator對象表示的是一個數(shù)據(jù)流,Iterator對象可以被next()函數(shù)調(diào)用并不斷返回下一個數(shù)據(jù)椅挣,直到?jīng)]有數(shù)據(jù)時拋出StopIteration錯誤头岔。可以把這個數(shù)據(jù)流看做是一個有序序列鼠证,但我們卻不能提前知道序列的長度峡竣,只能不斷通過next()函數(shù)實現(xiàn)按需計算下一個數(shù)據(jù),所以Iterator的計算是惰性的量九,只有在需要返回下一個數(shù)據(jù)時它才會計算适掰。
  • Iterator甚至可以表示一個無限大的數(shù)據(jù)流颂碧,例如全體自然數(shù)。而使用list是永遠(yuǎn)不可能存儲全體自然數(shù)的类浪。

總結(jié)

  • 凡是可作用于for循環(huán)的對象都是Iterable類型载城;
  • 凡是可作用于next()函數(shù)的對象都是Iterator類型,它們表示一個惰性計算的序列费就;
  • 集合數(shù)據(jù)類型如list诉瓦、dict、str等是Iterable但不是Iterator力细,不過可以通過iter()函數(shù)獲得一個Iterator對象睬澡。
  • Python的for循環(huán)本質(zhì)上就是通過不斷調(diào)用next()函數(shù)實現(xiàn)的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市眠蚂,隨后出現(xiàn)的幾起案子煞聪,更是在濱河造成了極大的恐慌,老刑警劉巖逝慧,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件米绕,死亡現(xiàn)場離奇詭異,居然都是意外死亡馋艺,警方通過查閱死者的電腦和手機(jī)栅干,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捐祠,“玉大人碱鳞,你說我怎么就攤上這事□庵” “怎么了窿给?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長率拒。 經(jīng)常有香客問我崩泡,道長,這世上最難降的妖魔是什么猬膨? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任角撞,我火速辦了婚禮,結(jié)果婚禮上勃痴,老公的妹妹穿的比我還像新娘谒所。我一直安慰自己,他們只是感情好沛申,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布劣领。 她就那樣靜靜地躺著,像睡著了一般铁材。 火紅的嫁衣襯著肌膚如雪尖淘。 梳的紋絲不亂的頭發(fā)上奕锌,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音村生,去河邊找鬼惊暴。 笑死,一個胖子當(dāng)著我的面吹牛梆造,可吹牛的內(nèi)容都是我干的缴守。 我是一名探鬼主播葬毫,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼镇辉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贴捡?” 一聲冷哼從身側(cè)響起忽肛,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烂斋,沒想到半個月后屹逛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡汛骂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年罕模,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帘瞭。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡淑掌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝶念,到底是詐尸還是另有隱情抛腕,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布媒殉,位于F島的核電站担敌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏廷蓉。R本人自食惡果不足惜全封,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望桃犬。 院中可真熱鬧售貌,春花似錦、人聲如沸疫萤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扯饶。三九已至恒削,卻和暖如春池颈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钓丰。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工躯砰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人携丁。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓琢歇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梦鉴。 傳聞我的和親對象是個殘疾皇子李茫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 切片 list切片 tuple切片 str切片 迭代 在Python中迭代是通過for ... in ...來實現(xiàn)...
    極地瑞雪閱讀 575評論 0 0
  • 1.1==,is的使用 ·is是比較兩個引用是否指向了同一個對象(引用比較)肥橙。 ·==是比較兩個對象是否相等魄宏。 1...
    TENG書閱讀 724評論 0 0
  • PYTHON-進(jìn)階-ITERTOOLS模塊小結(jié)轉(zhuǎn)自wklken:http://wklken.me/posts/20...
    C_Y_閱讀 953評論 0 2
  • Python 是一種相當(dāng)高級的語言,通過 Python 解釋器把符合語法的程序代碼轉(zhuǎn)換成 CPU 能夠執(zhí)行的機(jī)器碼...
    Python程序媛閱讀 1,891評論 0 3
  • 中午存筏,我吃飯的時候宠互,突然接到一個電話,女兒興高采烈地告訴我椭坚,她要嫁人了予跌。猛的一下,嘴里那口紅燒肉一下就卡在喉嚨里善茎,...
    半朽閱讀 800評論 26 44