python 迭代器 生成器 內建函式

2022-02-20 14:09:03 字數 4684 閱讀 3904

迭代器是迭代取值的工具,迭代是乙個重複的過程,每一次重複都是基於上一次的結果而來的.

為什麼要用迭代器呢?

1.可以不依賴索引取值

2.同一時刻在記憶體中只有乙個值,不會過多的占用記憶體

如何用迭代器?

可迭代的物件:但凡內建有__iter__方法的物件都是可迭代的物件,列如str,list,dict,tuple,set,檔案物件

迭代器物件:即內建有__iter__方法又內建有__next__方法的物件稱之為迭代器物件,如檔案物件

可迭代物件.__iter__()-------->迭代器物件

迭代器物件.__tier__()-------->迭代器本身

迭代器物件.__next__()--------->迭代器的下乙個值

總結迭代器:

優點:1.可以不依賴索引取值

2.同一時刻在記憶體中只有乙個值,不會過多的占用記憶體

缺點:1.不如按照索引取值或者key取值的方式靈活

2.無法**迭代器所包含值的長度

生成器本質上就是一種自定義的迭代器

函式內包含yield關鍵字,呼叫函式不會執行函式體**,會得到乙個返回值,該返回值就是生成器物件

def

func():

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 把函式賦值給乙個變數名,這個變數名就是生成器,迭代器

print

(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。

def

is_odd(x):

return x % 2 == 1filter(is_odd, [1, 4, 6, 7, 9, 12, 17])#

[1, 7, 9, 17]

刪除 none 或者空字串:

def

is_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 再次呼叫這個函式時,一切都將從頭建立。...