一歇终、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ù)波附。