迭代器是迭代取值的工具,迭代是乙個重複的過程,每一次重複都是基於上一次的結果而來的.
為什麼要用迭代器呢?
1.可以不依賴索引取值
2.同一時刻在記憶體中只有乙個值,不會過多的占用記憶體
如何用迭代器?
可迭代的物件:但凡內建有__iter__方法的物件都是可迭代的物件,列如str,list,dict,tuple,set,檔案物件
迭代器物件:即內建有__iter__方法又內建有__next__方法的物件稱之為迭代器物件,如檔案物件
可迭代物件.__iter__()-------->迭代器物件
迭代器物件.__tier__()-------->迭代器本身
迭代器物件.__next__()--------->迭代器的下乙個值
總結迭代器:
優點:1.可以不依賴索引取值
2.同一時刻在記憶體中只有乙個值,不會過多的占用記憶體
缺點:1.不如按照索引取值或者key取值的方式靈活
2.無法**迭代器所包含值的長度
生成器本質上就是一種自定義的迭代器
函式內包含yield關鍵字,呼叫函式不會執行函式體**,會得到乙個返回值,該返回值就是生成器物件
deffunc():
print('
first')
yield 1
print('
second')
yield 2
print('
third')
yield 3
print('
fourth')
g=func()
print(g) #
生成器物件
res1=next(g) #會觸發函式的執行,直到碰到乙個yield停下來,並且將yield後的值當作本次next的結果返回
print(res1)#
返回值1
自定義生成乙個和內建函式range功能一樣的生成器:
def my_range(start,stop,step=1):while start < stop: #
3 < 3
yield
start
start+=step #
start=3
obj=my_range(1,5,2) #
1 3 把函式賦值給乙個變數名,這個變數名就是生成器,迭代器
(next(obj))
print(next(obj))
了解知識點:yield的表示式形式的應用:x=yield
#def dog(name):
#print('狗哥 %s 準備開吃' %name)
#food_list=
#while true:
#food=yield food_list # food=yield='肉包子'
#print('%s 吃了 %s' %(name,food))##
g=dog('alex')
#強調:針對表示式形式的yield的使用,第一步必須讓函式先暫停到乙個yield的位置,才能進行傳值操作
#next(g) # 張開狗嘴,讓生成器先暫停到yield的位置,準備接收外部傳進來的值
#res1=next(g) #g.send(none)
#print(res1)
#res2=g.send('屎包子') # 1. 先為當前暫停位置的yield賦值 2. next(生成器)直到再次碰到乙個yield停下來,然後其的值當做本次next的結果
#print(res2)
#res3=g.send('肉包子')
#print(res3)
#res4=g.send('泔水')
#print(res4)
總結yield:只能在函式內使用
1.yield提供了一種自定義迭代器的解決方案
2.yield可以儲存函式的暫停的狀態
3.yield對比return
1.相同點:都可以返回值,返回的型別與個數都沒有限制
2.不同點:yield可以返回多次值,而return只能返回一次函式就結束了
生成器表示式:
#g = (i**2 for i in range(1,6) if i>3) 和列表表示式的區別就是"()"
all():如果裡面的物件是真的就返回真,如果為空也返回真
print(all([1,'',none]))#false
print(all([1,2,'
aaa']))#
true
print(all())#
true
print(all(''))#
true
any():有乙個為真就返回真,為空時返回假
print(any([0,'',none,false,1]))#true
print(any([0,'',none,false]))#
false
print(any())#
false
callable:判斷函式是否可呼叫
return whether the object is callable
ascii碼與數字轉換:
print(chr(65))#aprint(chr(90))#
zprint(ord('
a'))#
97print(ord('
z'))#
122
divmod(x,y):分頁
return the tuple (x//y, x%y)print(divmod(3003,20))#
(150, 3)
eval:動態地執行乙個表示式的字串,或者compile函式編譯出來的物件
print(eval('1+2+3+4'))
res=eval('
[1,2,3]')
print(res,type(res))
frozenset()返回乙個凍結的集合,集合凍結後不能再新增刪除任何元素
pow()pow(2,3,3) #(2**3)%3
reversed():反轉列表
l=[1,'a','
3',3]
l1=reversed(l)
print(list(l1))
round():取近似數
print(round(3.5))#4print(round(3.3))#
3
slice():儲存乙個切片
l=['a','
b','
c','
d','e'
]s='
helloworld
'obj=slice(1,5,2)
#print(l[1:5:2])
print(l[obj])#
['b', 'd']
zip():拉鍊函式
l=[1,2,3,4,5,6,7]s='hello
'res=zip(l,s)
print(list(res))#
[(1, 'h'), (2, 'e'), (3, 'l'), (4, 'l'), (5, 'o')]
filter():函式接收乙個函式 f 和乙個list,這個函式 f 的作用是對每個元素進行判斷,返回 true或 false,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
defis_odd(x):
return x % 2 == 1filter(is_odd, [1, 4, 6, 7, 9, 12, 17])#
[1, 7, 9, 17]
刪除 none 或者空字串:
defis_not_empty(s):
return s and len(s.strip()) >0
filter(is_not_empty, [
'test
', none, '', '
str', '
', '
end'])#
['test', 'str', 'end']
map()函式接收兩個引數,乙個是函式,乙個是序列,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的list返回。
l = [1,2,3,4,]defpow2(x):
...
return x*x
...
map(pow2,l)
#[1, 4, 9, 16]
sorted()對list、dict進行排序
l=[1,4,3,4,9,6,2]l1 =sorted(l)
print(l1)#[1, 2, 3, 4, 4, 6, 9]
Python 迭代器 生成器
可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...
python 迭代器,生成器
什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...
python 迭代器 生成器
知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...