python基礎之三大器中迭代器和生成器

2022-08-28 17:51:11 字數 4190 閱讀 3021

可迭代物件如何轉化成迭代器,並且取值

方法一:

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...