可迭代物件如何轉化成迭代器,並且取值
方法一:
lst = [1,2,3,4]
l = lst.__iter__()
print(1.__next__()) #1
print(1.__next__()) #2
print(1.__next__()) #3
print(1.__next__()) #4
方法二lst = [1,2,3,4]
l = iter(lst)
print(next(l)) #1
print(next(l)) #2
print(next(l)) #3
print(next(l)) #4 #推薦
python2 和python3
py2沒有__iter__() 有iter()
py3 有__iter__() 有iter()
可迭代物件優點和缺點:
#優點
1.使用靈活(每個可迭代物件都有自己的方法)
2.能夠直接檢視元素的個數
#缺點 佔記憶體
應用:記憶體空間大,當資料量比較少,建議使用可迭代物件
迭代器的優缺點及應用
#具有__iter__()和__next__()方法就是乙個迭代器
#優點 節省記憶體
#缺點 1 只能向乙個方向執行,不能退回
2 一次性的
3 不能靈活操作,不能直接看元素的個數
代器)。
時間換空間:迭代器,生成器,用大量的時間來節省空間
lst = [1,2,3,4]
l = iter(lst)
#print(l) 輸出結果是迭代器的記憶體位址 for i in l:# for迴圈可以直接去迴圈迭代器
print(i)
迭代器也是乙個可迭代物件
生成器的目的:不在通過資料轉換實現,而是通過**編寫實現
生成器的定義:
1.基於函式實現的生成器
2.表示式實現生成器
這是乙個函式
def func():
print(1)
return 5
print(func()) 這是乙個函式
這是乙個生成器
def func():
print(1)
yield 5
print(func()) 建立乙個生成器物件
表示式形式的生成器
gen = (i**2 for i in range(10))
print(next(gen))
部落格推導式那裡細講
函式print(func()) 得到的是return返回的值,而生成器print(fun()) 得到的是生成器物件的記憶體位址
補充執行**情況
# def func():
# print(foo) 報錯
# func()
# def func():
# print(foo) 不報錯
因為計算機在檢視**時候會進行 1 語法分析 2詞法分析 第乙個是語法沒有錯,foo沒有定義,但是他呼叫了,語法分析時沒有問題,但是執行呼叫使用詞法分析就
會報錯第二個雖然沒定義foo 但是語法沒有錯誤,詞法錯誤,但是函式體沒有呼叫,故不會報錯
生成器怎麼用:
特點:惰性機制
yield 和 return部分功能很像
def func( ):
yield 1 #記錄執行位置的
yield 2
yield 3
g = func() #獲取的是生成器的記憶體位址
print(next(g)) #1
print(next(g)) #2
print(next(g)) #3 惰性機制,不next 不往下執行
def func():
yield 1
yield 2
yield 3
g =func()
g1 =func()
g2= func()
print(g,g1,g2) 輸出三個只不過後邊的位址不一樣,說明建立了三個生成器
def func():
yield
print(func().__next__()) none #得到是yield 返回的none
def func():
yield [1,2,3,4,5]
print(func().__next__(),type(func().__next__()))
得到的是[1,2,3,4,5] 型別是list
def func(): !!!!!這個有意思 結果是 1 none def foo():
print(1)
yield foo
g = func().__next__()
print(g(),type(g))
def func():
yield 1,2,3,4,5
print(123)
yield 111
g = func()
print(next(g))
print(next(g))
輸出結果(1,2,3,4,5) 123 111 yield惰性 next往下走
yield from
def func():
yield [1,2,23,54,2] #將列表整體返回
yield from [1,2,23,54,5] #將列表中的元素逐個返回
g = func()
print(next(g)) [1,2,23,54,2]
print(next(g)) 1
print(next(g)) 2
print(next(g)) 23
print(next(g)) 54
print(next(g)) 5
總結:
在我理解就是生成器就是人造的迭代器,通過next取值,用時間換空間!
生成器一定是乙個迭代器,但是迭代器不一定是乙個生成器
怎麼觸發生成器
遇見for 迴圈迭代時觸發
迭代器和生成器的優點:
節省記憶體
迭代器和生成器的缺點
1.不能直接使用元素
2.不能直觀檢視元素的個數
3.使用不靈活
4.稍微消耗時間
5.一次性的,不能逆行
當資料量特別大的時候,一定要記得用生成器
區分迭代器和生成器:
lst = [1,2,3]
print(lst.__iter__())
def func():
yield 1
print(func())
# 看記憶體位址 結果會顯示iterator是迭代器 generator是生成器
yeild
return一般在函式中只設定乙個,他的作用是終止函式,並且給函式的執行者返回值。
yield在生成器函式中可設定多個,他並不會終止函式,next會獲取對應yield生成的元素。
可迭代物件:
具有__iter__()方法的就是乙個可迭代物件
迭代器:
具有__iter__()和__next__()方法就是乙個迭代器
生成器:
基於函式建立的生成器,函式體中必須存在yield
python三大器之迭代器
python中的三大器有迭代器,生成器,裝飾器,本文重點講解下迭代器 迭代器 具備了 next 和 iter 方法的物件 可迭代物件 具備了 iter 方法的物件 1.可迭代物件,可以通過for.in.這類語句迭代讀取一條資料供我們使用的物件稱之為可迭代物件 iterable 可以通過isinsta...
Python三大器之生成器
python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...
python基礎之三
import module name 直接匯入 module name.func 呼叫函式時,需要模組名作為字首 from module name import function name 不用使用模組名作為字首 from module name import 匯入模組下的所有函式和類注 pytho...