day15-函數(shù)(4)迭代器和生成器

一阻荒、迭代器

常用三連

1棺弊、什么是迭代器

器>>>>工具
迭代:是一個重復(fù)的過程落包,但每次重復(fù)都是基于上一次的結(jié)果而來的

    names=["yan",'aaa','bbb']

    count = 1
    while count < len(names):
        print(names[count])
        count+=1

迭代器:就是一種不依賴于索引的取值工具

2俊啼、為何要有迭代器

特性:
1、是一種通用的迭代取值方案
2邑时、惰性計算奴紧,節(jié)省內(nèi)存

3、如何用迭代器
3.1:引入
dic = {"name": "yan", 'age': 18, 'gender': "male"}

dic_iterator = dic.__iter__()

res1 = dic_iterator.__next__()
print(res1)
res2 = dic_iterator.__next__()
print(res2)
res3 = dic_iterator.__next__()
print(res3)
# 取完值再取的話就會報一個StopIteration的錯誤
dic_iterator.__next__()  # StopIteration

# 可以使用while循環(huán)取值晶丘,利用try catch捕獲異常
while True:
    try:
        res = dic_iterator.__next__()
        print(res)
    except StopIteration:
        break
3.2:可迭代對象與迭代器對象
3.2.1 內(nèi)置有iter方法的類型稱之為:可迭代的對象/類型

1黍氮、字典dict
2、集合set
3浅浮、文件對象(也是迭代器對象)
4沫浆、字符串str
5、列表list
6滚秩、元組tuple

3.2.2 迭代器對象: 內(nèi)置有next方法专执、內(nèi)置有iter方法
dic = {"name": "yan", 'age': 18, 'gender': "male"}

dic_iterator1 = dic.__iter__()
dic_iterator1.__next__()
print(dic_iterator1.__iter__().__iter__().__iter__() is dic_iterator1)

dic_iterator2 = dic.__iter__()

3.3:for循環(huán)的工作原理

步驟1 dic_iterator = dic.iter()
步驟2 k=dic_iterator.next(),執(zhí)行循環(huán)體代碼
步驟3 循環(huán)往復(fù),直到拋出異常郁油,for循環(huán)會幫我們捕捉異常結(jié)束循環(huán)

dic = {"name": "yan", 'age': 18, 'gender': "male"}

# 使用while循環(huán)取值
dic_iterator = dic.__iter__()
while True:
    try:
        res = dic_iterator.__next__()
        print(res)
    except StopIteration:
        break
