31 迭代器丶生成器

2022-09-03 00:54:11 字數 4189 閱讀 7009

>>> a = range(0,10)

>>> a

range(0, 10)

>>> it = iter(a) #建立迭代物件

>>> next(it) ## 輸出迭代器的下乙個元素

0>>> next(it)

1>>> for var in it: #迭代物件可以被for迴圈訪問

... print(var)

...234

5678

9

1,迭代器物件可以使用常規for語句進行遍歷:

list=[1,2,3,4]

it = iter(list) # 建立迭代器物件

for x in it:

print (x, end=" ")

執行結果:

1 2 3 4

2,也可以使用 next() 函式:

def myfor(seq):

obj = iter(seq) #obj 迭代器: 節約記憶體 抽象的

while true:

try:

var = obj.__next__()

print(var)

except stopiteration:

break

myfor('abc')

執行結果:

a

bc

cycle:           #圈性延伸

from itertools import cycle

from time import sleep

a = [1,2,3]

rt = cycle(a)

for var in rt:

sleep(0.5)

print(var)

執行結果:

無限環形迴圈123

2. count:    #線性延申的

from time import sleep

from itertools import count

rt = count(0, 2)

for var in rt:

sleep(0.5)

print(var)

if var >= 10:

break

執行結果:(步長為2無限延長)

024

6810

islice            islice(iterable, stop)         islice(iterable, start, stop[, step])

from itertools import islice

a = [1,2,3,4,5]

rt = islice(a, 3)

for var in rt:

print(var)

執行結果:

1

23

class mynumber:

def __init__(self,a):

self.a = a

def __iter__(self):

self.a = a

return self

def __next__(self):

x = self.a

self.a += 1

return x

myclass = mynumber(1)

print(next(myclass))

print(next(myclass))

print(next(myclass))

執行結果:

1

23

from time import sleep

class myiter:

def __init__(self,start,step=1):

self.value = start

self.step = step

self.next = start

def __iter__(self):

return self

def __next__(self):

self.value = self.next

self.next = self.value + self.step

return self.value

rt = myiter(0,2)

for var in rt:

sleep(0.5)

print(var)

if var >= 10:

break

執行結果:

024

6810

#斐波那契數列

import os

class fbnqsl:

def __init__(self,limit):

self.limit = limit

self.curr = 0

self.next = 1

self.value = [self.curr,self.next]

def __next__(self):

value = self.curr + self.next

if value >= self.limit:

raise stopiteration('超出上限') #丟擲異常

self.curr = self.next

self.next = value

return self.value

def __iter__(self):

return self

rt = fbnqsl(100)

for var in rt:

os.system('cls')

print(var)

執行結果:

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

以下例項使用 yield 實現斐波那契數列:

import sys 

def fibonacci(n): # 生成器函式 - 斐波那契

a, b, counter = 0, 1, 0

while true:

if counter >= n:

raise stopiteration('超出上限')

yield a

a, b = b, a + b

counter += 1

it = fibonacci(10) # it 是乙個迭代器,由生成器返回生成

for var in it:

print(var,end = ' ')

執行結果:

0 1 1 2 3 5 8 13 21 34

例項2:

from time import sleep

def pass_():

phone = 18600000000

while true:

if phone < 18600000010:

phone += 1

yield phone #返回而不終止,暫停函式

else:

return #== 手動丟擲了 stopiteration

# raise stopiteration('超出定義的上限')

rt = pass_() #for var in rt:

sleep(0.5)

print(var,end = ' ')

執行結果:

18600000001 18600000002 18600000003 18600000004 18600000005 18600000006 18600000007 18600000008 18600000009 18600000010

31 迭代器與生成器

迭代器 for list tuple dict set 1 什麼是迭代器 器 工具 count 1 while count 3 print count count 1 迭代器 就是一種不依賴於索引的取值工具 2 為何要有迭代器 特性 優點 1 是一種通用的迭代取值方案 2 惰性計算,節省記憶體 缺點...

生成器 迭代器

最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...

迭代器,生成器

迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...