特點 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 timeg1 :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))
輸出結果:
--------------------
現在定義了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...