迭代器和生成器 (對我來說比較難理解)

2022-04-18 20:47:32 字數 3474 閱讀 7092

特點 1.重複

#while true:

#  cmd = input('>>>: ')

#  print(cmd)

一:l = [a,b,c,d]

count = 0

while  count 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為了提供一種不依賴於索引的迭代方式,

pytho會為一些物件內建_iter_方法

obj._iter_稱為可迭代的物件

s1='hello'

l = [1,2,3]

t = (1,2,3)

set =

d =

#obj._iter_()得到的結果就是迭代器

d =

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

print(i._next_())

print(i._next_())

print(i._next_())

print(i._next_())  #stopiteration

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

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

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

2. 一次性的,只能往後走不能往前退

3. 無法獲取長度

我們知道的迭代器有兩種:一種是呼叫方法直接返回的,一種是可迭代物件通過執行iter方法得到的,迭代器有的好處是可以節省記憶體。

如果在某些情況下,我們也需要節省記憶體,就只能自己寫。我們自己寫的這個能實現迭代器功能的東西就叫生成器。

1:生成器函式: 常規函式定義,but,使用yield語句而不是return語句返回結果。yield

語句又一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下此次從它離開的地方繼續執行

2:生成器表示式:類似於列表推導,but,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表

本質:迭代器(自帶了_iter_方法和_next_方法,不需要我們去實現)

特點:惰性運算,開發者自定義

乙個包含了yield關鍵字的函式就是乙個生成器函式。yield可以為我們從函式中返回值,但是yield又不同於return,return的執行意味著程式的結束,呼叫生成器函式不會得到返回的具體的值,而是得到乙個可迭代的物件。每一次獲取這個可迭代物件的值,就能推動函式的執行,獲取新的返回值。直到函式執行結束。

import time

def genrator_fun1():

a = 1

print('現在定義了a變數')

yield a

b = 2

print('現在又定義了b變數')

yield b

g1 = genrator_fun1()

print('g1 :',g1) #列印 g1可以發現g1 就是乙個生成器

print('-'*20)

print(next(g1))

time.sleep(1) #sleep一秒看清執行過程

print(next(g1))

輸出結果:

g1 :

--------------------

現在定義了a變數

1現在又定義了b變數

2process finished with exit code 0

生成器的好處就是不會一下子在記憶體中生成太多資料

def produce():

'''生產衣服'''

for i in range(200000):

yield '生產了第%s件衣服'%i

product_g = produce()

print(product_g.__next__())#要一件衣服

print(product_g.__next__())#再要一件衣服

print(product_g.__next__())#再要一件衣服

num = 0

for i in product_g:

print(i)

num +=1

if num ==5:

break

#到這裡我們找工廠拿了8件衣服,我一共讓我的生產函式(也就是produce生成器函式)生產2000000件衣服。

#剩下的還有很多衣服,我們可以一直拿,也可以放著等想拿的時候再拿

#生成器監聽文字輸入的例子

import time

def tail(filename):

f = open(filename)

f.seek(0,2) #從檔案末尾算起

while true:

line = f.readline()# 讀取檔案中新的文字行

if not line :

time.sleep(0.5)

continue

yield (line)

tail_g = tail('a')

for line in tail_g:

print(line)

'''yield的功能:

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

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

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

'''import time

def tail(filepath):

with open (filepath,encoding="utf-8") as f :

f.seek(0,2)#從末尾開始

while 1 :

line = f.readline()

if line:

#print(line,end='')

yield line

else :

time.sleep(0.5)

g = tail('檔名')

print(g)

def grep(lines,pattern):

for line in lines:

if pattern in line:

#print(line)

yield line

#for i in g :  

#print(g)

tail_g = tail('wenjianming')

#grep(tail('wenjianming'),'error')

#grep_g = grep(g,'error')

for i in grep_g :

print(i)

生成器和迭代器

可以直接作用於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...