迭代器,生成器染乌,面向過程編程

迭代器

一山孔、迭代的概念
迭代器即迭代的工具,那什么是迭代呢荷憋?
迭代是一個重復(fù)的過程台颠。每一次重復(fù)即一次迭代,并且每次迭代的結(jié)果都是下一次迭代的初始值

二勒庄、為何要有迭代你串前,什么是可迭代對象瘫里,什么是迭代器對象?
1酪呻、為何要有迭代器减宣?
對于序列類型:字符串,列表玩荠,元組漆腌,我們可以通過使用索引的方式取出其包含的元素,但是對于字典阶冈,集合闷尿,文件等類型是沒有索引的,若還想取出其內(nèi)部包含的元素女坑,則必須找出一種不依賴于索引的迭代方式填具,這就是迭代器

2、什么是可迭代對象匆骗?
可迭代對象是內(nèi)置有__iter__方法對象劳景,即obj.__iter__,如:
'hello'.__iter__
(1,2,3).__iter__
[1,2,3].__iter__
{'a':1}.__iter__
{'a','b'}.__iter__
open('a.txt').__iter__
######3.什么是迭代器對象?
可迭代對象執(zhí)行ojb.__iter__()得到的結(jié)果就是迭代器對象
而迭代器對象值得是內(nèi)置有__iter__和__next__方法的對象碉就。
文件類型是迭代器對象
open('a.txt').__iter__()
open('a.txt').__next__()

注意:迭代器對象一定是可迭代對象盟广,而可迭代對象不一定是迭代器對象。

迭代器對象的使用

dic={'a':1,'b':2,'c':3}
iter_dic=dic.__iter__() #得到迭代器對象瓮钥,迭代器對象即有__iter__又有__next__筋量,但是:迭代器.__iter__()得到的仍然是迭代器本身
iter_dic.__iter__() is iter_dic #True

print(iter_dic.__next__()) #等同于next(iter_dic)
print(iter_dic.__next__()) #等同于next(iter_dic)
print(iter_dic.__next__()) #等同于next(iter_dic)
# print(iter_dic.__next__()) #拋出異常StopIteration,或者說結(jié)束標(biāo)志

#有了迭代器碉熄,我們就可以不依賴索引迭代取值了
iter_dic=dic.__iter__()
while 1:
    try:
        k=next(iter_dic)
        print(dic[k])
    except StopIteration:
        break

for 循環(huán)

基于for循環(huán)桨武,我們可以完全不再依賴索引去取值了
dic = {'a':1,'b':2,'c':3}
for k in dic:
    print(dic[k])
for 循環(huán)的工作原理:
1、執(zhí)行in后對象的dic.__iter__()方法锈津,得到一個迭代器對象 iter_dic
2呀酸、執(zhí)行next(iter_dic),將得到的值賦給k,然后執(zhí)行循環(huán)體代碼
3琼梆、重復(fù)過程2性誉,知道捕捉到異常StopIteration,結(jié)束循環(huán)

####迭代器優(yōu)缺點

優(yōu)點:
-提供一種統(tǒng)一的叮叹,不依賴于索引的迭代方式
-惰性計算艾栋,節(jié)省內(nèi)存
缺點:
-無法獲取長度(只有在next完畢后才能知道到底有幾個值)
-一次性的,只能往后走蛉顽,不能往前進

#生成器
####什么是生成器

只要函數(shù)內(nèi)部包含有yield關(guān)鍵字蝗砾,那么函數(shù)名()的到的結(jié)果就是生成器,并且不會執(zhí)行函數(shù)內(nèi)部代碼

def func():
    print('====>first')
    yield 1
    print('====>second')
    yield 2
    print('====>third')
    yield 3
    print('====>end')

g=func()
print(g) #<generator object func at 0x0000000002184360> 

生成器應(yīng)用(send)


def eater(name):
    print('%s is about to eat'%name)
    food_list = []
    while 1:
        food = yield food_list
        print('%s has consumed %s'%(name,food))
        food_list.append(food)


g = eater('egon')