# for循環(huán)只需兩行代碼就能解決
dic = {"name": "yan", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()
for k in dic_iterator:
    print(k)


print(dic_iterator)
3.4:基于同一迭代器的重復(fù)取值
示例1:
dic = {"name": "yan", 'age': 18, 'gender': "male"}
dic_iterator = dic.__iter__()

while True:
    try:
        res = dic_iterator.__next__()
        print(res)
    except StopIteration:
        break

print('='*20)
dic_iterator = dic.__iter__()  # 第二次取值時本股,必須要重新生成迭代器才能取到值
while True:
    try:
        res = dic_iterator.__next__()
        print(res)
    except StopIteration:
        break
示例2:
dic = {"name": "yan", 'age': 18, 'gender': "male"}
for k in dic:  # dic.__iter__()
    print(k)
# 使用for循環(huán)就不需要再重新生成迭代器
for k in dic:  # dic.__iter__()
    print(k)

二、自定義迭代器

自定義迭代器來實現(xiàn)惰性計算桐腌,從而達到節(jié)省內(nèi)存的效果

1拄显、什么是生成器

但凡是函數(shù)內(nèi)出現(xiàn)了yield關(guān)鍵字,調(diào)用函數(shù)將不會執(zhí)行函數(shù)體代碼,會得到一個返回值哩掺,該返回值
就是我們自定義的迭代器凿叠,稱之為生成器

def func():
    print("hello1")
    yield 111
    print("hello2")
    yield 222
    print("hello3")
    yield 333

g = func()
print(g)  # 生成器本質(zhì)就是迭代器
res=next(g)
print(res)

res=next(g)
print(res)

res=next(g)
print(res)

next(g)
2涩笤、yield 和 return之間的比較

(1)相同點:都可以用來返回值
(2)不同點:
------------- return只能返回一次值嚼吞,函數(shù)就立即結(jié)束了
------------- yield能返回多次值,yield可以掛起函數(shù)

案例
def func():
     res=0
     while True:
         res+=1
         yield res

g=func()

for i in g:
    print(i)
總結(jié)迭代器的優(yōu)缺點

優(yōu)點:
1蹬碧、是一種通用的迭代取值方案
2舱禽、惰性計算,節(jié)省內(nèi)存
缺點:
1恩沽、取值不如索引誊稚、key的取值方式靈活
2、取值是一次性的罗心,只能往后取里伯,不能預(yù)估值的個數(shù)

自定義range
def my_range(x, y, z):
    while x < y:
        x += z
        yield x - z


g = my_range(1, 10, 3)
for i in g:
    print(i)

三、了解面向過程編程

面向過程:
核心是“過程”二字渤闷,過程指的就是做事的步驟
也就是先干什疾瓮、再干什么、后干什么飒箭。狼电。蜒灰。
基于該思想寫程序就好比設(shè)計一條條的流水線

優(yōu)點:
可以把復(fù)雜的問題流程化,進而簡單化
缺點:
牽一發(fā)而動全身肩碟,擴展性差

四强窖、生成器

1、列表生成式
l=[i**2 for i in range(5) if i > 2]
print(l)

names=['1_sb','2_sb','3_sb','4']

l=[name for name in names if name.endswith('sb')]

print(l)
2削祈、集合生成式
res={i for i in range(5)}
print(res)
3翅溺、字典生成式
res={f'k{i}': i**2 for i in range(5)}
print(res)
4、生成器表達式
res=(i for i in range(5))  # 看似是元組生成式髓抑,其實是生成器表達式
# print(res,type(res))
print(next(res))

nums=(i for i in range(200000))  # 一行代碼搞定循環(huán)取值
res=sum(nums)
print(res)


with open('a.txt', mode='rt', encoding='utf-8') as f:
    data=f.read()
    print(len(data))  

    res=0
    for line in f:
        res+=len(line)

    res = sum((len(line) for line in f))
    res = sum(len(line) for line in f)
    print(res)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末未巫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子启昧,更是在濱河造成了極大的恐慌叙凡,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件密末,死亡現(xiàn)場離奇詭異握爷,居然都是意外死亡,警方通過查閱死者的電腦和手機严里,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門新啼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刹碾,你說我怎么就攤上這事燥撞。” “怎么了迷帜?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵物舒,是天一觀的道長。 經(jīng)常有香客問我戏锹,道長冠胯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任锦针,我火速辦了婚禮荠察,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奈搜。我一直安慰自己悉盆,他們只是感情好,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布馋吗。 她就那樣靜靜地躺著焕盟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耗美。 梳的紋絲不亂的頭發(fā)上京髓,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天航缀,我揣著相機與錄音,去河邊找鬼堰怨。 笑死芥玉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的备图。 我是一名探鬼主播灿巧,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼揽涮!你這毒婦竟也來了抠藕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒋困,失蹤者是張志新(化名)和其女友劉穎盾似,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雪标,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡零院,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了村刨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片告抄。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嵌牺,靈堂內(nèi)的尸體忽然破棺而出打洼,到底是詐尸還是另有隱情,我是刑警寧澤逆粹,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布募疮,位于F島的核電站,受9級特大地震影響枯饿,放射性物質(zhì)發(fā)生泄漏酝锅。R本人自食惡果不足惜诡必,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一奢方、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爸舒,春花似錦蟋字、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涂炎,卻和暖如春忠聚,著一層夾襖步出監(jiān)牢的瞬間设哗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工两蟀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留网梢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓赂毯,卻偏偏與公主長得像战虏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子党涕,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355