2019-11-14 Python

一歇终、36_1迭代器

# (答辯題):

# 迭代器可以實(shí)現(xiàn)for循環(huán),能夠取出里邊遍歷的每一個(gè)數(shù)據(jù)

# 它里邊存的不是生成序列的結(jié)果,而是生成序列的方式

# 占用空間特別小

for tempin [11,22,33]:

print(temp)

for tempin "abcdef":

print(temp)

# 數(shù)字類型不可以迭代

# for temp in 100:

#? print(temp)

# iterable:可迭代

# 判斷可否迭代的代碼

from collectionsimport Iterable

print(isinstance("abc", Iterable))# True

print(isinstance(100, Iterable))# False

print(isinstance([11,22,33], Iterable))# True

print(isinstance((11,22,33), Iterable))# True

二、36_2自己實(shí)現(xiàn)一個(gè)可以迭代的對(duì)象

from collectionsimport Iterable

from collectionsimport Iterator

import time

"""

1杠愧、判斷xxx_obj是否是可以迭代

看xxx_obj看對(duì)象的類中是否有_iter_方法

2、在第一步成立的前提下,調(diào)用iter函數(shù),得到xxx_obj對(duì)象的_iter_方法的返回值

調(diào)用iter函數(shù)會(huì)自動(dòng)調(diào)用_iter_方法

3焕济、_iter_方法的返回值是一個(gè)迭代器_next_方法,調(diào)一次取一個(gè)賦給temp

for temp in xxx_obj:

pass

"""

class Classmate(object):

def __init__(self):

self.names =list()

self.current_num =0

? ? def add(self, name):

self.names.append(name)

def __iter__(self):

"""如果想要一個(gè)對(duì)象成為一個(gè)可以迭代的對(duì)象(即可以使用for)

那么必須實(shí)現(xiàn)_iter_方法"""

? ? ? ? # return ClassIterator(self)

? ? ? ? return self

? ? def __next__(self):

if self.current_num

ret =self.names[self.current_num]

self.current_num +=1

? ? ? ? ? ? return ret

else:

raise StopIteration

# class ClassIterator(object):

#? ? def _init_(self, obj):

#? ? ? ? self.obj = obj

#? ? ? ? self.current_num = 0

#

#? ? def _iter_(self):

#? ? ? ? pass

#

#? ? def _next_(self):

#? ? ? ? if self.current_num < len(self.current_num):

#? ? ? ? ? ? ret = self.obj.names[self.current_num]

#? ? ? ? ? ? self.current_num += 1

#? ? ? ? ? ? return ret

#? ? ? ? else:

#? ? ? ? ? ? raise StopAsyncIteration

classmate = Classmate()

classmate.add("張三")

classmate.add("王二")

classmate.add("老王")

# print("判斷classmate是否是可以迭代的對(duì)象:", isinstance(classmate, Iterable))

# classmate_iterator = iter(classmate)

# print("判斷classmate_iterator是否是迭代器:", isinstance(classmate_iterator, Iterable))

# print(next(classmate_iterator))

for namein classmate:

print(name)

time.sleep(1)

三盔几、37_斐波那契數(shù)列

"""

a = 0

b = 1

print(a)

a, b = b, a+b? # (1, 0+1)

print(a)

a, b = b, a+b? # (1, 0+1)

print(a)

a, b = b, a+b? # (1, 0+1)

print(a)

"""

"""fibonaqi:斐波那契數(shù)列"""

"""方法一、"""

# nums = list()

# a = 0

# b = 1

#

# i = 0

# while i < 10:

#? ? nums.append(a)

#? ? a, b = b, a+b

#? ? i += 1

#

# for num in nums:

#? ? print(num)

"""方法二"""

class Fibonacci(object):

"""初始化"""

? ? def __init__(self, all_num):

self.all_num =? all_num

"""當(dāng)前的索引"""

? ? ? ? self.current_num =0

? ? ? ? self.a =0

? ? ? ? self.b =1

