目錄
二、生成器
三、推導式
可迭代物件:內部含有'__iter__' 方法的物件。
# 獲取乙個物件的所有方法:dir()
s1 = 'asdsad'
print(dir(s1))
print('__iter__' in dir(s1))
優點:儲存資料能直接顯示,比較直觀,
缺點:佔記憶體,不能直接取值(除去索引,key以外)
通過for迴圈取值的時候,先將可迭代物件轉換成迭代器,然後進行取值。
迭代器:內部含有'iter'方法並且含有'next'方法的物件就是迭代器。
str list tuple dict set range 檔案控制代碼 中只有檔案控制代碼是迭代器,剩下的那些資料型別都是可迭代物件。
# 可通過,下列2個print的結果都返回true時才是迭代器
l1 = [1,2,3,4]
print('__iter__' in l1 )
print('__next__' in l1)
l1 = [1, 2, 3, 4, 5, 6]
obj = l1.__iter__()
# 或者 obj=iter(l1) print(obj)
可迭代物件是不可以一直迭代取值的(除去用索引,切片以及key),轉化成迭代器就可以利用__next__()進行取值
l1 = [1, 2, 3,]
obj = l1.__iter__() # 或者 iter(l1)
# print(obj) # 返回乙個位址
ret = obj.__next__()
print(ret)
ret = obj.__next__()
print(ret)
ret = obj.__next__()
print(ret)
ret = obj.__next__() # stopiteration
迭代器利用next取值,乙個next對應乙個值,如果迭代器裡的值取完了,還要next就會報stopiteration錯誤。
l1 = [1, 2, 3, 4, 5]
# 1 將可迭代物件轉化成迭代器
obj = iter(l1)
# 2,利用while迴圈,next進行取值
while 1:
# 3,利用異常處理終止迴圈
try:
print(next(obj))
except stopiteration:
break
迭代器的優點:
迭代器缺點:
生成器本質就是迭代器,不同的是迭代器是python提供的,生成器要自己寫。
構造生成器的三種方式:
生成器函式:
return和yield的區別
def get_func():
li =
for i in range(1, 5001):
# 節省記憶體
def get_func():
for i in range(1, 5001):
yield f''
ret = get_func()
for i in range(222):
print(next(ret))
# 把列表變成迭代器
def func():
l1 = [1, 2, 3, 4, 5]
yield from l1 # 將l1變成了迭代器
ret1 = func()
print(next(ret1))
print(next(ret1))
yield from的簡單應用:他後面可以加可迭代物件也可以是迭代器或生成器。
# 使用yield
s1 = 'an'
li = [1,2,3,4]
dic =
dict1 =
def get_yield(*args):
for item in args:
for i in item:
yield i
print(list(get_yield(s1, li, dic)))
# ['a', 'n', 1, 2, 3, 4, 'name', 'age']
# 使用yield from
這裡的g1和g2是空的。
def func():
print(111)
yield 222
g = func() # 生成器
g1 = (i for i in g)
g2 = (i for i in g1)
print(list(g)) # 回取出func中的資料,列印111,獲取222
print(list(g1)) # 獲取g1的資料,g1的資料**是g,但是g已經取完了,g1也就沒有資料了
print(list(g2)) # 和g1同理
生成器函式() -->返回的是乙個位址
# 列表推導式習題
# 求(x,y)其中x是0-5之間的偶數,y是0-5之間的奇數組成的元祖列表
# 輸出[(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]
# print([(x, y) for x in range(0,6,2) for y in range(1,6,2)])
優點:
# 迴圈模式
l1 = [i for i in rang(1, 11)]
l2 = [i**2 for i in range(10)]
# 篩選模式
# 30以內的被3整除
# print([i for i in range(0, 31) if i%3 == 0])
# 過濾掉長度小於3的字串列表,並將剩下的轉換成大寫字母
l1 = ['barry', 'ab', 'an', 'qwers', 'qwepopo']
# print([i.upper() for i in l1 if len(i) >= 3 ])
與列表推導式的寫法幾乎一模一樣,也有篩選模式,迴圈模式,多層迴圈構建。寫法上只有乙個不同:
換成 ()
列表的推導式和生成器的區別
生成器表示式和列表推導式的區別:
字典推導式
lst1 = ['an','bn','cn']
lst2 = ['aa','bb','cc']
dic =
print(dic) # -->
集合推導式
lst = [1,2,3,4,5,6,7]
s =
print(s)
集合推導式可以幫我們直接生成乙個集合,集合的特點;無序,不重複 所以集合推導式自帶去重功能 生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...
生成器和迭代器
1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...