# next(g)
g.send(None)    ###必須先send一個None
g.send('banana')
g.send('apple')
g.send('watermelon')
g.send('peach')
g.send('papaya')
g.send('pear')
image.png

在執(zhí)行g(shù).next()時,Python首先會執(zhí)行g(shù)enerator()方法的yield 1 語句悼粮,由于是一個yield語句闲勺,因此此方法的執(zhí)行過程被掛起,而next方法的返回值為yield關(guān)鍵字后面表達(dá)式的值扣猫,即為1菜循。
當(dāng)調(diào)用g.send(2)方法時,Python首先會恢復(fù)generator方法的運行環(huán)境申尤。同時癌幕,將表達(dá)式(yield 1 )的返回值定義為send方法的參數(shù)的值,即為2昧穿。這樣勺远,接下來value=yield 1這一賦值語句會將value的值設(shè)置為2,繼續(xù)運行會遇到y(tǒng)ield value語句时鸵。因此胶逢,generator的方法會再次被掛起,同時饰潜,send方法的返回值也是yield關(guān)鍵字后面的表達(dá)式初坠,也是value的值,即為2.
當(dāng)調(diào)用send(3)的方法原理同上彭雾,但是generator的方法已經(jīng)執(zhí)行完畢碟刺,因此拋出StopIteration異常。

總體來說冠跷,send方法和next方法的唯一區(qū)別是執(zhí)行send方法會首先把上一次yield語句的返回值通過send的參數(shù)設(shè)定南誊,從而實現(xiàn)與生成器方法的交互身诺。但需要注意的是蜜托,在一個生成器沒有執(zhí)行next方法之前,由于沒有yield語句被掛起霉赡,所以執(zhí)行send方法會報錯橄务,所以可以先send(None).

經(jīng)典面試題


image.png

面向過程編程

定義:
面向過程編程的核心是過程二字,過程就是解決問題的步驟穴亏,即先干什么再干什么
基于面向過程設(shè)計程序就好比在設(shè)計一條流水線蜂挪,是一種機械式的思維方式

優(yōu)點:復(fù)雜的問題流程化,進而簡單化
缺點:耦合性強嗓化,因而可擴展性差棠涮,牽一發(fā)而動全身

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市刺覆,隨后出現(xiàn)的幾起案子严肪,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驳糯,死亡現(xiàn)場離奇詭異篇梭,居然都是意外死亡,警方通過查閱死者的電腦和手機酝枢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門恬偷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帘睦,你說我怎么就攤上這事袍患。” “怎么了竣付?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵协怒,是天一觀的道長。 經(jīng)常有香客問我卑笨,道長孕暇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任赤兴,我火速辦了婚禮妖滔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桶良。我一直安慰自己座舍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布陨帆。 她就那樣靜靜地躺著曲秉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疲牵。 梳的紋絲不亂的頭發(fā)上承二,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音纲爸,去河邊找鬼亥鸠。 笑死,一個胖子當(dāng)著我的面吹牛识啦,可吹牛的內(nèi)容都是我干的负蚊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颓哮,長吁一口氣:“原來是場噩夢啊……” “哼家妆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冕茅,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伤极,失蹤者是張志新(化名)和其女友劉穎腰鬼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塑荒,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡熄赡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了齿税。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彼硫。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凌箕,靈堂內(nèi)的尸體忽然破棺而出拧篮,到底是詐尸還是另有隱情,我是刑警寧澤牵舱,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布串绩,位于F島的核電站,受9級特大地震影響芜壁,放射性物質(zhì)發(fā)生泄漏礁凡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一慧妄、第九天 我趴在偏房一處隱蔽的房頂上張望顷牌。 院中可真熱鬧,春花似錦塞淹、人聲如沸窟蓝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽运挫。三九已至,卻和暖如春套耕,著一層夾襖步出監(jiān)牢的瞬間谁帕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工箍铲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雇卷,地道東北人鬓椭。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓颠猴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親小染。 傳聞我的和親對象是個殘疾皇子翘瓮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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