? ? """可迭代"""

? ? def __iter__(self):

return self

? ? """迭代函數(shù)"""

? ? def __next__(self):

if self.current_num

ret =self.a

self.a, self.b =self.b, self.a+self.b

self.current_num +=1

? ? ? ? ? ? return ret

else:

raise StopIteration

fibo = Fibonacci(10)

for numin fibo:

print(num)

四掩幢、迭代器的其它作用

"""

9逊拍、并不是只有for循環(huán)能接收可迭代對(duì)象,除了for

循環(huán)能接收可迭代對(duì)象,list、tuple等也能接收

li = list(FibIterator(15))

print(li)

tp = tuple(FibIterator(6))

print(tp)

"""

a = (11,22,33)

"""把元組轉(zhuǎn)為列表"""

"""重新生成一個(gè)新列表,把數(shù)據(jù)遍歷迭代存入"""

print(list(a))#[11, 22, 33]

"""

1际邻、重新生成一個(gè)空列表

2芯丧、調(diào)用里邊的迭代器,a有一個(gè)迭代對(duì)象

3、list函數(shù)就找到了里邊的迭代器

4世曾、通過__next__方法取元組里的每一個(gè)值

5缨恒、每取到一個(gè)值,通過append方式,

* 放到那個(gè)新生成的空列表里

6、不能迭代會(huì)生成并拋出一個(gè)異常,

* 但list函數(shù)會(huì)自動(dòng)處理異常

"""

五轮听、39_生成器

"""生成器是一個(gè)特殊的迭代器"""

"""

創(chuàng)建生成器方法一骗露、

*把一個(gè)列表生成式的[]改成()

"""

# nums = [x*2 for x in range(10)]

# print(nums)

#

# nums = (x*2 for x in range(10))

# print(nums)

#

# for num in nums:

#? ? print(num)

"""

創(chuàng)建生成器方法二、

!!!如果一個(gè)函數(shù)里有yield語句

,那么這個(gè)函數(shù)就變?yōu)樯善鞯哪0?!!

"""

"""使用生成器執(zhí)行fibonaqi數(shù)列"""

def creatr_num(all_num):

print('---1---')

# a = 0

# b = 1

? ? a, b =0, 1

? ? """當(dāng)前索引"""

? ? current_num =0

? ? while current_num < all_num:

print('---2---')

# print(a)

? ? ? ? yield a

print('---3---')

a, b = b, a+b

current_num +=1

? ? ? ? print('---4---')

# creatr_num(10)

"""!!!函數(shù)里有yield,它的(調(diào)用函數(shù))

,變?yōu)閯?chuàng)建一個(gè)生成器的對(duì)象!!!"""

obj = creatr_num(10)

"""希望創(chuàng)建多個(gè)生成器的對(duì)象"""

obj2 = creatr_num(2)

# for num in obj:

#? ? print(num)

ret =next(obj)

print("obj:", ret)

ret =next(obj)

print("obj:", ret)

ret =next(obj2)

print("!!!obj2!!!:", ret)

ret =next(obj)

print("obj:", ret)

ret =next(obj)

print("obj:", ret)

ret =next(obj)

print("obj:", ret)

ret =next(obj2)

print("!!!obj2!!!:", ret)

ret =next(obj2)

print("!!!obj2!!!:", ret)

六血巍、40_1通過異常判斷生成器已經(jīng)結(jié)束

"""

創(chuàng)建生成器方法二萧锉、

!!!如果一個(gè)函數(shù)里有yield語句

,那么這個(gè)函數(shù)就變?yōu)樯善鞯哪0?!!

"""

"""使用生成器執(zhí)行fibonaqi數(shù)列"""

def creatr_num(all_num):

# a = 0

# b = 1

? ? a, b =0, 1

? ? """當(dāng)前索引"""

? ? current_num =0

? ? while current_num < all_num:

# print(a)

? ? ? ? yield a

a, b = b, a+b

current_num +=1

