Python基礎(8)迭代器 生成器

2022-09-07 08:15:08 字數 4037 閱讀 5593

一 什麼是迭代

1 重複

# while true:

# cmd=input('>>: ')

# print(cmd)

# l=['a','b','c','d']

# count=0

# while count < len(l):

# print(l[count])

# count+=1

## l=['a','b','c','d']

# for count in range(len(l)):

# print(l[count])

# d=

## for k in d:

# print(k)

python為了提供一種不依賴於索引的迭代方式,

python會為一些物件內建__iter__方法

obj.__iter__稱為可迭代的物件

二 可迭代物件:obj.__iter__

三 迭代器:iter1=obj.__iter__()

1 iter1.__next__

2 iter1.__iter__ 

iter1.__next__()

迭代器的優點

1:提供了一種不依賴於索引的取值方式

2:惰性計算。節省記憶體

迭代器的缺點:

1:取值不如按照索引取值方便

2:一次性的。只能往後走不能往前退

3:無法獲取長度

l=[1,2,3]

for item in l: #i=l.__iter__()

print(item)

l=['x','y','z']

# print(l[2])

# print(l[0])

# i=l.__iter__()

# print(i.__next__())

# print(i.__next__())

# print(i.__next__())

#得到的迭代器:既有__iter__又有乙個__next__方法

# d=

## i=d.__iter__() #i叫迭代器

iterator判斷是否為迭代器物件

iterabl判斷是否為可迭代物件

迭代物件需要.__iter__()轉換成迭代器,才能迭代

迭代器物件可以直接迭代

迭代器的應用:

1 提供了一種不依賴索引的統一的迭代方法

2 惰性計算,比如取檔案的每一行

四、生成器

1、生成器函式:函式體內包含有yield關鍵字,該函式執行的結果是生成器

2、生成器就是迭代器

# print(g.__next__())

# print(g.__next__())

# print(g.__next__())

# print(g.__next__())

# for i in g: #obj=g.__iter__() #obj.__next__()

# print(i)

3、yield的功能:

1.與return類似,都可以返回值,但不一樣的地方在於yield返回多次值,而return只能返回一次值

2.為函式封裝好了__iter__和__next__方法,把函式的執行結果做成了迭代器

3.遵循迭代器的取值方式obj.__next__(),觸發的函式的執行,函式暫停與再繼續的狀態都是由yield儲存的

def countdown(n):

print('starting countdown')

while n > 0:

yield n

n-=1

print('stop countdown')

g=countdown(5)

# print(g)

# print(g.__next__())

# print(g.__next__())

# print(g.__next__())

# print(g.__next__())

# print(g.__next__())

# print(g.__next__())

## for i in g:

# print(i)

例題:

#1 編寫 tail -f a.txt |grep 'error' |grep '404'命令

import time

def tail(filepath,encoding='utf-8'):

with open(filepath,encoding=encoding) as f:

f.seek(0,2)

while true:

line=f.readline()

if line:

yield line

else:

time.sleep(0.5)

def grep(lines,pattern):

for line in lines:

if pattern in line:

#print(line)

yield line

g1=tail('a.txt')

g2=grep(g1,'error')

g3=grep(g2,'404')

for i in g3:

print(i)

總結:2.可迭代物件:實現了迭代器協議的物件(如何實現:物件內部定義乙個__iter__()方法)

3.協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(如for迴圈,sum,min,max函式等)使用迭代器協議訪問物件。

4.for迴圈的本質:迴圈所有物件,全都是使用迭代器協議。

5.(字串,列表,元組,字典,集合,檔案物件)這些都不是可迭代物件,只不過在for迴圈式,呼叫了他們內部的__iter__方法,把他們變成了可迭代物件

然後for迴圈呼叫可迭代物件的__next__方法去取值,而且for迴圈會捕捉stopiteration異常,以終止迭代

6.生成器:可以理解為一種資料型別,這種資料型別自動實現了迭代器協議(其他的資料型別需要呼叫自己內建的__iter__方法),所以生成器就是可迭代物件

7.可以理解為一種資料型別,這種資料型別自動實現了迭代器協議(其他的資料型別需要呼叫自己內建的__iter__方法),所以生成器就是可迭代物件

8.為何使用生成器之生成器的優點

python使用生成器對延遲操作提供了支援。所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生結果。這也是生成器的主要好處。

9.生成器小結:

1).是可迭代物件

2).實現了延遲計算,省記憶體啊

3).生成器本質和其他的資料型別一樣,都是實現了迭代器協議,只不過生成器附加了乙個延遲計算省記憶體的好處,其餘的可迭代物件可沒有這點好處

python 入門8 迭代器 生成器

迭代器 迭代器從表面上看是乙個數,當時用其中的資料時,每次從資料流中取乙個資料。直到資料被取完,而且資料不會被重複使用。從 迭代器是實現了迭代器協議方法的物件或類。迭代器協議方法主要是兩個 自定義迭代器 要定義乙個迭代器,只要定義乙個實現迭代器協議方法的類即可。例子 class myiterator...

8 迭代器和生成器

iterable 可迭代 中有 iter 而iterator迭代器 繼承類iterable 並有魔法方法 next from collections.abc import iterable,iterator a 1,2 print isinstance a,iterable a是可迭代的 true ...

Python 迭代器 生成器

可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...