? ? """【return:返回】"""

? ? return "ok!"

# creatr_num(10)

"""!!!函數(shù)里有yield,它的(調(diào)用函數(shù))

,變?yōu)閯?chuàng)建一個(gè)生成器的對(duì)象!!!"""

obj2 = creatr_num(2)

"""希望創(chuàng)建多個(gè)生成器的對(duì)象"""

# for num in obj:

#? ? print(num)

while True:

try:

ret =next(obj2)

print("!!!obj2!!!:", ret)

except Exception as ret:

"""打印0k"""

? ? ? ? print(ret.value)

break

七、40_2通過send喚醒生成器

"""使用生成器執(zhí)行fibonaqi數(shù)列"""

def creatr_num(all_num):

a, b =0, 1

? ? """當(dāng)前索引"""

? ? current_num =0

? ? while current_num < all_num:

ret =yield a

print(">>>ret>>>", ret)

a, b = b, a+b

current_num +=1

# creatr_num(10)

"""!!!函數(shù)里有yield,它的(調(diào)用函數(shù))

,變?yōu)閯?chuàng)建一個(gè)生成器的對(duì)象!!!"""

obj = creatr_num(10)

"""希望創(chuàng)建多個(gè)生成器的對(duì)象"""

# for num in obj:

#? ? print(num)

"""send一般不要放到最前面"""

# obj.send("hehehe")

# obj = send(None)

ret =next(obj)

print(ret)

ret = obj.send(3)

print(ret)

八述寡、41_使用yield完成多任務(wù)

"""生成器實(shí)現(xiàn)多任務(wù):!!!重點(diǎn)!!!"""

import time

def task_1():

while True:

print('---1---')

time.sleep(0.1)

"""yield:回到next"""

? ? ? ? yield

def task_2():

while True:

print('---2---')

time.sleep(0.1)

yield

def main():

"""此時(shí)是創(chuàng)建生成器"""

? ? t1 = task_1()

t2 = task_2()

while True:

next(t1)

next(t2)

if __name__ =="__main__":

main()

九柿隙、迭代器_生成器

迭代器: 減少內(nèi)存空間,實(shí)現(xiàn)循環(huán)鲫凶。

生成器: 讓一個(gè)函數(shù) (暫停執(zhí)行)禀崖,想繼續(xù)執(zhí)行

可以調(diào)用next或send。

迭代器和生成器保存的都是生成數(shù)據(jù)的代碼螟炫,

而不是具體的數(shù)據(jù)波附。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市不恭,隨后出現(xiàn)的幾起案子叶雹,更是在濱河造成了極大的恐慌,老刑警劉巖换吧,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件折晦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沾瓦,警方通過查閱死者的電腦和手機(jī)满着,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門谦炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人风喇,你說我怎么就攤上這事宁改。” “怎么了魂莫?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵还蹲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我耙考,道長(zhǎng)谜喊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任倦始,我火速辦了婚禮斗遏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鞋邑。我一直安慰自己诵次,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布枚碗。 她就那樣靜靜地躺著逾一,像睡著了一般。 火紅的嫁衣襯著肌膚如雪视译。 梳的紋絲不亂的頭發(fā)上嬉荆,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音酷含,去河邊找鬼鄙早。 笑死,一個(gè)胖子當(dāng)著我的面吹牛椅亚,可吹牛的內(nèi)容都是我干的限番。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呀舔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼弥虐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媚赖,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤霜瘪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惧磺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颖对,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年磨隘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缤底。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顾患。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖个唧,靈堂內(nèi)的尸體忽然破棺而出江解,到底是詐尸還是另有隱情,我是刑警寧澤徙歼,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布犁河,位于F島的核電站,受9級(jí)特大地震影響魄梯,放射性物質(zhì)發(fā)生泄漏呼股。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一画恰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吸奴,春花似錦允扇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至读处,卻和暖如春糊治,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罚舱。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工爆阶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捌省,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像理盆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垛玻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355